@hyperscale0/udl 1.0.0-alpha.1
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/AUTHORS +8 -0
- package/CHANGELOG.md +36 -0
- package/LICENSE +661 -0
- package/LICENSING.md +51 -0
- package/README.md +163 -0
- package/SECURITY.md +42 -0
- package/TRADEMARKS.md +35 -0
- package/conformance/README.md +79 -0
- package/conformance/invalid/blank-title.expected.json +10 -0
- package/conformance/invalid/blank-title.udl +50 -0
- package/conformance/invalid/depth-budget.expected.json +10 -0
- package/conformance/invalid/depth-budget.udl +49 -0
- package/conformance/invalid/format-version.expected.json +10 -0
- package/conformance/invalid/format-version.udl +50 -0
- package/conformance/invalid/invalid-utf8.expected.json +10 -0
- package/conformance/invalid/invalid-utf8.udl +1 -0
- package/conformance/invalid/malformed-json.expected.json +10 -0
- package/conformance/invalid/malformed-json.udl +1 -0
- package/conformance/invalid/missing-create-verb.expected.json +10 -0
- package/conformance/invalid/missing-create-verb.udl +45 -0
- package/conformance/invalid/not-an-object.expected.json +10 -0
- package/conformance/invalid/not-an-object.udl +1 -0
- package/conformance/invalid/noun-id-not-snake-case.expected.json +10 -0
- package/conformance/invalid/noun-id-not-snake-case.udl +50 -0
- package/conformance/invalid/unknown-key.expected.json +10 -0
- package/conformance/invalid/unknown-key.udl +51 -0
- package/conformance/invalid/unreachable-state.expected.json +10 -0
- package/conformance/invalid/unreachable-state.udl +51 -0
- package/conformance/invalid/verb-without-transition.expected.json +10 -0
- package/conformance/invalid/verb-without-transition.udl +55 -0
- package/conformance/valid/cards.expected.json +5 -0
- package/conformance/valid/cards.udl +1092 -0
- package/conformance/valid/commerce-escrow.expected.json +5 -0
- package/conformance/valid/commerce-escrow.udl +1011 -0
- package/conformance/valid/hand-edited.expected.json +5 -0
- package/conformance/valid/hand-edited.udl +1 -0
- package/conformance/valid/insured-car-marketplace.expected.json +5 -0
- package/conformance/valid/insured-car-marketplace.udl +831 -0
- package/conformance/valid/insured-travel.expected.json +5 -0
- package/conformance/valid/insured-travel.udl +2621 -0
- package/conformance/valid/minimal.expected.json +5 -0
- package/conformance/valid/minimal.udl +50 -0
- package/conformance/valid/protection.expected.json +5 -0
- package/conformance/valid/protection.udl +1136 -0
- package/dist/canonical.d.ts +2 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +35 -0
- package/dist/canonical.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +138 -0
- package/dist/cli.js.map +1 -0
- package/dist/duration.d.ts +3 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +23 -0
- package/dist/duration.js.map +1 -0
- package/dist/evolution.d.ts +63 -0
- package/dist/evolution.d.ts.map +1 -0
- package/dist/evolution.js +345 -0
- package/dist/evolution.js.map +1 -0
- package/dist/finance.d.ts +53 -0
- package/dist/finance.d.ts.map +1 -0
- package/dist/finance.js +511 -0
- package/dist/finance.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +33 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +33 -0
- package/dist/limits.js.map +1 -0
- package/dist/parser.d.ts +4 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +54 -0
- package/dist/parser.js.map +1 -0
- package/dist/schema.d.ts +757 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +281 -0
- package/dist/schema.js.map +1 -0
- package/dist/validation.d.ts +64 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +1323 -0
- package/dist/validation.js.map +1 -0
- package/package.json +84 -0
- package/spec/README.md +137 -0
- package/spec/udl.schema.json +1019 -0
- package/src/canonical.ts +41 -0
- package/src/cli.ts +148 -0
- package/src/duration.ts +26 -0
- package/src/evolution.ts +587 -0
- package/src/finance.ts +775 -0
- package/src/index.ts +59 -0
- package/src/limits.ts +32 -0
- package/src/parser.ts +61 -0
- package/src/schema.ts +339 -0
- package/src/validation.ts +2053 -0
|
@@ -0,0 +1,1092 @@
|
|
|
1
|
+
{
|
|
2
|
+
"nouns": [
|
|
3
|
+
{
|
|
4
|
+
"description": "A cardholder links one first-party customer to the card program, becomes active after approval, may be suspended and resumed, and closes permanently when card access ends.",
|
|
5
|
+
"fields": {
|
|
6
|
+
"customerId": {
|
|
7
|
+
"description": "Tenant-local customer ID",
|
|
8
|
+
"pattern": "^cus_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
9
|
+
"type": "string"
|
|
10
|
+
},
|
|
11
|
+
"displayName": {
|
|
12
|
+
"maxLength": 120,
|
|
13
|
+
"minLength": 1,
|
|
14
|
+
"type": "string"
|
|
15
|
+
},
|
|
16
|
+
"email": {
|
|
17
|
+
"format": "hyperscale-email",
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"phoneNumber": {
|
|
21
|
+
"maxLength": 32,
|
|
22
|
+
"minLength": 6,
|
|
23
|
+
"type": "string"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"id": "cardholder",
|
|
27
|
+
"idPrefix": "chd",
|
|
28
|
+
"lifecycle": {
|
|
29
|
+
"initial": "pending",
|
|
30
|
+
"states": [
|
|
31
|
+
"pending",
|
|
32
|
+
"active",
|
|
33
|
+
"suspended",
|
|
34
|
+
"closed"
|
|
35
|
+
],
|
|
36
|
+
"transitions": {
|
|
37
|
+
"activate": {
|
|
38
|
+
"from": [
|
|
39
|
+
"pending"
|
|
40
|
+
],
|
|
41
|
+
"to": "active"
|
|
42
|
+
},
|
|
43
|
+
"close": {
|
|
44
|
+
"from": [
|
|
45
|
+
"pending",
|
|
46
|
+
"active",
|
|
47
|
+
"suspended"
|
|
48
|
+
],
|
|
49
|
+
"to": "closed"
|
|
50
|
+
},
|
|
51
|
+
"resume": {
|
|
52
|
+
"from": [
|
|
53
|
+
"suspended"
|
|
54
|
+
],
|
|
55
|
+
"to": "active"
|
|
56
|
+
},
|
|
57
|
+
"suspend": {
|
|
58
|
+
"from": [
|
|
59
|
+
"active"
|
|
60
|
+
],
|
|
61
|
+
"to": "suspended"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"required": [
|
|
66
|
+
"customerId",
|
|
67
|
+
"displayName"
|
|
68
|
+
],
|
|
69
|
+
"summary": "Customer approved to hold cards in a product.",
|
|
70
|
+
"title": "Cardholder",
|
|
71
|
+
"update": {
|
|
72
|
+
"fields": [
|
|
73
|
+
"displayName",
|
|
74
|
+
"email",
|
|
75
|
+
"phoneNumber"
|
|
76
|
+
],
|
|
77
|
+
"states": [
|
|
78
|
+
"pending",
|
|
79
|
+
"active",
|
|
80
|
+
"suspended"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
"verbs": {
|
|
84
|
+
"activate": {
|
|
85
|
+
"description": "Approves the customer to hold and use cards.",
|
|
86
|
+
"moves": [],
|
|
87
|
+
"steps": [],
|
|
88
|
+
"summary": "Activate a cardholder"
|
|
89
|
+
},
|
|
90
|
+
"close": {
|
|
91
|
+
"description": "Permanently ends the customer's cardholder relationship. Existing cards must be canceled separately.",
|
|
92
|
+
"moves": [],
|
|
93
|
+
"steps": [],
|
|
94
|
+
"summary": "Close a cardholder"
|
|
95
|
+
},
|
|
96
|
+
"create": {
|
|
97
|
+
"description": "Creates a pending cardholder for one verified first-party customer.",
|
|
98
|
+
"examples": [
|
|
99
|
+
{
|
|
100
|
+
"input": {
|
|
101
|
+
"customerId": "cus_sandbox_customer0001",
|
|
102
|
+
"displayName": "Noura Al Saud",
|
|
103
|
+
"email": "noura@example.test",
|
|
104
|
+
"phoneNumber": "+966500000001"
|
|
105
|
+
},
|
|
106
|
+
"name": "create_customer_cardholder"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"moves": [],
|
|
110
|
+
"steps": [],
|
|
111
|
+
"summary": "Create a cardholder"
|
|
112
|
+
},
|
|
113
|
+
"resume": {
|
|
114
|
+
"description": "Restores card access after a suspension is resolved.",
|
|
115
|
+
"moves": [],
|
|
116
|
+
"steps": [],
|
|
117
|
+
"summary": "Resume a cardholder"
|
|
118
|
+
},
|
|
119
|
+
"suspend": {
|
|
120
|
+
"description": "Pauses the customer's card access without closing the cardholder.",
|
|
121
|
+
"moves": [],
|
|
122
|
+
"steps": [],
|
|
123
|
+
"summary": "Suspend a cardholder"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"description": "A card is issued to one active cardholder, activates for spending, can be frozen and unfrozen without replacement, and is canceled permanently. Spend controls remain declarative data on the card.",
|
|
129
|
+
"fields": {
|
|
130
|
+
"accountId": {
|
|
131
|
+
"description": "Hyperscale account ID",
|
|
132
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
133
|
+
"type": "string",
|
|
134
|
+
"x-hyperscale-reference-filter": {
|
|
135
|
+
"column": "role",
|
|
136
|
+
"values": [
|
|
137
|
+
"customer_balance"
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"cardholderId": {
|
|
142
|
+
"description": "Active cardholder receiving this card",
|
|
143
|
+
"pattern": "^chd_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
144
|
+
"type": "string"
|
|
145
|
+
},
|
|
146
|
+
"currency": {
|
|
147
|
+
"description": "ISO 4217 currency code",
|
|
148
|
+
"maxLength": 3,
|
|
149
|
+
"minLength": 3,
|
|
150
|
+
"pattern": "^[A-Z]{3}$",
|
|
151
|
+
"type": "string"
|
|
152
|
+
},
|
|
153
|
+
"label": {
|
|
154
|
+
"maxLength": 80,
|
|
155
|
+
"minLength": 1,
|
|
156
|
+
"type": "string"
|
|
157
|
+
},
|
|
158
|
+
"spendControls": {
|
|
159
|
+
"additionalProperties": false,
|
|
160
|
+
"properties": {
|
|
161
|
+
"allowedCountries": {
|
|
162
|
+
"items": {
|
|
163
|
+
"description": "ISO 3166-1 alpha-2 country code",
|
|
164
|
+
"maxLength": 2,
|
|
165
|
+
"minLength": 2,
|
|
166
|
+
"pattern": "^[A-Z]{2}$",
|
|
167
|
+
"type": "string"
|
|
168
|
+
},
|
|
169
|
+
"maxItems": 64,
|
|
170
|
+
"type": "array"
|
|
171
|
+
},
|
|
172
|
+
"allowedMerchantCategories": {
|
|
173
|
+
"items": {
|
|
174
|
+
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
175
|
+
"type": "string"
|
|
176
|
+
},
|
|
177
|
+
"maxItems": 64,
|
|
178
|
+
"type": "array"
|
|
179
|
+
},
|
|
180
|
+
"dailyLimit": {
|
|
181
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
182
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
183
|
+
"type": "string"
|
|
184
|
+
},
|
|
185
|
+
"monthlyLimit": {
|
|
186
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
187
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
188
|
+
"type": "string"
|
|
189
|
+
},
|
|
190
|
+
"singlePurchaseLimit": {
|
|
191
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
192
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
193
|
+
"type": "string"
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"required": [
|
|
197
|
+
"singlePurchaseLimit",
|
|
198
|
+
"dailyLimit",
|
|
199
|
+
"monthlyLimit"
|
|
200
|
+
],
|
|
201
|
+
"type": "object"
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"id": "card",
|
|
205
|
+
"idPrefix": "card",
|
|
206
|
+
"lifecycle": {
|
|
207
|
+
"initial": "issued",
|
|
208
|
+
"states": [
|
|
209
|
+
"issued",
|
|
210
|
+
"active",
|
|
211
|
+
"frozen",
|
|
212
|
+
"canceled"
|
|
213
|
+
],
|
|
214
|
+
"transitions": {
|
|
215
|
+
"activate": {
|
|
216
|
+
"from": [
|
|
217
|
+
"issued"
|
|
218
|
+
],
|
|
219
|
+
"to": "active"
|
|
220
|
+
},
|
|
221
|
+
"cancel": {
|
|
222
|
+
"from": [
|
|
223
|
+
"issued",
|
|
224
|
+
"active",
|
|
225
|
+
"frozen"
|
|
226
|
+
],
|
|
227
|
+
"to": "canceled"
|
|
228
|
+
},
|
|
229
|
+
"freeze": {
|
|
230
|
+
"from": [
|
|
231
|
+
"active"
|
|
232
|
+
],
|
|
233
|
+
"to": "frozen"
|
|
234
|
+
},
|
|
235
|
+
"unfreeze": {
|
|
236
|
+
"from": [
|
|
237
|
+
"frozen"
|
|
238
|
+
],
|
|
239
|
+
"to": "active"
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"parties": {
|
|
244
|
+
"payer": "accountId"
|
|
245
|
+
},
|
|
246
|
+
"required": [
|
|
247
|
+
"cardholderId",
|
|
248
|
+
"accountId",
|
|
249
|
+
"currency",
|
|
250
|
+
"label",
|
|
251
|
+
"spendControls"
|
|
252
|
+
],
|
|
253
|
+
"summary": "Virtual payment card bound to a cardholder account.",
|
|
254
|
+
"title": "Card",
|
|
255
|
+
"update": {
|
|
256
|
+
"fields": [
|
|
257
|
+
"label",
|
|
258
|
+
"spendControls"
|
|
259
|
+
],
|
|
260
|
+
"states": [
|
|
261
|
+
"issued",
|
|
262
|
+
"active",
|
|
263
|
+
"frozen"
|
|
264
|
+
]
|
|
265
|
+
},
|
|
266
|
+
"verbs": {
|
|
267
|
+
"activate": {
|
|
268
|
+
"description": "Makes the issued virtual card available for authorization.",
|
|
269
|
+
"moves": [],
|
|
270
|
+
"requiresRefs": [
|
|
271
|
+
{
|
|
272
|
+
"field": "cardholderId",
|
|
273
|
+
"statuses": [
|
|
274
|
+
"active"
|
|
275
|
+
]
|
|
276
|
+
}
|
|
277
|
+
],
|
|
278
|
+
"steps": [],
|
|
279
|
+
"summary": "Activate a card"
|
|
280
|
+
},
|
|
281
|
+
"cancel": {
|
|
282
|
+
"description": "Permanently stops the virtual card. Existing posted transactions remain part of its history.",
|
|
283
|
+
"moves": [],
|
|
284
|
+
"steps": [],
|
|
285
|
+
"summary": "Cancel a card"
|
|
286
|
+
},
|
|
287
|
+
"create": {
|
|
288
|
+
"description": "Issues a virtual card to one active cardholder and binds its spend controls and funding account.",
|
|
289
|
+
"eventName": "card.issued",
|
|
290
|
+
"examples": [
|
|
291
|
+
{
|
|
292
|
+
"input": {
|
|
293
|
+
"accountId": "acct_sandbox_cardfund0001",
|
|
294
|
+
"cardholderId": "chd_sandbox_customer0001",
|
|
295
|
+
"currency": "SAR",
|
|
296
|
+
"label": "Primary virtual card",
|
|
297
|
+
"spendControls": {
|
|
298
|
+
"allowedCountries": [
|
|
299
|
+
"SA"
|
|
300
|
+
],
|
|
301
|
+
"allowedMerchantCategories": [
|
|
302
|
+
"retail",
|
|
303
|
+
"travel",
|
|
304
|
+
"lodging"
|
|
305
|
+
],
|
|
306
|
+
"dailyLimit": "100000",
|
|
307
|
+
"monthlyLimit": "500000",
|
|
308
|
+
"singlePurchaseLimit": "50000"
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
"name": "issue_controlled_virtual_card"
|
|
312
|
+
}
|
|
313
|
+
],
|
|
314
|
+
"moves": [],
|
|
315
|
+
"requiresRefs": [
|
|
316
|
+
{
|
|
317
|
+
"field": "cardholderId",
|
|
318
|
+
"statuses": [
|
|
319
|
+
"active"
|
|
320
|
+
]
|
|
321
|
+
}
|
|
322
|
+
],
|
|
323
|
+
"steps": [],
|
|
324
|
+
"summary": "Issue a card"
|
|
325
|
+
},
|
|
326
|
+
"freeze": {
|
|
327
|
+
"description": "Stops new authorizations while preserving the card and its history.",
|
|
328
|
+
"moves": [],
|
|
329
|
+
"steps": [],
|
|
330
|
+
"summary": "Freeze a card"
|
|
331
|
+
},
|
|
332
|
+
"unfreeze": {
|
|
333
|
+
"description": "Restores authorization after a temporary freeze.",
|
|
334
|
+
"eventName": "card.unfrozen",
|
|
335
|
+
"moves": [],
|
|
336
|
+
"requiresRefs": [
|
|
337
|
+
{
|
|
338
|
+
"field": "cardholderId",
|
|
339
|
+
"statuses": [
|
|
340
|
+
"active"
|
|
341
|
+
]
|
|
342
|
+
}
|
|
343
|
+
],
|
|
344
|
+
"steps": [],
|
|
345
|
+
"summary": "Unfreeze a card"
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"description": "A card authorization starts pending, asks the configured card policy for an immediate decision, reserves the approved amount, and then either captures the hold, reverses it, or expires it. Declined requests never hold money.",
|
|
351
|
+
"fields": {
|
|
352
|
+
"amount": {
|
|
353
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
354
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
355
|
+
"type": "string"
|
|
356
|
+
},
|
|
357
|
+
"cardAccountId": {
|
|
358
|
+
"description": "Hyperscale account ID",
|
|
359
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
360
|
+
"type": "string",
|
|
361
|
+
"x-hyperscale-reference-filter": {
|
|
362
|
+
"column": "role",
|
|
363
|
+
"values": [
|
|
364
|
+
"customer_balance"
|
|
365
|
+
]
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
"cardId": {
|
|
369
|
+
"description": "Active card presented for this authorization",
|
|
370
|
+
"pattern": "^card_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
371
|
+
"type": "string"
|
|
372
|
+
},
|
|
373
|
+
"currency": {
|
|
374
|
+
"description": "ISO 4217 currency code",
|
|
375
|
+
"maxLength": 3,
|
|
376
|
+
"minLength": 3,
|
|
377
|
+
"pattern": "^[A-Z]{3}$",
|
|
378
|
+
"type": "string"
|
|
379
|
+
},
|
|
380
|
+
"expiresAt": {
|
|
381
|
+
"format": "hyperscale-date-time",
|
|
382
|
+
"type": "string"
|
|
383
|
+
},
|
|
384
|
+
"merchantCategory": {
|
|
385
|
+
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
386
|
+
"type": "string"
|
|
387
|
+
},
|
|
388
|
+
"merchantCountry": {
|
|
389
|
+
"description": "ISO 3166-1 alpha-2 country code",
|
|
390
|
+
"maxLength": 2,
|
|
391
|
+
"minLength": 2,
|
|
392
|
+
"pattern": "^[A-Z]{2}$",
|
|
393
|
+
"type": "string"
|
|
394
|
+
},
|
|
395
|
+
"merchantName": {
|
|
396
|
+
"maxLength": 120,
|
|
397
|
+
"minLength": 1,
|
|
398
|
+
"type": "string"
|
|
399
|
+
},
|
|
400
|
+
"merchantReference": {
|
|
401
|
+
"maxLength": 120,
|
|
402
|
+
"minLength": 1,
|
|
403
|
+
"type": "string"
|
|
404
|
+
},
|
|
405
|
+
"settlementAccountId": {
|
|
406
|
+
"description": "Hyperscale account ID",
|
|
407
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
408
|
+
"type": "string",
|
|
409
|
+
"x-hyperscale-reference-filter": {
|
|
410
|
+
"column": "role",
|
|
411
|
+
"values": [
|
|
412
|
+
"customer_balance"
|
|
413
|
+
]
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
"id": "card_authorization",
|
|
418
|
+
"idPrefix": "cau",
|
|
419
|
+
"lifecycle": {
|
|
420
|
+
"initial": "pending",
|
|
421
|
+
"states": [
|
|
422
|
+
"pending",
|
|
423
|
+
"approved",
|
|
424
|
+
"captured",
|
|
425
|
+
"declined",
|
|
426
|
+
"reversed",
|
|
427
|
+
"expired"
|
|
428
|
+
],
|
|
429
|
+
"transitions": {
|
|
430
|
+
"approve": {
|
|
431
|
+
"from": [
|
|
432
|
+
"pending"
|
|
433
|
+
],
|
|
434
|
+
"to": "approved"
|
|
435
|
+
},
|
|
436
|
+
"capture": {
|
|
437
|
+
"from": [
|
|
438
|
+
"approved"
|
|
439
|
+
],
|
|
440
|
+
"to": "captured"
|
|
441
|
+
},
|
|
442
|
+
"decline": {
|
|
443
|
+
"from": [
|
|
444
|
+
"pending"
|
|
445
|
+
],
|
|
446
|
+
"to": "declined"
|
|
447
|
+
},
|
|
448
|
+
"expire": {
|
|
449
|
+
"from": [
|
|
450
|
+
"approved"
|
|
451
|
+
],
|
|
452
|
+
"to": "expired"
|
|
453
|
+
},
|
|
454
|
+
"reverse": {
|
|
455
|
+
"from": [
|
|
456
|
+
"approved"
|
|
457
|
+
],
|
|
458
|
+
"to": "reversed"
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
"parties": {
|
|
463
|
+
"beneficiary": "settlementAccountId",
|
|
464
|
+
"payer": "cardAccountId"
|
|
465
|
+
},
|
|
466
|
+
"required": [
|
|
467
|
+
"cardId",
|
|
468
|
+
"cardAccountId",
|
|
469
|
+
"settlementAccountId",
|
|
470
|
+
"amount",
|
|
471
|
+
"currency",
|
|
472
|
+
"merchantName",
|
|
473
|
+
"merchantCategory",
|
|
474
|
+
"merchantCountry",
|
|
475
|
+
"merchantReference",
|
|
476
|
+
"expiresAt"
|
|
477
|
+
],
|
|
478
|
+
"summary": "Just-in-time decision and hold for one card purchase.",
|
|
479
|
+
"title": "Card authorization",
|
|
480
|
+
"verbs": {
|
|
481
|
+
"approve": {
|
|
482
|
+
"decision": {
|
|
483
|
+
"capability": "banking_or_card_issuing",
|
|
484
|
+
"deadlineMs": 1500,
|
|
485
|
+
"onTimeout": "decline"
|
|
486
|
+
},
|
|
487
|
+
"description": "Asks the configured card policy for a just-in-time decision and reserves the immutable authorization amount when approved.",
|
|
488
|
+
"moves": [
|
|
489
|
+
{
|
|
490
|
+
"bind": {
|
|
491
|
+
"amount": {
|
|
492
|
+
"from": "instance",
|
|
493
|
+
"path": "fields.amount"
|
|
494
|
+
},
|
|
495
|
+
"currency": {
|
|
496
|
+
"from": "instance",
|
|
497
|
+
"path": "fields.currency"
|
|
498
|
+
},
|
|
499
|
+
"destinationAccountId": {
|
|
500
|
+
"from": "instance",
|
|
501
|
+
"path": "fields.settlementAccountId"
|
|
502
|
+
},
|
|
503
|
+
"expiresAt": {
|
|
504
|
+
"from": "instance",
|
|
505
|
+
"path": "fields.expiresAt"
|
|
506
|
+
},
|
|
507
|
+
"memo": {
|
|
508
|
+
"from": "const",
|
|
509
|
+
"value": "Card authorization hold"
|
|
510
|
+
},
|
|
511
|
+
"sourceAccountId": {
|
|
512
|
+
"from": "instance",
|
|
513
|
+
"path": "fields.cardAccountId"
|
|
514
|
+
}
|
|
515
|
+
},
|
|
516
|
+
"capture": {
|
|
517
|
+
"authorizationTransferId": "transferId"
|
|
518
|
+
},
|
|
519
|
+
"key": "transfer",
|
|
520
|
+
"operation": "internal_transfer.reserve"
|
|
521
|
+
}
|
|
522
|
+
],
|
|
523
|
+
"requiresRefs": [
|
|
524
|
+
{
|
|
525
|
+
"field": "cardId",
|
|
526
|
+
"statuses": [
|
|
527
|
+
"active"
|
|
528
|
+
]
|
|
529
|
+
}
|
|
530
|
+
],
|
|
531
|
+
"steps": [],
|
|
532
|
+
"summary": "Approve a card authorization"
|
|
533
|
+
},
|
|
534
|
+
"capture": {
|
|
535
|
+
"description": "Posts the reserved transfer after the merchant completes the purchase.",
|
|
536
|
+
"earnable": true,
|
|
537
|
+
"moves": [
|
|
538
|
+
{
|
|
539
|
+
"bind": {
|
|
540
|
+
"transferId": {
|
|
541
|
+
"from": "instance",
|
|
542
|
+
"path": "refs.authorizationTransferId"
|
|
543
|
+
}
|
|
544
|
+
},
|
|
545
|
+
"key": "transfer",
|
|
546
|
+
"operation": "internal_transfer.post"
|
|
547
|
+
}
|
|
548
|
+
],
|
|
549
|
+
"steps": [],
|
|
550
|
+
"summary": "Capture a card authorization"
|
|
551
|
+
},
|
|
552
|
+
"create": {
|
|
553
|
+
"description": "Records one pending merchant request against an active virtual card. No money is held before approval.",
|
|
554
|
+
"eventName": "card_authorization.requested",
|
|
555
|
+
"examples": [
|
|
556
|
+
{
|
|
557
|
+
"input": {
|
|
558
|
+
"amount": "12500",
|
|
559
|
+
"cardAccountId": "acct_sandbox_cardfund0001",
|
|
560
|
+
"cardId": "card_sandbox_virtual00001",
|
|
561
|
+
"currency": "SAR",
|
|
562
|
+
"expiresAt": "2026-07-16T12:00:00.000Z",
|
|
563
|
+
"merchantCategory": "electronics",
|
|
564
|
+
"merchantCountry": "SA",
|
|
565
|
+
"merchantName": "Riyadh Camera Store",
|
|
566
|
+
"merchantReference": "merchant-order-1042",
|
|
567
|
+
"settlementAccountId": "acct_sandbox_merchant0001"
|
|
568
|
+
},
|
|
569
|
+
"name": "request_retail_authorization"
|
|
570
|
+
}
|
|
571
|
+
],
|
|
572
|
+
"moves": [],
|
|
573
|
+
"requiresRefs": [
|
|
574
|
+
{
|
|
575
|
+
"field": "cardId",
|
|
576
|
+
"statuses": [
|
|
577
|
+
"active"
|
|
578
|
+
]
|
|
579
|
+
}
|
|
580
|
+
],
|
|
581
|
+
"steps": [],
|
|
582
|
+
"summary": "Request a card authorization"
|
|
583
|
+
},
|
|
584
|
+
"decline": {
|
|
585
|
+
"description": "Closes a pending request without placing a hold after a declined card-policy decision.",
|
|
586
|
+
"moves": [],
|
|
587
|
+
"steps": [],
|
|
588
|
+
"summary": "Decline a card authorization"
|
|
589
|
+
},
|
|
590
|
+
"expire": {
|
|
591
|
+
"description": "Voids an approved hold at its declared expiry under the machine principal.",
|
|
592
|
+
"due": {
|
|
593
|
+
"field": "expiresAt"
|
|
594
|
+
},
|
|
595
|
+
"moves": [
|
|
596
|
+
{
|
|
597
|
+
"bind": {
|
|
598
|
+
"reason": {
|
|
599
|
+
"from": "const",
|
|
600
|
+
"value": "Card authorization expired"
|
|
601
|
+
},
|
|
602
|
+
"transferId": {
|
|
603
|
+
"from": "instance",
|
|
604
|
+
"path": "refs.authorizationTransferId"
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
"key": "transfer",
|
|
608
|
+
"operation": "internal_transfer.void"
|
|
609
|
+
}
|
|
610
|
+
],
|
|
611
|
+
"steps": [],
|
|
612
|
+
"summary": "Expire a card authorization"
|
|
613
|
+
},
|
|
614
|
+
"reverse": {
|
|
615
|
+
"description": "Voids an approved hold before capture and releases the card funds.",
|
|
616
|
+
"moves": [
|
|
617
|
+
{
|
|
618
|
+
"bind": {
|
|
619
|
+
"reason": {
|
|
620
|
+
"from": "const",
|
|
621
|
+
"value": "Card authorization reversed"
|
|
622
|
+
},
|
|
623
|
+
"transferId": {
|
|
624
|
+
"from": "instance",
|
|
625
|
+
"path": "refs.authorizationTransferId"
|
|
626
|
+
}
|
|
627
|
+
},
|
|
628
|
+
"key": "transfer",
|
|
629
|
+
"operation": "internal_transfer.void"
|
|
630
|
+
}
|
|
631
|
+
],
|
|
632
|
+
"steps": [],
|
|
633
|
+
"summary": "Reverse a card authorization"
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"description": "A card transaction records the settled result of one captured authorization. It remains posted unless the full immutable amount is returned to the card account, after which it is refunded permanently.",
|
|
639
|
+
"fields": {
|
|
640
|
+
"amount": {
|
|
641
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
642
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
643
|
+
"type": "string"
|
|
644
|
+
},
|
|
645
|
+
"cardAccountId": {
|
|
646
|
+
"description": "Hyperscale account ID",
|
|
647
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
648
|
+
"type": "string",
|
|
649
|
+
"x-hyperscale-reference-filter": {
|
|
650
|
+
"column": "role",
|
|
651
|
+
"values": [
|
|
652
|
+
"customer_balance"
|
|
653
|
+
]
|
|
654
|
+
}
|
|
655
|
+
},
|
|
656
|
+
"cardAuthorizationId": {
|
|
657
|
+
"description": "Captured authorization settled by this transaction",
|
|
658
|
+
"pattern": "^cau_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
659
|
+
"type": "string"
|
|
660
|
+
},
|
|
661
|
+
"cardId": {
|
|
662
|
+
"description": "Card used for this transaction",
|
|
663
|
+
"pattern": "^card_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
664
|
+
"type": "string"
|
|
665
|
+
},
|
|
666
|
+
"currency": {
|
|
667
|
+
"description": "ISO 4217 currency code",
|
|
668
|
+
"maxLength": 3,
|
|
669
|
+
"minLength": 3,
|
|
670
|
+
"pattern": "^[A-Z]{3}$",
|
|
671
|
+
"type": "string"
|
|
672
|
+
},
|
|
673
|
+
"merchantReference": {
|
|
674
|
+
"maxLength": 120,
|
|
675
|
+
"minLength": 1,
|
|
676
|
+
"type": "string"
|
|
677
|
+
},
|
|
678
|
+
"postedAt": {
|
|
679
|
+
"format": "hyperscale-date-time",
|
|
680
|
+
"type": "string"
|
|
681
|
+
},
|
|
682
|
+
"settlementAccountId": {
|
|
683
|
+
"description": "Hyperscale account ID",
|
|
684
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
685
|
+
"type": "string",
|
|
686
|
+
"x-hyperscale-reference-filter": {
|
|
687
|
+
"column": "role",
|
|
688
|
+
"values": [
|
|
689
|
+
"customer_balance"
|
|
690
|
+
]
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
},
|
|
694
|
+
"id": "card_transaction",
|
|
695
|
+
"idPrefix": "ctx",
|
|
696
|
+
"lifecycle": {
|
|
697
|
+
"initial": "posted",
|
|
698
|
+
"states": [
|
|
699
|
+
"posted",
|
|
700
|
+
"refunded"
|
|
701
|
+
],
|
|
702
|
+
"transitions": {
|
|
703
|
+
"refund": {
|
|
704
|
+
"from": [
|
|
705
|
+
"posted"
|
|
706
|
+
],
|
|
707
|
+
"to": "refunded"
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
},
|
|
711
|
+
"parties": {
|
|
712
|
+
"beneficiary": "settlementAccountId",
|
|
713
|
+
"payer": "cardAccountId"
|
|
714
|
+
},
|
|
715
|
+
"required": [
|
|
716
|
+
"cardAuthorizationId",
|
|
717
|
+
"cardId",
|
|
718
|
+
"cardAccountId",
|
|
719
|
+
"settlementAccountId",
|
|
720
|
+
"amount",
|
|
721
|
+
"currency",
|
|
722
|
+
"merchantReference",
|
|
723
|
+
"postedAt"
|
|
724
|
+
],
|
|
725
|
+
"summary": "Posted card purchase and its possible full refund.",
|
|
726
|
+
"title": "Card transaction",
|
|
727
|
+
"verbs": {
|
|
728
|
+
"create": {
|
|
729
|
+
"description": "Records the posted purchase produced by one captured authorization. The amount, currency, card, and account pair are derived from the locked captured authorization -- never caller-supplied -- and each authorization settles into at most one transaction.",
|
|
730
|
+
"eventName": "card_transaction.posted",
|
|
731
|
+
"examples": [
|
|
732
|
+
{
|
|
733
|
+
"input": {
|
|
734
|
+
"cardAuthorizationId": "cau_sandbox_purchase00001",
|
|
735
|
+
"postedAt": "2026-07-10T12:05:00.000Z"
|
|
736
|
+
},
|
|
737
|
+
"name": "record_captured_card_purchase"
|
|
738
|
+
}
|
|
739
|
+
],
|
|
740
|
+
"moves": [],
|
|
741
|
+
"requiresRefs": [
|
|
742
|
+
{
|
|
743
|
+
"bind": {
|
|
744
|
+
"amount": "fields.amount",
|
|
745
|
+
"cardAccountId": "fields.cardAccountId",
|
|
746
|
+
"cardId": "fields.cardId",
|
|
747
|
+
"currency": "fields.currency",
|
|
748
|
+
"merchantReference": "fields.merchantReference",
|
|
749
|
+
"settlementAccountId": "fields.settlementAccountId"
|
|
750
|
+
},
|
|
751
|
+
"field": "cardAuthorizationId",
|
|
752
|
+
"statuses": [
|
|
753
|
+
"captured"
|
|
754
|
+
],
|
|
755
|
+
"unique": true
|
|
756
|
+
}
|
|
757
|
+
],
|
|
758
|
+
"steps": [],
|
|
759
|
+
"summary": "Record a card transaction"
|
|
760
|
+
},
|
|
761
|
+
"refund": {
|
|
762
|
+
"description": "Returns the full posted amount from the settlement account to the card account and closes the transaction as refunded.",
|
|
763
|
+
"examples": [
|
|
764
|
+
{
|
|
765
|
+
"input": {
|
|
766
|
+
"reason": "Merchant accepted the returned item"
|
|
767
|
+
},
|
|
768
|
+
"name": "refund_returned_purchase"
|
|
769
|
+
}
|
|
770
|
+
],
|
|
771
|
+
"input": {
|
|
772
|
+
"additionalProperties": false,
|
|
773
|
+
"properties": {
|
|
774
|
+
"reason": {
|
|
775
|
+
"maxLength": 180,
|
|
776
|
+
"minLength": 1,
|
|
777
|
+
"type": "string"
|
|
778
|
+
}
|
|
779
|
+
},
|
|
780
|
+
"required": [
|
|
781
|
+
"reason"
|
|
782
|
+
],
|
|
783
|
+
"type": "object"
|
|
784
|
+
},
|
|
785
|
+
"moves": [
|
|
786
|
+
{
|
|
787
|
+
"bind": {
|
|
788
|
+
"amount": {
|
|
789
|
+
"from": "instance",
|
|
790
|
+
"path": "fields.amount"
|
|
791
|
+
},
|
|
792
|
+
"currency": {
|
|
793
|
+
"from": "instance",
|
|
794
|
+
"path": "fields.currency"
|
|
795
|
+
},
|
|
796
|
+
"destinationAccountId": {
|
|
797
|
+
"from": "instance",
|
|
798
|
+
"path": "fields.cardAccountId"
|
|
799
|
+
},
|
|
800
|
+
"memo": {
|
|
801
|
+
"from": "input",
|
|
802
|
+
"path": "reason"
|
|
803
|
+
},
|
|
804
|
+
"sourceAccountId": {
|
|
805
|
+
"from": "instance",
|
|
806
|
+
"path": "fields.settlementAccountId"
|
|
807
|
+
},
|
|
808
|
+
"workspaceId": {
|
|
809
|
+
"from": "instance",
|
|
810
|
+
"path": "workspaceId"
|
|
811
|
+
}
|
|
812
|
+
},
|
|
813
|
+
"capture": {
|
|
814
|
+
"refundTransferId": "transferId"
|
|
815
|
+
},
|
|
816
|
+
"key": "transfer",
|
|
817
|
+
"operation": "internal_transfer.create"
|
|
818
|
+
}
|
|
819
|
+
],
|
|
820
|
+
"steps": [],
|
|
821
|
+
"summary": "Refund a card transaction"
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"description": "A card dispute is filed with evidence against one posted transaction, enters review, and ends won or lost. A win returns the immutable disputed amount to the card account; an unresolved case is lost at its response deadline.",
|
|
827
|
+
"fields": {
|
|
828
|
+
"amount": {
|
|
829
|
+
"description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
|
|
830
|
+
"pattern": "^[1-9][0-9]{0,17}$",
|
|
831
|
+
"type": "string"
|
|
832
|
+
},
|
|
833
|
+
"cardAccountId": {
|
|
834
|
+
"description": "Hyperscale account ID",
|
|
835
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
836
|
+
"type": "string",
|
|
837
|
+
"x-hyperscale-reference-filter": {
|
|
838
|
+
"column": "role",
|
|
839
|
+
"values": [
|
|
840
|
+
"customer_balance"
|
|
841
|
+
]
|
|
842
|
+
}
|
|
843
|
+
},
|
|
844
|
+
"cardId": {
|
|
845
|
+
"description": "Card whose transaction is challenged",
|
|
846
|
+
"pattern": "^card_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
847
|
+
"type": "string"
|
|
848
|
+
},
|
|
849
|
+
"cardTransactionId": {
|
|
850
|
+
"description": "Posted card transaction challenged by this dispute",
|
|
851
|
+
"pattern": "^ctx_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
852
|
+
"type": "string"
|
|
853
|
+
},
|
|
854
|
+
"currency": {
|
|
855
|
+
"description": "ISO 4217 currency code",
|
|
856
|
+
"maxLength": 3,
|
|
857
|
+
"minLength": 3,
|
|
858
|
+
"pattern": "^[A-Z]{3}$",
|
|
859
|
+
"type": "string"
|
|
860
|
+
},
|
|
861
|
+
"evidence": {
|
|
862
|
+
"items": {
|
|
863
|
+
"additionalProperties": false,
|
|
864
|
+
"properties": {
|
|
865
|
+
"kind": {
|
|
866
|
+
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
867
|
+
"type": "string"
|
|
868
|
+
},
|
|
869
|
+
"reference": {
|
|
870
|
+
"maxLength": 180,
|
|
871
|
+
"minLength": 1,
|
|
872
|
+
"type": "string"
|
|
873
|
+
},
|
|
874
|
+
"submittedAt": {
|
|
875
|
+
"format": "hyperscale-date-time",
|
|
876
|
+
"type": "string"
|
|
877
|
+
},
|
|
878
|
+
"summary": {
|
|
879
|
+
"maxLength": 1000,
|
|
880
|
+
"minLength": 1,
|
|
881
|
+
"type": "string"
|
|
882
|
+
}
|
|
883
|
+
},
|
|
884
|
+
"required": [
|
|
885
|
+
"kind",
|
|
886
|
+
"summary",
|
|
887
|
+
"submittedAt"
|
|
888
|
+
],
|
|
889
|
+
"type": "object"
|
|
890
|
+
},
|
|
891
|
+
"maxItems": 20,
|
|
892
|
+
"minItems": 1,
|
|
893
|
+
"type": "array"
|
|
894
|
+
},
|
|
895
|
+
"reason": {
|
|
896
|
+
"pattern": "^[a-z][a-z0-9_]{1,79}$",
|
|
897
|
+
"type": "string"
|
|
898
|
+
},
|
|
899
|
+
"responseDueAt": {
|
|
900
|
+
"format": "hyperscale-date-time",
|
|
901
|
+
"type": "string"
|
|
902
|
+
},
|
|
903
|
+
"settlementAccountId": {
|
|
904
|
+
"description": "Hyperscale account ID",
|
|
905
|
+
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
906
|
+
"type": "string",
|
|
907
|
+
"x-hyperscale-reference-filter": {
|
|
908
|
+
"column": "role",
|
|
909
|
+
"values": [
|
|
910
|
+
"customer_balance"
|
|
911
|
+
]
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
},
|
|
915
|
+
"id": "card_dispute",
|
|
916
|
+
"idPrefix": "cdis",
|
|
917
|
+
"lifecycle": {
|
|
918
|
+
"initial": "filed",
|
|
919
|
+
"states": [
|
|
920
|
+
"filed",
|
|
921
|
+
"under_review",
|
|
922
|
+
"won",
|
|
923
|
+
"lost"
|
|
924
|
+
],
|
|
925
|
+
"transitions": {
|
|
926
|
+
"lose": {
|
|
927
|
+
"from": [
|
|
928
|
+
"filed",
|
|
929
|
+
"under_review"
|
|
930
|
+
],
|
|
931
|
+
"to": "lost"
|
|
932
|
+
},
|
|
933
|
+
"review": {
|
|
934
|
+
"from": [
|
|
935
|
+
"filed"
|
|
936
|
+
],
|
|
937
|
+
"to": "under_review"
|
|
938
|
+
},
|
|
939
|
+
"win": {
|
|
940
|
+
"from": [
|
|
941
|
+
"under_review"
|
|
942
|
+
],
|
|
943
|
+
"to": "won"
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
},
|
|
947
|
+
"parties": {
|
|
948
|
+
"beneficiary": "cardAccountId",
|
|
949
|
+
"payer": "settlementAccountId"
|
|
950
|
+
},
|
|
951
|
+
"required": [
|
|
952
|
+
"cardTransactionId",
|
|
953
|
+
"cardId",
|
|
954
|
+
"cardAccountId",
|
|
955
|
+
"settlementAccountId",
|
|
956
|
+
"amount",
|
|
957
|
+
"currency",
|
|
958
|
+
"reason",
|
|
959
|
+
"evidence",
|
|
960
|
+
"responseDueAt"
|
|
961
|
+
],
|
|
962
|
+
"summary": "Evidence-backed challenge to one posted card transaction.",
|
|
963
|
+
"title": "Card dispute",
|
|
964
|
+
"update": {
|
|
965
|
+
"fields": [
|
|
966
|
+
"evidence"
|
|
967
|
+
],
|
|
968
|
+
"states": [
|
|
969
|
+
"filed",
|
|
970
|
+
"under_review"
|
|
971
|
+
]
|
|
972
|
+
},
|
|
973
|
+
"verbs": {
|
|
974
|
+
"create": {
|
|
975
|
+
"description": "Files an evidence-backed challenge against one transaction that is still posted. The disputed amount, currency, card, and account pair are derived from the locked transaction -- never caller-supplied.",
|
|
976
|
+
"eventName": "card_dispute.filed",
|
|
977
|
+
"examples": [
|
|
978
|
+
{
|
|
979
|
+
"input": {
|
|
980
|
+
"cardTransactionId": "ctx_sandbox_purchase00001",
|
|
981
|
+
"evidence": [
|
|
982
|
+
{
|
|
983
|
+
"kind": "customer_statement",
|
|
984
|
+
"reference": "support-case-2048",
|
|
985
|
+
"submittedAt": "2026-07-11T10:15:00.000Z",
|
|
986
|
+
"summary": "Customer confirms the purchase was not authorized."
|
|
987
|
+
}
|
|
988
|
+
],
|
|
989
|
+
"reason": "unauthorized_purchase",
|
|
990
|
+
"responseDueAt": "2026-08-10T23:59:59.000Z"
|
|
991
|
+
},
|
|
992
|
+
"name": "file_unauthorized_purchase_dispute"
|
|
993
|
+
}
|
|
994
|
+
],
|
|
995
|
+
"moves": [],
|
|
996
|
+
"requiresRefs": [
|
|
997
|
+
{
|
|
998
|
+
"bind": {
|
|
999
|
+
"amount": "fields.amount",
|
|
1000
|
+
"cardAccountId": "fields.cardAccountId",
|
|
1001
|
+
"cardId": "fields.cardId",
|
|
1002
|
+
"currency": "fields.currency",
|
|
1003
|
+
"settlementAccountId": "fields.settlementAccountId"
|
|
1004
|
+
},
|
|
1005
|
+
"field": "cardTransactionId",
|
|
1006
|
+
"statuses": [
|
|
1007
|
+
"posted"
|
|
1008
|
+
]
|
|
1009
|
+
}
|
|
1010
|
+
],
|
|
1011
|
+
"steps": [],
|
|
1012
|
+
"summary": "File a card dispute"
|
|
1013
|
+
},
|
|
1014
|
+
"lose": {
|
|
1015
|
+
"description": "Closes an unresolved dispute without moving money when its response deadline passes.",
|
|
1016
|
+
"due": {
|
|
1017
|
+
"field": "responseDueAt"
|
|
1018
|
+
},
|
|
1019
|
+
"eventName": "card_dispute.lost",
|
|
1020
|
+
"moves": [],
|
|
1021
|
+
"steps": [],
|
|
1022
|
+
"summary": "Lose a card dispute"
|
|
1023
|
+
},
|
|
1024
|
+
"review": {
|
|
1025
|
+
"description": "Accepts the filed evidence for an outcome decision before the response deadline.",
|
|
1026
|
+
"moves": [],
|
|
1027
|
+
"steps": [],
|
|
1028
|
+
"summary": "Review a card dispute"
|
|
1029
|
+
},
|
|
1030
|
+
"win": {
|
|
1031
|
+
"decision": {
|
|
1032
|
+
"capability": "banking_or_card_issuing",
|
|
1033
|
+
"deadlineMs": 15000,
|
|
1034
|
+
"onTimeout": "decline"
|
|
1035
|
+
},
|
|
1036
|
+
"description": "Asks the configured card policy for the final outcome and returns the disputed amount when the cardholder wins.",
|
|
1037
|
+
"eventName": "card_dispute.won",
|
|
1038
|
+
"moves": [
|
|
1039
|
+
{
|
|
1040
|
+
"bind": {
|
|
1041
|
+
"amount": {
|
|
1042
|
+
"from": "instance",
|
|
1043
|
+
"path": "fields.amount"
|
|
1044
|
+
},
|
|
1045
|
+
"currency": {
|
|
1046
|
+
"from": "instance",
|
|
1047
|
+
"path": "fields.currency"
|
|
1048
|
+
},
|
|
1049
|
+
"destinationAccountId": {
|
|
1050
|
+
"from": "instance",
|
|
1051
|
+
"path": "fields.cardAccountId"
|
|
1052
|
+
},
|
|
1053
|
+
"memo": {
|
|
1054
|
+
"from": "const",
|
|
1055
|
+
"value": "Card dispute won"
|
|
1056
|
+
},
|
|
1057
|
+
"sourceAccountId": {
|
|
1058
|
+
"from": "instance",
|
|
1059
|
+
"path": "fields.settlementAccountId"
|
|
1060
|
+
},
|
|
1061
|
+
"workspaceId": {
|
|
1062
|
+
"from": "instance",
|
|
1063
|
+
"path": "workspaceId"
|
|
1064
|
+
}
|
|
1065
|
+
},
|
|
1066
|
+
"capture": {
|
|
1067
|
+
"disputeTransferId": "transferId"
|
|
1068
|
+
},
|
|
1069
|
+
"key": "transfer",
|
|
1070
|
+
"operation": "internal_transfer.create"
|
|
1071
|
+
}
|
|
1072
|
+
],
|
|
1073
|
+
"requiresRefs": [
|
|
1074
|
+
{
|
|
1075
|
+
"field": "cardTransactionId",
|
|
1076
|
+
"statuses": [
|
|
1077
|
+
"posted"
|
|
1078
|
+
]
|
|
1079
|
+
}
|
|
1080
|
+
],
|
|
1081
|
+
"steps": [],
|
|
1082
|
+
"summary": "Win a card dispute"
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
],
|
|
1087
|
+
"product": "cards",
|
|
1088
|
+
"subjects": [],
|
|
1089
|
+
"title": "Cards",
|
|
1090
|
+
"udl": 1,
|
|
1091
|
+
"version": 1
|
|
1092
|
+
}
|