@sparkrewards/sra-sdk 0.0.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.
Files changed (106) hide show
  1. package/LICENSE +201 -0
  2. package/dist-cjs/index.js +8 -0
  3. package/dist-cjs/models/index.js +4 -0
  4. package/dist-cjs/models/models_0.js +1901 -0
  5. package/dist-cjs/openapi.js +7 -0
  6. package/dist-cjs/openapi.json +2864 -0
  7. package/dist-cjs/protocols/Aws_restJson1.js +2939 -0
  8. package/dist-cjs/server/AppAPIService.js +371 -0
  9. package/dist-cjs/server/index.js +5 -0
  10. package/dist-cjs/server/operations/DeleteUser.js +121 -0
  11. package/dist-cjs/server/operations/FavoritePlans.js +125 -0
  12. package/dist-cjs/server/operations/FavoriteShops.js +122 -0
  13. package/dist-cjs/server/operations/GetShop.js +126 -0
  14. package/dist-cjs/server/operations/GetShopPublic.js +127 -0
  15. package/dist-cjs/server/operations/GetUser.js +121 -0
  16. package/dist-cjs/server/operations/LikeOrg.js +124 -0
  17. package/dist-cjs/server/operations/NearbyShops.js +121 -0
  18. package/dist-cjs/server/operations/NearbyShopsPublic.js +122 -0
  19. package/dist-cjs/server/operations/NearestShop.js +126 -0
  20. package/dist-cjs/server/operations/OnboardUser.js +122 -0
  21. package/dist-cjs/server/operations/PinnedShop.js +126 -0
  22. package/dist-cjs/server/operations/PinnedShopPublic.js +127 -0
  23. package/dist-cjs/server/operations/Plan.js +123 -0
  24. package/dist-cjs/server/operations/PlanPublic.js +124 -0
  25. package/dist-cjs/server/operations/Plans.js +124 -0
  26. package/dist-cjs/server/operations/PopularShops.js +122 -0
  27. package/dist-cjs/server/operations/PopularShopsPublic.js +123 -0
  28. package/dist-cjs/server/operations/RadiusShops.js +123 -0
  29. package/dist-cjs/server/operations/RecordVisit.js +129 -0
  30. package/dist-cjs/server/operations/RedeemFirstTimeReward.js +125 -0
  31. package/dist-cjs/server/operations/RedeemPointReward.js +126 -0
  32. package/dist-cjs/server/operations/RedeemVisitReward.js +125 -0
  33. package/dist-cjs/server/operations/SearchShopsPublic.js +125 -0
  34. package/dist-cjs/server/operations/SearchSuggestion.js +126 -0
  35. package/dist-cjs/server/operations/UpdateUser.js +121 -0
  36. package/dist-cjs/server/operations/index.js +29 -0
  37. package/dist-es/index.js +4 -0
  38. package/dist-es/models/index.js +1 -0
  39. package/dist-es/models/models_0.js +1893 -0
  40. package/dist-es/openapi.js +3 -0
  41. package/dist-es/openapi.json +2864 -0
  42. package/dist-es/protocols/Aws_restJson1.js +2878 -0
  43. package/dist-es/server/AppAPIService.js +366 -0
  44. package/dist-es/server/index.js +2 -0
  45. package/dist-es/server/operations/DeleteUser.js +115 -0
  46. package/dist-es/server/operations/FavoritePlans.js +119 -0
  47. package/dist-es/server/operations/FavoriteShops.js +116 -0
  48. package/dist-es/server/operations/GetShop.js +120 -0
  49. package/dist-es/server/operations/GetShopPublic.js +121 -0
  50. package/dist-es/server/operations/GetUser.js +115 -0
  51. package/dist-es/server/operations/LikeOrg.js +118 -0
  52. package/dist-es/server/operations/NearbyShops.js +115 -0
  53. package/dist-es/server/operations/NearbyShopsPublic.js +116 -0
  54. package/dist-es/server/operations/NearestShop.js +120 -0
  55. package/dist-es/server/operations/OnboardUser.js +116 -0
  56. package/dist-es/server/operations/PinnedShop.js +120 -0
  57. package/dist-es/server/operations/PinnedShopPublic.js +121 -0
  58. package/dist-es/server/operations/Plan.js +117 -0
  59. package/dist-es/server/operations/PlanPublic.js +118 -0
  60. package/dist-es/server/operations/Plans.js +118 -0
  61. package/dist-es/server/operations/PopularShops.js +116 -0
  62. package/dist-es/server/operations/PopularShopsPublic.js +117 -0
  63. package/dist-es/server/operations/RadiusShops.js +117 -0
  64. package/dist-es/server/operations/RecordVisit.js +123 -0
  65. package/dist-es/server/operations/RedeemFirstTimeReward.js +119 -0
  66. package/dist-es/server/operations/RedeemPointReward.js +120 -0
  67. package/dist-es/server/operations/RedeemVisitReward.js +119 -0
  68. package/dist-es/server/operations/SearchShopsPublic.js +119 -0
  69. package/dist-es/server/operations/SearchSuggestion.js +120 -0
  70. package/dist-es/server/operations/UpdateUser.js +115 -0
  71. package/dist-es/server/operations/index.js +26 -0
  72. package/dist-types/index.d.ts +9 -0
  73. package/dist-types/models/index.d.ts +1 -0
  74. package/dist-types/models/models_0.d.ts +832 -0
  75. package/dist-types/openapi.d.ts +7 -0
  76. package/dist-types/protocols/Aws_restJson1.d.ts +87 -0
  77. package/dist-types/server/AppAPIService.d.ts +76 -0
  78. package/dist-types/server/index.d.ts +2 -0
  79. package/dist-types/server/operations/DeleteUser.d.ts +41 -0
  80. package/dist-types/server/operations/FavoritePlans.d.ts +41 -0
  81. package/dist-types/server/operations/FavoriteShops.d.ts +41 -0
  82. package/dist-types/server/operations/GetShop.d.ts +41 -0
  83. package/dist-types/server/operations/GetShopPublic.d.ts +41 -0
  84. package/dist-types/server/operations/GetUser.d.ts +41 -0
  85. package/dist-types/server/operations/LikeOrg.d.ts +41 -0
  86. package/dist-types/server/operations/NearbyShops.d.ts +41 -0
  87. package/dist-types/server/operations/NearbyShopsPublic.d.ts +41 -0
  88. package/dist-types/server/operations/NearestShop.d.ts +41 -0
  89. package/dist-types/server/operations/OnboardUser.d.ts +41 -0
  90. package/dist-types/server/operations/PinnedShop.d.ts +41 -0
  91. package/dist-types/server/operations/PinnedShopPublic.d.ts +41 -0
  92. package/dist-types/server/operations/Plan.d.ts +41 -0
  93. package/dist-types/server/operations/PlanPublic.d.ts +41 -0
  94. package/dist-types/server/operations/Plans.d.ts +41 -0
  95. package/dist-types/server/operations/PopularShops.d.ts +41 -0
  96. package/dist-types/server/operations/PopularShopsPublic.d.ts +41 -0
  97. package/dist-types/server/operations/RadiusShops.d.ts +41 -0
  98. package/dist-types/server/operations/RecordVisit.d.ts +41 -0
  99. package/dist-types/server/operations/RedeemFirstTimeReward.d.ts +41 -0
  100. package/dist-types/server/operations/RedeemPointReward.d.ts +41 -0
  101. package/dist-types/server/operations/RedeemVisitReward.d.ts +41 -0
  102. package/dist-types/server/operations/SearchShopsPublic.d.ts +41 -0
  103. package/dist-types/server/operations/SearchSuggestion.d.ts +41 -0
  104. package/dist-types/server/operations/UpdateUser.d.ts +41 -0
  105. package/dist-types/server/operations/index.d.ts +26 -0
  106. package/package.json +66 -0
@@ -0,0 +1,2864 @@
1
+ {
2
+ "openapi": "3.1.0",
3
+ "info": {
4
+ "title": "Spark Rewards App API Structure",
5
+ "version": "2025-10-29",
6
+ "description": "Spark Rewards APP API Service"
7
+ },
8
+ "paths": {
9
+ "/plan": {
10
+ "get": {
11
+ "description": "Retrieves the reward plan details for a specific organization, including visits, points, and redeemable rewards for the authenticated user.",
12
+ "operationId": "Plan",
13
+ "parameters": [
14
+ {
15
+ "name": "org_id",
16
+ "in": "query",
17
+ "schema": {
18
+ "type": "string"
19
+ },
20
+ "required": true
21
+ }
22
+ ],
23
+ "responses": {
24
+ "200": {
25
+ "description": "Plan 200 response",
26
+ "content": {
27
+ "application/json": {
28
+ "schema": {
29
+ "$ref": "#/components/schemas/PlanResponseContent"
30
+ }
31
+ }
32
+ }
33
+ },
34
+ "400": {
35
+ "description": "ValidationException 400 response",
36
+ "content": {
37
+ "application/json": {
38
+ "schema": {
39
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
40
+ }
41
+ }
42
+ }
43
+ },
44
+ "500": {
45
+ "description": "RuntimeError 500 response",
46
+ "content": {
47
+ "application/json": {
48
+ "schema": {
49
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ },
57
+ "/plans": {
58
+ "get": {
59
+ "description": "Retrieves a paginated list of all reward plans associated with the authenticated user, ordered by nearest shop location.",
60
+ "operationId": "Plans",
61
+ "parameters": [
62
+ {
63
+ "name": "page",
64
+ "in": "query",
65
+ "schema": {
66
+ "type": "number"
67
+ }
68
+ },
69
+ {
70
+ "name": "limit",
71
+ "in": "query",
72
+ "schema": {
73
+ "type": "number"
74
+ }
75
+ },
76
+ {
77
+ "name": "lat",
78
+ "in": "query",
79
+ "schema": {
80
+ "type": "number",
81
+ "format": "double"
82
+ },
83
+ "required": true
84
+ },
85
+ {
86
+ "name": "lon",
87
+ "in": "query",
88
+ "schema": {
89
+ "type": "number",
90
+ "format": "double"
91
+ },
92
+ "required": true
93
+ }
94
+ ],
95
+ "responses": {
96
+ "200": {
97
+ "description": "Plans 200 response",
98
+ "content": {
99
+ "application/json": {
100
+ "schema": {
101
+ "$ref": "#/components/schemas/PlansResponseContent"
102
+ }
103
+ }
104
+ }
105
+ },
106
+ "400": {
107
+ "description": "ValidationException 400 response",
108
+ "content": {
109
+ "application/json": {
110
+ "schema": {
111
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
112
+ }
113
+ }
114
+ }
115
+ },
116
+ "500": {
117
+ "description": "RuntimeError 500 response",
118
+ "content": {
119
+ "application/json": {
120
+ "schema": {
121
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ },
129
+ "/plans/favorite": {
130
+ "get": {
131
+ "description": "Retrieves a paginated list of reward plans for organizations that the authenticated user has marked as favorites, ordered by nearest shop location.",
132
+ "operationId": "FavoritePlans",
133
+ "parameters": [
134
+ {
135
+ "name": "page",
136
+ "in": "query",
137
+ "schema": {
138
+ "type": "number"
139
+ }
140
+ },
141
+ {
142
+ "name": "limit",
143
+ "in": "query",
144
+ "schema": {
145
+ "type": "number"
146
+ }
147
+ },
148
+ {
149
+ "name": "lat",
150
+ "in": "query",
151
+ "schema": {
152
+ "type": "number",
153
+ "format": "double"
154
+ },
155
+ "required": true
156
+ },
157
+ {
158
+ "name": "lon",
159
+ "in": "query",
160
+ "schema": {
161
+ "type": "number",
162
+ "format": "double"
163
+ },
164
+ "required": true
165
+ }
166
+ ],
167
+ "responses": {
168
+ "200": {
169
+ "description": "FavoritePlans 200 response",
170
+ "content": {
171
+ "application/json": {
172
+ "schema": {
173
+ "$ref": "#/components/schemas/FavoritePlansResponseContent"
174
+ }
175
+ }
176
+ }
177
+ },
178
+ "400": {
179
+ "description": "ValidationException 400 response",
180
+ "content": {
181
+ "application/json": {
182
+ "schema": {
183
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
184
+ }
185
+ }
186
+ }
187
+ },
188
+ "500": {
189
+ "description": "RuntimeError 500 response",
190
+ "content": {
191
+ "application/json": {
192
+ "schema": {
193
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+ },
201
+ "/public/plan": {
202
+ "get": {
203
+ "description": "Retrieves the reward plan details for a specific organization, including visits, points for any user.",
204
+ "operationId": "PlanPublic",
205
+ "parameters": [
206
+ {
207
+ "name": "org_id",
208
+ "in": "query",
209
+ "schema": {
210
+ "type": "string"
211
+ },
212
+ "required": true
213
+ }
214
+ ],
215
+ "responses": {
216
+ "200": {
217
+ "description": "PlanPublic 200 response",
218
+ "content": {
219
+ "application/json": {
220
+ "schema": {
221
+ "$ref": "#/components/schemas/PlanPublicResponseContent"
222
+ }
223
+ }
224
+ }
225
+ },
226
+ "400": {
227
+ "description": "ValidationException 400 response",
228
+ "content": {
229
+ "application/json": {
230
+ "schema": {
231
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
232
+ }
233
+ }
234
+ }
235
+ },
236
+ "500": {
237
+ "description": "RuntimeError 500 response",
238
+ "content": {
239
+ "application/json": {
240
+ "schema": {
241
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
242
+ }
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
248
+ },
249
+ "/public/shops": {
250
+ "get": {
251
+ "description": "Public endpoint: Retrieves a paginated list of active shops ordered by distance from the provided location coordinates. Returns enriched shop data with organization information. No authentication required.",
252
+ "operationId": "NearbyShopsPublic",
253
+ "parameters": [
254
+ {
255
+ "name": "lat",
256
+ "in": "query",
257
+ "schema": {
258
+ "type": "number",
259
+ "format": "double"
260
+ }
261
+ },
262
+ {
263
+ "name": "lon",
264
+ "in": "query",
265
+ "schema": {
266
+ "type": "number",
267
+ "format": "double"
268
+ }
269
+ },
270
+ {
271
+ "name": "page",
272
+ "in": "query",
273
+ "schema": {
274
+ "type": "number"
275
+ }
276
+ },
277
+ {
278
+ "name": "filters",
279
+ "in": "query",
280
+ "schema": {
281
+ "type": "string"
282
+ }
283
+ }
284
+ ],
285
+ "responses": {
286
+ "200": {
287
+ "description": "NearbyShopsPublic 200 response",
288
+ "content": {
289
+ "application/json": {
290
+ "schema": {
291
+ "$ref": "#/components/schemas/NearbyShopsPublicResponseContent"
292
+ }
293
+ }
294
+ }
295
+ },
296
+ "400": {
297
+ "description": "ValidationException 400 response",
298
+ "content": {
299
+ "application/json": {
300
+ "schema": {
301
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
302
+ }
303
+ }
304
+ }
305
+ },
306
+ "500": {
307
+ "description": "RuntimeError 500 response",
308
+ "content": {
309
+ "application/json": {
310
+ "schema": {
311
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
312
+ }
313
+ }
314
+ }
315
+ }
316
+ }
317
+ }
318
+ },
319
+ "/public/shops/pinned": {
320
+ "get": {
321
+ "description": "Retrieves the pinned shop details for the authenticated user. Returns enriched shop data with organization information.",
322
+ "operationId": "PinnedShopPublic",
323
+ "parameters": [
324
+ {
325
+ "name": "shop_id",
326
+ "in": "query",
327
+ "schema": {
328
+ "type": "string"
329
+ },
330
+ "required": true
331
+ },
332
+ {
333
+ "name": "lat",
334
+ "in": "query",
335
+ "schema": {
336
+ "type": "number",
337
+ "format": "double"
338
+ },
339
+ "required": true
340
+ },
341
+ {
342
+ "name": "lon",
343
+ "in": "query",
344
+ "schema": {
345
+ "type": "number",
346
+ "format": "double"
347
+ },
348
+ "required": true
349
+ }
350
+ ],
351
+ "responses": {
352
+ "200": {
353
+ "description": "PinnedShopPublic 200 response",
354
+ "content": {
355
+ "application/json": {
356
+ "schema": {
357
+ "$ref": "#/components/schemas/PinnedShopPublicResponseContent"
358
+ }
359
+ }
360
+ }
361
+ },
362
+ "400": {
363
+ "description": "ValidationException 400 response",
364
+ "content": {
365
+ "application/json": {
366
+ "schema": {
367
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
368
+ }
369
+ }
370
+ }
371
+ },
372
+ "500": {
373
+ "description": "RuntimeError 500 response",
374
+ "content": {
375
+ "application/json": {
376
+ "schema": {
377
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
378
+ }
379
+ }
380
+ }
381
+ }
382
+ }
383
+ }
384
+ },
385
+ "/public/shops/popular": {
386
+ "get": {
387
+ "description": "Retrieves a paginated list of popular shops ordered by distance from the provided location coordinates. Returns enriched shop data with organization information.",
388
+ "operationId": "PopularShopsPublic",
389
+ "parameters": [
390
+ {
391
+ "name": "lat",
392
+ "in": "query",
393
+ "schema": {
394
+ "type": "number",
395
+ "format": "double"
396
+ }
397
+ },
398
+ {
399
+ "name": "lon",
400
+ "in": "query",
401
+ "schema": {
402
+ "type": "number",
403
+ "format": "double"
404
+ }
405
+ },
406
+ {
407
+ "name": "page",
408
+ "in": "query",
409
+ "schema": {
410
+ "type": "number"
411
+ }
412
+ },
413
+ {
414
+ "name": "filters",
415
+ "in": "query",
416
+ "schema": {
417
+ "type": "string"
418
+ }
419
+ }
420
+ ],
421
+ "responses": {
422
+ "200": {
423
+ "description": "PopularShopsPublic 200 response",
424
+ "content": {
425
+ "application/json": {
426
+ "schema": {
427
+ "$ref": "#/components/schemas/PopularShopsPublicResponseContent"
428
+ }
429
+ }
430
+ }
431
+ },
432
+ "400": {
433
+ "description": "ValidationException 400 response",
434
+ "content": {
435
+ "application/json": {
436
+ "schema": {
437
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
438
+ }
439
+ }
440
+ }
441
+ },
442
+ "500": {
443
+ "description": "RuntimeError 500 response",
444
+ "content": {
445
+ "application/json": {
446
+ "schema": {
447
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
448
+ }
449
+ }
450
+ }
451
+ }
452
+ }
453
+ }
454
+ },
455
+ "/public/shops/radius": {
456
+ "get": {
457
+ "description": "Retrieves shops within a specified radius from the provided location coordinates. Returns enriched shop data with organization information.",
458
+ "operationId": "RadiusShops",
459
+ "parameters": [
460
+ {
461
+ "name": "lat",
462
+ "in": "query",
463
+ "schema": {
464
+ "type": "number",
465
+ "format": "double"
466
+ }
467
+ },
468
+ {
469
+ "name": "lon",
470
+ "in": "query",
471
+ "schema": {
472
+ "type": "number",
473
+ "format": "double"
474
+ }
475
+ },
476
+ {
477
+ "name": "page",
478
+ "in": "query",
479
+ "schema": {
480
+ "type": "number"
481
+ }
482
+ },
483
+ {
484
+ "name": "filters",
485
+ "in": "query",
486
+ "schema": {
487
+ "type": "string"
488
+ }
489
+ }
490
+ ],
491
+ "responses": {
492
+ "200": {
493
+ "description": "RadiusShops 200 response",
494
+ "content": {
495
+ "application/json": {
496
+ "schema": {
497
+ "$ref": "#/components/schemas/RadiusShopsResponseContent"
498
+ }
499
+ }
500
+ }
501
+ },
502
+ "400": {
503
+ "description": "ValidationException 400 response",
504
+ "content": {
505
+ "application/json": {
506
+ "schema": {
507
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
508
+ }
509
+ }
510
+ }
511
+ },
512
+ "500": {
513
+ "description": "RuntimeError 500 response",
514
+ "content": {
515
+ "application/json": {
516
+ "schema": {
517
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
518
+ }
519
+ }
520
+ }
521
+ }
522
+ }
523
+ }
524
+ },
525
+ "/public/shops/search": {
526
+ "get": {
527
+ "description": "Retrieves a paginated list of shops based on the provided search query. Returns enriched shop data with organization information.",
528
+ "operationId": "SearchShopsPublic",
529
+ "parameters": [
530
+ {
531
+ "name": "q",
532
+ "in": "query",
533
+ "schema": {
534
+ "type": "string"
535
+ },
536
+ "required": true
537
+ },
538
+ {
539
+ "name": "limit",
540
+ "in": "query",
541
+ "schema": {
542
+ "type": "number"
543
+ }
544
+ },
545
+ {
546
+ "name": "lat",
547
+ "in": "query",
548
+ "schema": {
549
+ "type": "number",
550
+ "format": "double"
551
+ }
552
+ },
553
+ {
554
+ "name": "lon",
555
+ "in": "query",
556
+ "schema": {
557
+ "type": "number",
558
+ "format": "double"
559
+ }
560
+ },
561
+ {
562
+ "name": "page",
563
+ "in": "query",
564
+ "schema": {
565
+ "type": "number"
566
+ }
567
+ },
568
+ {
569
+ "name": "filters",
570
+ "in": "query",
571
+ "schema": {
572
+ "type": "string"
573
+ }
574
+ }
575
+ ],
576
+ "responses": {
577
+ "200": {
578
+ "description": "SearchShopsPublic 200 response",
579
+ "content": {
580
+ "application/json": {
581
+ "schema": {
582
+ "$ref": "#/components/schemas/SearchShopsPublicResponseContent"
583
+ }
584
+ }
585
+ }
586
+ },
587
+ "400": {
588
+ "description": "ValidationException 400 response",
589
+ "content": {
590
+ "application/json": {
591
+ "schema": {
592
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
593
+ }
594
+ }
595
+ }
596
+ },
597
+ "500": {
598
+ "description": "RuntimeError 500 response",
599
+ "content": {
600
+ "application/json": {
601
+ "schema": {
602
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
603
+ }
604
+ }
605
+ }
606
+ }
607
+ }
608
+ }
609
+ },
610
+ "/public/shops/search/suggestion": {
611
+ "get": {
612
+ "description": "Retrieves search suggestions for shops based on the provided search query. Returns matching shop and organization names.",
613
+ "operationId": "SearchSuggestion",
614
+ "parameters": [
615
+ {
616
+ "name": "q",
617
+ "in": "query",
618
+ "schema": {
619
+ "type": "string"
620
+ },
621
+ "required": true
622
+ },
623
+ {
624
+ "name": "limit",
625
+ "in": "query",
626
+ "schema": {
627
+ "type": "number"
628
+ }
629
+ },
630
+ {
631
+ "name": "lat",
632
+ "in": "query",
633
+ "schema": {
634
+ "type": "number",
635
+ "format": "double"
636
+ }
637
+ },
638
+ {
639
+ "name": "lon",
640
+ "in": "query",
641
+ "schema": {
642
+ "type": "number",
643
+ "format": "double"
644
+ }
645
+ }
646
+ ],
647
+ "responses": {
648
+ "200": {
649
+ "description": "SearchSuggestion 200 response",
650
+ "content": {
651
+ "application/json": {
652
+ "schema": {
653
+ "$ref": "#/components/schemas/SearchSuggestionResponseContent"
654
+ }
655
+ }
656
+ }
657
+ },
658
+ "400": {
659
+ "description": "ValidationException 400 response",
660
+ "content": {
661
+ "application/json": {
662
+ "schema": {
663
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
664
+ }
665
+ }
666
+ }
667
+ },
668
+ "500": {
669
+ "description": "RuntimeError 500 response",
670
+ "content": {
671
+ "application/json": {
672
+ "schema": {
673
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
674
+ }
675
+ }
676
+ }
677
+ }
678
+ }
679
+ }
680
+ },
681
+ "/public/shops/shop/{shop_id}": {
682
+ "get": {
683
+ "description": "Retrieves detailed information for a specific shop by its ID, including organization details, menu, location, and shop hours.",
684
+ "operationId": "GetShopPublic",
685
+ "parameters": [
686
+ {
687
+ "name": "shop_id",
688
+ "in": "path",
689
+ "schema": {
690
+ "type": "string"
691
+ },
692
+ "required": true
693
+ }
694
+ ],
695
+ "responses": {
696
+ "200": {
697
+ "description": "GetShopPublic 200 response",
698
+ "content": {
699
+ "application/json": {
700
+ "schema": {
701
+ "$ref": "#/components/schemas/GetShopPublicResponseContent"
702
+ }
703
+ }
704
+ }
705
+ },
706
+ "400": {
707
+ "description": "ValidationException 400 response",
708
+ "content": {
709
+ "application/json": {
710
+ "schema": {
711
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
712
+ }
713
+ }
714
+ }
715
+ },
716
+ "404": {
717
+ "description": "NotFoundError 404 response",
718
+ "content": {
719
+ "application/json": {
720
+ "schema": {
721
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
722
+ }
723
+ }
724
+ }
725
+ },
726
+ "500": {
727
+ "description": "RuntimeError 500 response",
728
+ "content": {
729
+ "application/json": {
730
+ "schema": {
731
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
732
+ }
733
+ }
734
+ }
735
+ }
736
+ }
737
+ }
738
+ },
739
+ "/rewards/redeem/first-time": {
740
+ "put": {
741
+ "description": "Redeems a first-time reward for the authenticated user from a specific organization. This can only be redeemed once per user per organization.",
742
+ "operationId": "RedeemFirstTimeReward",
743
+ "parameters": [
744
+ {
745
+ "name": "org_id",
746
+ "in": "query",
747
+ "schema": {
748
+ "type": "string"
749
+ },
750
+ "required": true
751
+ }
752
+ ],
753
+ "responses": {
754
+ "200": {
755
+ "description": "RedeemFirstTimeReward 200 response",
756
+ "content": {
757
+ "application/json": {
758
+ "schema": {
759
+ "$ref": "#/components/schemas/RedeemFirstTimeRewardResponseContent"
760
+ }
761
+ }
762
+ }
763
+ },
764
+ "400": {
765
+ "description": "ValidationException 400 response",
766
+ "content": {
767
+ "application/json": {
768
+ "schema": {
769
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
770
+ }
771
+ }
772
+ }
773
+ },
774
+ "500": {
775
+ "description": "RuntimeError 500 response",
776
+ "content": {
777
+ "application/json": {
778
+ "schema": {
779
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
780
+ }
781
+ }
782
+ }
783
+ }
784
+ }
785
+ }
786
+ },
787
+ "/rewards/redeem/point": {
788
+ "put": {
789
+ "description": "Redeems a point-based reward for the authenticated user using accumulated points. The required points are deducted from the user's total points balance.",
790
+ "operationId": "RedeemPointReward",
791
+ "parameters": [
792
+ {
793
+ "name": "org_id",
794
+ "in": "query",
795
+ "schema": {
796
+ "type": "string"
797
+ },
798
+ "required": true
799
+ },
800
+ {
801
+ "name": "reward_id",
802
+ "in": "query",
803
+ "schema": {
804
+ "type": "string"
805
+ },
806
+ "required": true
807
+ }
808
+ ],
809
+ "responses": {
810
+ "200": {
811
+ "description": "RedeemPointReward 200 response",
812
+ "content": {
813
+ "application/json": {
814
+ "schema": {
815
+ "$ref": "#/components/schemas/RedeemPointRewardResponseContent"
816
+ }
817
+ }
818
+ }
819
+ },
820
+ "400": {
821
+ "description": "ValidationException 400 response",
822
+ "content": {
823
+ "application/json": {
824
+ "schema": {
825
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
826
+ }
827
+ }
828
+ }
829
+ },
830
+ "500": {
831
+ "description": "RuntimeError 500 response",
832
+ "content": {
833
+ "application/json": {
834
+ "schema": {
835
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
836
+ }
837
+ }
838
+ }
839
+ }
840
+ }
841
+ }
842
+ },
843
+ "/rewards/redeem/visit": {
844
+ "put": {
845
+ "description": "Redeems a visit-based reward for the authenticated user. This reward is earned after completing the required number of visits for a reward plan.",
846
+ "operationId": "RedeemVisitReward",
847
+ "parameters": [
848
+ {
849
+ "name": "reward_id",
850
+ "in": "query",
851
+ "schema": {
852
+ "type": "string"
853
+ },
854
+ "required": true
855
+ }
856
+ ],
857
+ "responses": {
858
+ "200": {
859
+ "description": "RedeemVisitReward 200 response",
860
+ "content": {
861
+ "application/json": {
862
+ "schema": {
863
+ "$ref": "#/components/schemas/RedeemVisitRewardResponseContent"
864
+ }
865
+ }
866
+ }
867
+ },
868
+ "400": {
869
+ "description": "ValidationException 400 response",
870
+ "content": {
871
+ "application/json": {
872
+ "schema": {
873
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
874
+ }
875
+ }
876
+ }
877
+ },
878
+ "500": {
879
+ "description": "RuntimeError 500 response",
880
+ "content": {
881
+ "application/json": {
882
+ "schema": {
883
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
884
+ }
885
+ }
886
+ }
887
+ }
888
+ }
889
+ }
890
+ },
891
+ "/shops": {
892
+ "get": {
893
+ "description": "Retrieves a paginated list of active shops ordered by distance from the provided location coordinates. Returns enriched shop data with organization information.",
894
+ "operationId": "NearbyShops",
895
+ "parameters": [
896
+ {
897
+ "name": "lat",
898
+ "in": "query",
899
+ "schema": {
900
+ "type": "number",
901
+ "format": "double"
902
+ }
903
+ },
904
+ {
905
+ "name": "lon",
906
+ "in": "query",
907
+ "schema": {
908
+ "type": "number",
909
+ "format": "double"
910
+ }
911
+ },
912
+ {
913
+ "name": "page",
914
+ "in": "query",
915
+ "schema": {
916
+ "type": "number"
917
+ }
918
+ },
919
+ {
920
+ "name": "filters",
921
+ "in": "query",
922
+ "schema": {
923
+ "type": "string"
924
+ }
925
+ }
926
+ ],
927
+ "responses": {
928
+ "200": {
929
+ "description": "NearbyShops 200 response",
930
+ "content": {
931
+ "application/json": {
932
+ "schema": {
933
+ "$ref": "#/components/schemas/NearbyShopsResponseContent"
934
+ }
935
+ }
936
+ }
937
+ },
938
+ "400": {
939
+ "description": "ValidationException 400 response",
940
+ "content": {
941
+ "application/json": {
942
+ "schema": {
943
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
944
+ }
945
+ }
946
+ }
947
+ },
948
+ "500": {
949
+ "description": "RuntimeError 500 response",
950
+ "content": {
951
+ "application/json": {
952
+ "schema": {
953
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
954
+ }
955
+ }
956
+ }
957
+ }
958
+ }
959
+ }
960
+ },
961
+ "/shops/favorite": {
962
+ "get": {
963
+ "description": "Retrieves a paginated list of shops from organizations that the authenticated user has marked as favorites, ordered by distance from the provided location coordinates.",
964
+ "operationId": "FavoriteShops",
965
+ "parameters": [
966
+ {
967
+ "name": "lat",
968
+ "in": "query",
969
+ "schema": {
970
+ "type": "number",
971
+ "format": "double"
972
+ }
973
+ },
974
+ {
975
+ "name": "lon",
976
+ "in": "query",
977
+ "schema": {
978
+ "type": "number",
979
+ "format": "double"
980
+ }
981
+ },
982
+ {
983
+ "name": "page",
984
+ "in": "query",
985
+ "schema": {
986
+ "type": "number"
987
+ }
988
+ },
989
+ {
990
+ "name": "filters",
991
+ "in": "query",
992
+ "schema": {
993
+ "type": "string"
994
+ }
995
+ }
996
+ ],
997
+ "responses": {
998
+ "200": {
999
+ "description": "FavoriteShops 200 response",
1000
+ "content": {
1001
+ "application/json": {
1002
+ "schema": {
1003
+ "$ref": "#/components/schemas/FavoriteShopsResponseContent"
1004
+ }
1005
+ }
1006
+ }
1007
+ },
1008
+ "400": {
1009
+ "description": "ValidationException 400 response",
1010
+ "content": {
1011
+ "application/json": {
1012
+ "schema": {
1013
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1014
+ }
1015
+ }
1016
+ }
1017
+ },
1018
+ "500": {
1019
+ "description": "RuntimeError 500 response",
1020
+ "content": {
1021
+ "application/json": {
1022
+ "schema": {
1023
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1024
+ }
1025
+ }
1026
+ }
1027
+ }
1028
+ }
1029
+ }
1030
+ },
1031
+ "/shops/nearest": {
1032
+ "get": {
1033
+ "description": "Retrieves the single nearest active shop to the provided location coordinates for a specific organization.",
1034
+ "operationId": "NearestShop",
1035
+ "parameters": [
1036
+ {
1037
+ "name": "shop_name",
1038
+ "in": "query",
1039
+ "schema": {
1040
+ "type": "string"
1041
+ },
1042
+ "required": true
1043
+ },
1044
+ {
1045
+ "name": "lat",
1046
+ "in": "query",
1047
+ "schema": {
1048
+ "type": "number",
1049
+ "format": "double"
1050
+ },
1051
+ "required": true
1052
+ },
1053
+ {
1054
+ "name": "lon",
1055
+ "in": "query",
1056
+ "schema": {
1057
+ "type": "number",
1058
+ "format": "double"
1059
+ },
1060
+ "required": true
1061
+ }
1062
+ ],
1063
+ "responses": {
1064
+ "200": {
1065
+ "description": "NearestShop 200 response",
1066
+ "content": {
1067
+ "application/json": {
1068
+ "schema": {
1069
+ "$ref": "#/components/schemas/NearestShopResponseContent"
1070
+ }
1071
+ }
1072
+ }
1073
+ },
1074
+ "400": {
1075
+ "description": "ValidationException 400 response",
1076
+ "content": {
1077
+ "application/json": {
1078
+ "schema": {
1079
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1080
+ }
1081
+ }
1082
+ }
1083
+ },
1084
+ "500": {
1085
+ "description": "RuntimeError 500 response",
1086
+ "content": {
1087
+ "application/json": {
1088
+ "schema": {
1089
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1090
+ }
1091
+ }
1092
+ }
1093
+ }
1094
+ }
1095
+ }
1096
+ },
1097
+ "/shops/pinned": {
1098
+ "get": {
1099
+ "description": "Retrieves the pinned shop details for the authenticated user. Returns enriched shop data with organization information.",
1100
+ "operationId": "PinnedShop",
1101
+ "parameters": [
1102
+ {
1103
+ "name": "shop_id",
1104
+ "in": "query",
1105
+ "schema": {
1106
+ "type": "string"
1107
+ },
1108
+ "required": true
1109
+ },
1110
+ {
1111
+ "name": "lat",
1112
+ "in": "query",
1113
+ "schema": {
1114
+ "type": "number",
1115
+ "format": "double"
1116
+ },
1117
+ "required": true
1118
+ },
1119
+ {
1120
+ "name": "lon",
1121
+ "in": "query",
1122
+ "schema": {
1123
+ "type": "number",
1124
+ "format": "double"
1125
+ },
1126
+ "required": true
1127
+ }
1128
+ ],
1129
+ "responses": {
1130
+ "200": {
1131
+ "description": "PinnedShop 200 response",
1132
+ "content": {
1133
+ "application/json": {
1134
+ "schema": {
1135
+ "$ref": "#/components/schemas/PinnedShopResponseContent"
1136
+ }
1137
+ }
1138
+ }
1139
+ },
1140
+ "400": {
1141
+ "description": "ValidationException 400 response",
1142
+ "content": {
1143
+ "application/json": {
1144
+ "schema": {
1145
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1146
+ }
1147
+ }
1148
+ }
1149
+ },
1150
+ "500": {
1151
+ "description": "RuntimeError 500 response",
1152
+ "content": {
1153
+ "application/json": {
1154
+ "schema": {
1155
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1156
+ }
1157
+ }
1158
+ }
1159
+ }
1160
+ }
1161
+ }
1162
+ },
1163
+ "/shops/popular": {
1164
+ "get": {
1165
+ "description": "Retrieves a paginated list of popular shops ordered by distance from the provided location coordinates. Returns enriched shop data with organization information.",
1166
+ "operationId": "PopularShops",
1167
+ "parameters": [
1168
+ {
1169
+ "name": "lat",
1170
+ "in": "query",
1171
+ "schema": {
1172
+ "type": "number",
1173
+ "format": "double"
1174
+ }
1175
+ },
1176
+ {
1177
+ "name": "lon",
1178
+ "in": "query",
1179
+ "schema": {
1180
+ "type": "number",
1181
+ "format": "double"
1182
+ }
1183
+ },
1184
+ {
1185
+ "name": "page",
1186
+ "in": "query",
1187
+ "schema": {
1188
+ "type": "number"
1189
+ }
1190
+ },
1191
+ {
1192
+ "name": "filters",
1193
+ "in": "query",
1194
+ "schema": {
1195
+ "type": "string"
1196
+ }
1197
+ }
1198
+ ],
1199
+ "responses": {
1200
+ "200": {
1201
+ "description": "PopularShops 200 response",
1202
+ "content": {
1203
+ "application/json": {
1204
+ "schema": {
1205
+ "$ref": "#/components/schemas/PopularShopsResponseContent"
1206
+ }
1207
+ }
1208
+ }
1209
+ },
1210
+ "400": {
1211
+ "description": "ValidationException 400 response",
1212
+ "content": {
1213
+ "application/json": {
1214
+ "schema": {
1215
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1216
+ }
1217
+ }
1218
+ }
1219
+ },
1220
+ "500": {
1221
+ "description": "RuntimeError 500 response",
1222
+ "content": {
1223
+ "application/json": {
1224
+ "schema": {
1225
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1226
+ }
1227
+ }
1228
+ }
1229
+ }
1230
+ }
1231
+ }
1232
+ },
1233
+ "/shops/shop/{shop_id}": {
1234
+ "get": {
1235
+ "description": "Retrieves detailed information for a specific shop by its ID, including organization details, menu, location, and shop hours.",
1236
+ "operationId": "GetShop",
1237
+ "parameters": [
1238
+ {
1239
+ "name": "shop_id",
1240
+ "in": "path",
1241
+ "schema": {
1242
+ "type": "string"
1243
+ },
1244
+ "required": true
1245
+ }
1246
+ ],
1247
+ "responses": {
1248
+ "200": {
1249
+ "description": "GetShop 200 response",
1250
+ "content": {
1251
+ "application/json": {
1252
+ "schema": {
1253
+ "$ref": "#/components/schemas/GetShopResponseContent"
1254
+ }
1255
+ }
1256
+ }
1257
+ },
1258
+ "400": {
1259
+ "description": "ValidationException 400 response",
1260
+ "content": {
1261
+ "application/json": {
1262
+ "schema": {
1263
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1264
+ }
1265
+ }
1266
+ }
1267
+ },
1268
+ "404": {
1269
+ "description": "NotFoundError 404 response",
1270
+ "content": {
1271
+ "application/json": {
1272
+ "schema": {
1273
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
1274
+ }
1275
+ }
1276
+ }
1277
+ },
1278
+ "500": {
1279
+ "description": "RuntimeError 500 response",
1280
+ "content": {
1281
+ "application/json": {
1282
+ "schema": {
1283
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1284
+ }
1285
+ }
1286
+ }
1287
+ }
1288
+ }
1289
+ }
1290
+ },
1291
+ "/user": {
1292
+ "delete": {
1293
+ "description": "Permanently deletes the authenticated user's account and all associated data from the system. This action cannot be undone.",
1294
+ "operationId": "DeleteUser",
1295
+ "responses": {
1296
+ "200": {
1297
+ "description": "DeleteUser 200 response",
1298
+ "content": {
1299
+ "application/json": {
1300
+ "schema": {
1301
+ "$ref": "#/components/schemas/DeleteUserResponseContent"
1302
+ }
1303
+ }
1304
+ }
1305
+ },
1306
+ "400": {
1307
+ "description": "ValidationException 400 response",
1308
+ "content": {
1309
+ "application/json": {
1310
+ "schema": {
1311
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1312
+ }
1313
+ }
1314
+ }
1315
+ },
1316
+ "500": {
1317
+ "description": "RuntimeError 500 response",
1318
+ "content": {
1319
+ "application/json": {
1320
+ "schema": {
1321
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1322
+ }
1323
+ }
1324
+ }
1325
+ }
1326
+ }
1327
+ },
1328
+ "get": {
1329
+ "description": "Retrieves the authenticated user's profile information, including personal details, preferences, visit statistics, and reward counts.",
1330
+ "operationId": "GetUser",
1331
+ "responses": {
1332
+ "200": {
1333
+ "description": "GetUser 200 response",
1334
+ "content": {
1335
+ "application/json": {
1336
+ "schema": {
1337
+ "$ref": "#/components/schemas/GetUserResponseContent"
1338
+ }
1339
+ }
1340
+ }
1341
+ },
1342
+ "400": {
1343
+ "description": "ValidationException 400 response",
1344
+ "content": {
1345
+ "application/json": {
1346
+ "schema": {
1347
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1348
+ }
1349
+ }
1350
+ }
1351
+ },
1352
+ "500": {
1353
+ "description": "RuntimeError 500 response",
1354
+ "content": {
1355
+ "application/json": {
1356
+ "schema": {
1357
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1358
+ }
1359
+ }
1360
+ }
1361
+ }
1362
+ }
1363
+ },
1364
+ "put": {
1365
+ "description": "Updates the authenticated user's profile information, including personal details and preferences. Only provided fields will be updated.",
1366
+ "operationId": "UpdateUser",
1367
+ "requestBody": {
1368
+ "content": {
1369
+ "application/json": {
1370
+ "schema": {
1371
+ "$ref": "#/components/schemas/UpdateUserRequestContent"
1372
+ }
1373
+ }
1374
+ }
1375
+ },
1376
+ "responses": {
1377
+ "200": {
1378
+ "description": "UpdateUser 200 response",
1379
+ "content": {
1380
+ "application/json": {
1381
+ "schema": {
1382
+ "$ref": "#/components/schemas/UpdateUserResponseContent"
1383
+ }
1384
+ }
1385
+ }
1386
+ },
1387
+ "400": {
1388
+ "description": "ValidationException 400 response",
1389
+ "content": {
1390
+ "application/json": {
1391
+ "schema": {
1392
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1393
+ }
1394
+ }
1395
+ }
1396
+ },
1397
+ "500": {
1398
+ "description": "RuntimeError 500 response",
1399
+ "content": {
1400
+ "application/json": {
1401
+ "schema": {
1402
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1403
+ }
1404
+ }
1405
+ }
1406
+ }
1407
+ }
1408
+ }
1409
+ },
1410
+ "/user/like": {
1411
+ "put": {
1412
+ "description": "Toggles the like status for an organization. If the organization is already liked, it will be unliked, and vice versa. Returns the current like status.",
1413
+ "operationId": "LikeOrg",
1414
+ "parameters": [
1415
+ {
1416
+ "name": "org_id",
1417
+ "in": "query",
1418
+ "schema": {
1419
+ "type": "string"
1420
+ },
1421
+ "required": true
1422
+ }
1423
+ ],
1424
+ "responses": {
1425
+ "200": {
1426
+ "description": "LikeOrg 200 response",
1427
+ "content": {
1428
+ "application/json": {
1429
+ "schema": {
1430
+ "$ref": "#/components/schemas/LikeOrgResponseContent"
1431
+ }
1432
+ }
1433
+ }
1434
+ },
1435
+ "400": {
1436
+ "description": "ValidationException 400 response",
1437
+ "content": {
1438
+ "application/json": {
1439
+ "schema": {
1440
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1441
+ }
1442
+ }
1443
+ }
1444
+ },
1445
+ "500": {
1446
+ "description": "RuntimeError 500 response",
1447
+ "content": {
1448
+ "application/json": {
1449
+ "schema": {
1450
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1451
+ }
1452
+ }
1453
+ }
1454
+ }
1455
+ }
1456
+ }
1457
+ },
1458
+ "/user/onboard": {
1459
+ "put": {
1460
+ "description": "Completes the onboarding process for a new user by marking their account as no longer new. Updates the user's newAccount status and returns the updated user profile.",
1461
+ "operationId": "OnboardUser",
1462
+ "responses": {
1463
+ "200": {
1464
+ "description": "OnboardUser 200 response",
1465
+ "content": {
1466
+ "application/json": {
1467
+ "schema": {
1468
+ "$ref": "#/components/schemas/OnboardUserResponseContent"
1469
+ }
1470
+ }
1471
+ }
1472
+ },
1473
+ "400": {
1474
+ "description": "ValidationException 400 response",
1475
+ "content": {
1476
+ "application/json": {
1477
+ "schema": {
1478
+ "$ref": "#/components/schemas/ValidationExceptionResponseContent"
1479
+ }
1480
+ }
1481
+ }
1482
+ },
1483
+ "500": {
1484
+ "description": "RuntimeError 500 response",
1485
+ "content": {
1486
+ "application/json": {
1487
+ "schema": {
1488
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1489
+ }
1490
+ }
1491
+ }
1492
+ }
1493
+ }
1494
+ }
1495
+ },
1496
+ "/visit": {
1497
+ "post": {
1498
+ "description": "Records a visit to a shop for the authenticated user. Updates visit counts, tracks spending, awards points, and triggers rewards when thresholds are met. Also handles first-time rewards and visit-based rewards.",
1499
+ "operationId": "RecordVisit",
1500
+ "parameters": [
1501
+ {
1502
+ "name": "shop_id",
1503
+ "in": "query",
1504
+ "schema": {
1505
+ "type": "string"
1506
+ },
1507
+ "required": true
1508
+ },
1509
+ {
1510
+ "name": "timestamp",
1511
+ "in": "query",
1512
+ "schema": {
1513
+ "type": "string"
1514
+ },
1515
+ "required": true
1516
+ },
1517
+ {
1518
+ "name": "lat",
1519
+ "in": "query",
1520
+ "schema": {
1521
+ "type": "number",
1522
+ "format": "double"
1523
+ },
1524
+ "required": true
1525
+ },
1526
+ {
1527
+ "name": "lon",
1528
+ "in": "query",
1529
+ "schema": {
1530
+ "type": "number",
1531
+ "format": "double"
1532
+ },
1533
+ "required": true
1534
+ }
1535
+ ],
1536
+ "responses": {
1537
+ "200": {
1538
+ "description": "RecordVisit 200 response",
1539
+ "content": {
1540
+ "application/json": {
1541
+ "schema": {
1542
+ "$ref": "#/components/schemas/RecordVisitResponseContent"
1543
+ }
1544
+ }
1545
+ }
1546
+ },
1547
+ "400": {
1548
+ "description": "InvalidOperationError 400 response",
1549
+ "content": {
1550
+ "application/json": {
1551
+ "schema": {
1552
+ "$ref": "#/components/schemas/InvalidOperationErrorResponseContent"
1553
+ }
1554
+ }
1555
+ }
1556
+ },
1557
+ "500": {
1558
+ "description": "RuntimeError 500 response",
1559
+ "content": {
1560
+ "application/json": {
1561
+ "schema": {
1562
+ "$ref": "#/components/schemas/RuntimeErrorResponseContent"
1563
+ }
1564
+ }
1565
+ }
1566
+ }
1567
+ }
1568
+ }
1569
+ }
1570
+ },
1571
+ "components": {
1572
+ "schemas": {
1573
+ "DeleteUserResponseContent": {
1574
+ "type": "object",
1575
+ "description": "Output for DeleteUser",
1576
+ "properties": {
1577
+ "message": {
1578
+ "type": "string"
1579
+ }
1580
+ }
1581
+ },
1582
+ "EnrichedShop": {
1583
+ "type": "object",
1584
+ "description": "Base shop structure returned from enrichList/enrichSingle",
1585
+ "properties": {
1586
+ "shop_id": {
1587
+ "type": "string"
1588
+ },
1589
+ "org_id": {
1590
+ "type": "string"
1591
+ },
1592
+ "preview": {
1593
+ "type": "string"
1594
+ },
1595
+ "name": {
1596
+ "type": "string"
1597
+ },
1598
+ "distance": {
1599
+ "type": "string"
1600
+ },
1601
+ "favorite": {
1602
+ "type": "boolean"
1603
+ },
1604
+ "location": {
1605
+ "$ref": "#/components/schemas/LocationDetails"
1606
+ },
1607
+ "shop_hours": {
1608
+ "type": "array",
1609
+ "items": {
1610
+ "$ref": "#/components/schemas/ShopHoursItem"
1611
+ },
1612
+ "description": "List of shop hours for all days"
1613
+ },
1614
+ "logo": {
1615
+ "type": "string"
1616
+ },
1617
+ "tags": {
1618
+ "type": "array",
1619
+ "items": {
1620
+ "type": "string"
1621
+ }
1622
+ }
1623
+ },
1624
+ "required": [
1625
+ "distance",
1626
+ "location",
1627
+ "name",
1628
+ "org_id",
1629
+ "preview",
1630
+ "shop_hours",
1631
+ "shop_id",
1632
+ "tags"
1633
+ ]
1634
+ },
1635
+ "FavoritePlansResponseContent": {
1636
+ "type": "object",
1637
+ "properties": {
1638
+ "value": {
1639
+ "type": "array",
1640
+ "items": {
1641
+ "$ref": "#/components/schemas/GroupedPlan"
1642
+ }
1643
+ },
1644
+ "count": {
1645
+ "type": "number"
1646
+ },
1647
+ "pagination": {
1648
+ "$ref": "#/components/schemas/PaginationInfo"
1649
+ }
1650
+ },
1651
+ "required": [
1652
+ "count",
1653
+ "pagination",
1654
+ "value"
1655
+ ]
1656
+ },
1657
+ "FavoriteShopsResponseContent": {
1658
+ "type": "object",
1659
+ "description": "Output for NearbyShops, FavoriteShops, PopularShops, RadiusShops",
1660
+ "properties": {
1661
+ "message": {
1662
+ "type": "string"
1663
+ },
1664
+ "value": {
1665
+ "type": "array",
1666
+ "items": {
1667
+ "$ref": "#/components/schemas/EnrichedShop"
1668
+ }
1669
+ },
1670
+ "count": {
1671
+ "type": "number"
1672
+ },
1673
+ "pagination": {
1674
+ "$ref": "#/components/schemas/PaginationInfo"
1675
+ }
1676
+ }
1677
+ },
1678
+ "FirstTimeReward": {
1679
+ "type": "object",
1680
+ "properties": {
1681
+ "active": {
1682
+ "type": "boolean"
1683
+ },
1684
+ "description": {
1685
+ "type": "string"
1686
+ }
1687
+ }
1688
+ },
1689
+ "GetShopPublicResponseContent": {
1690
+ "type": "object",
1691
+ "description": "Full shop details structure",
1692
+ "properties": {
1693
+ "id": {
1694
+ "type": "string"
1695
+ },
1696
+ "org_id": {
1697
+ "type": "string"
1698
+ },
1699
+ "shop_name": {
1700
+ "type": "string"
1701
+ },
1702
+ "org_name": {
1703
+ "type": "string"
1704
+ },
1705
+ "banner": {
1706
+ "type": "string"
1707
+ },
1708
+ "preview": {
1709
+ "type": "string"
1710
+ },
1711
+ "logo": {
1712
+ "type": "string"
1713
+ },
1714
+ "description": {
1715
+ "type": "string"
1716
+ },
1717
+ "country_code": {
1718
+ "type": "string"
1719
+ },
1720
+ "latitude": {
1721
+ "type": "number",
1722
+ "format": "double"
1723
+ },
1724
+ "longitude": {
1725
+ "type": "number",
1726
+ "format": "double"
1727
+ },
1728
+ "active": {
1729
+ "type": "boolean"
1730
+ },
1731
+ "menu": {
1732
+ "type": "string"
1733
+ },
1734
+ "phone_number": {
1735
+ "type": "string"
1736
+ },
1737
+ "location": {
1738
+ "$ref": "#/components/schemas/LocationDetails"
1739
+ },
1740
+ "shop_hours": {
1741
+ "type": "array",
1742
+ "items": {
1743
+ "$ref": "#/components/schemas/ShopHoursItem"
1744
+ },
1745
+ "description": "List of shop hours for all days"
1746
+ },
1747
+ "sent_setup": {
1748
+ "type": "boolean"
1749
+ },
1750
+ "setup": {
1751
+ "type": "boolean"
1752
+ },
1753
+ "tags": {
1754
+ "type": "array",
1755
+ "items": {
1756
+ "type": "string"
1757
+ }
1758
+ }
1759
+ },
1760
+ "required": [
1761
+ "active",
1762
+ "country_code",
1763
+ "description",
1764
+ "id",
1765
+ "location",
1766
+ "logo",
1767
+ "longitude",
1768
+ "org_id",
1769
+ "org_name",
1770
+ "preview",
1771
+ "setup",
1772
+ "shop_hours",
1773
+ "shop_name",
1774
+ "tags"
1775
+ ]
1776
+ },
1777
+ "GetShopResponseContent": {
1778
+ "type": "object",
1779
+ "description": "Full shop details structure",
1780
+ "properties": {
1781
+ "id": {
1782
+ "type": "string"
1783
+ },
1784
+ "org_id": {
1785
+ "type": "string"
1786
+ },
1787
+ "shop_name": {
1788
+ "type": "string"
1789
+ },
1790
+ "org_name": {
1791
+ "type": "string"
1792
+ },
1793
+ "banner": {
1794
+ "type": "string"
1795
+ },
1796
+ "preview": {
1797
+ "type": "string"
1798
+ },
1799
+ "logo": {
1800
+ "type": "string"
1801
+ },
1802
+ "description": {
1803
+ "type": "string"
1804
+ },
1805
+ "country_code": {
1806
+ "type": "string"
1807
+ },
1808
+ "latitude": {
1809
+ "type": "number",
1810
+ "format": "double"
1811
+ },
1812
+ "longitude": {
1813
+ "type": "number",
1814
+ "format": "double"
1815
+ },
1816
+ "active": {
1817
+ "type": "boolean"
1818
+ },
1819
+ "menu": {
1820
+ "type": "string"
1821
+ },
1822
+ "phone_number": {
1823
+ "type": "string"
1824
+ },
1825
+ "location": {
1826
+ "$ref": "#/components/schemas/LocationDetails"
1827
+ },
1828
+ "shop_hours": {
1829
+ "type": "array",
1830
+ "items": {
1831
+ "$ref": "#/components/schemas/ShopHoursItem"
1832
+ },
1833
+ "description": "List of shop hours for all days"
1834
+ },
1835
+ "sent_setup": {
1836
+ "type": "boolean"
1837
+ },
1838
+ "setup": {
1839
+ "type": "boolean"
1840
+ },
1841
+ "tags": {
1842
+ "type": "array",
1843
+ "items": {
1844
+ "type": "string"
1845
+ }
1846
+ }
1847
+ },
1848
+ "required": [
1849
+ "active",
1850
+ "country_code",
1851
+ "description",
1852
+ "id",
1853
+ "location",
1854
+ "logo",
1855
+ "longitude",
1856
+ "org_id",
1857
+ "org_name",
1858
+ "preview",
1859
+ "setup",
1860
+ "shop_hours",
1861
+ "shop_name",
1862
+ "tags"
1863
+ ]
1864
+ },
1865
+ "GetUserResponseContent": {
1866
+ "type": "object",
1867
+ "description": "Output for GetUser",
1868
+ "properties": {
1869
+ "message": {
1870
+ "type": "string"
1871
+ },
1872
+ "user": {
1873
+ "$ref": "#/components/schemas/User"
1874
+ }
1875
+ }
1876
+ },
1877
+ "GroupedPlan": {
1878
+ "type": "object",
1879
+ "properties": {
1880
+ "reward_plan": {
1881
+ "$ref": "#/components/schemas/RewardPlan"
1882
+ },
1883
+ "visits": {
1884
+ "type": "number"
1885
+ },
1886
+ "points": {
1887
+ "type": "number"
1888
+ },
1889
+ "redeemableRewards": {
1890
+ "type": "array",
1891
+ "items": {
1892
+ "$ref": "#/components/schemas/Reward"
1893
+ }
1894
+ },
1895
+ "visits_active": {
1896
+ "type": "boolean"
1897
+ },
1898
+ "points_active": {
1899
+ "type": "boolean"
1900
+ },
1901
+ "banner": {
1902
+ "type": "string"
1903
+ },
1904
+ "logo": {
1905
+ "type": "string"
1906
+ },
1907
+ "org_id": {
1908
+ "type": "string"
1909
+ },
1910
+ "shop_id": {
1911
+ "type": "string"
1912
+ },
1913
+ "name": {
1914
+ "type": "string"
1915
+ },
1916
+ "id": {
1917
+ "type": "string"
1918
+ },
1919
+ "active": {
1920
+ "type": "boolean"
1921
+ },
1922
+ "favorite": {
1923
+ "type": "boolean"
1924
+ },
1925
+ "num_redeemableRewards": {
1926
+ "type": "number"
1927
+ }
1928
+ },
1929
+ "required": [
1930
+ "active",
1931
+ "banner",
1932
+ "favorite",
1933
+ "id",
1934
+ "logo",
1935
+ "name",
1936
+ "num_redeemableRewards",
1937
+ "org_id",
1938
+ "points",
1939
+ "points_active",
1940
+ "redeemableRewards",
1941
+ "reward_plan",
1942
+ "shop_id",
1943
+ "visits",
1944
+ "visits_active"
1945
+ ]
1946
+ },
1947
+ "InvalidOperationErrorResponseContent": {
1948
+ "type": "object",
1949
+ "properties": {
1950
+ "message": {
1951
+ "type": "string"
1952
+ }
1953
+ }
1954
+ },
1955
+ "LikeOrgResponseContent": {
1956
+ "type": "object",
1957
+ "description": "Output for LikeOrg",
1958
+ "properties": {
1959
+ "message": {
1960
+ "type": "string"
1961
+ },
1962
+ "liked": {
1963
+ "type": "boolean"
1964
+ }
1965
+ }
1966
+ },
1967
+ "LocationDetails": {
1968
+ "type": "object",
1969
+ "description": "Location details for a shop",
1970
+ "properties": {
1971
+ "address": {
1972
+ "type": "string"
1973
+ },
1974
+ "city": {
1975
+ "type": "string"
1976
+ },
1977
+ "state": {
1978
+ "type": "string"
1979
+ },
1980
+ "zipcode": {
1981
+ "type": "string"
1982
+ }
1983
+ },
1984
+ "required": [
1985
+ "address",
1986
+ "city",
1987
+ "state",
1988
+ "zipcode"
1989
+ ]
1990
+ },
1991
+ "NearbyShopsPublicResponseContent": {
1992
+ "type": "object",
1993
+ "description": "Output for NearbyShops, FavoriteShops, PopularShops, RadiusShops",
1994
+ "properties": {
1995
+ "message": {
1996
+ "type": "string"
1997
+ },
1998
+ "value": {
1999
+ "type": "array",
2000
+ "items": {
2001
+ "$ref": "#/components/schemas/EnrichedShop"
2002
+ }
2003
+ },
2004
+ "count": {
2005
+ "type": "number"
2006
+ },
2007
+ "pagination": {
2008
+ "$ref": "#/components/schemas/PaginationInfo"
2009
+ }
2010
+ }
2011
+ },
2012
+ "NearbyShopsResponseContent": {
2013
+ "type": "object",
2014
+ "description": "Output for NearbyShops, FavoriteShops, PopularShops, RadiusShops",
2015
+ "properties": {
2016
+ "message": {
2017
+ "type": "string"
2018
+ },
2019
+ "value": {
2020
+ "type": "array",
2021
+ "items": {
2022
+ "$ref": "#/components/schemas/EnrichedShop"
2023
+ }
2024
+ },
2025
+ "count": {
2026
+ "type": "number"
2027
+ },
2028
+ "pagination": {
2029
+ "$ref": "#/components/schemas/PaginationInfo"
2030
+ }
2031
+ }
2032
+ },
2033
+ "NearestShopResponseContent": {
2034
+ "type": "object",
2035
+ "description": "Base shop structure returned from enrichList/enrichSingle",
2036
+ "properties": {
2037
+ "shop_id": {
2038
+ "type": "string"
2039
+ },
2040
+ "org_id": {
2041
+ "type": "string"
2042
+ },
2043
+ "preview": {
2044
+ "type": "string"
2045
+ },
2046
+ "name": {
2047
+ "type": "string"
2048
+ },
2049
+ "distance": {
2050
+ "type": "string"
2051
+ },
2052
+ "favorite": {
2053
+ "type": "boolean"
2054
+ },
2055
+ "location": {
2056
+ "$ref": "#/components/schemas/LocationDetails"
2057
+ },
2058
+ "shop_hours": {
2059
+ "type": "array",
2060
+ "items": {
2061
+ "$ref": "#/components/schemas/ShopHoursItem"
2062
+ },
2063
+ "description": "List of shop hours for all days"
2064
+ },
2065
+ "logo": {
2066
+ "type": "string"
2067
+ },
2068
+ "tags": {
2069
+ "type": "array",
2070
+ "items": {
2071
+ "type": "string"
2072
+ }
2073
+ }
2074
+ },
2075
+ "required": [
2076
+ "distance",
2077
+ "location",
2078
+ "name",
2079
+ "org_id",
2080
+ "preview",
2081
+ "shop_hours",
2082
+ "shop_id",
2083
+ "tags"
2084
+ ]
2085
+ },
2086
+ "NotFoundErrorResponseContent": {
2087
+ "type": "object",
2088
+ "properties": {
2089
+ "message": {
2090
+ "type": "string"
2091
+ }
2092
+ }
2093
+ },
2094
+ "OnboardUserResponseContent": {
2095
+ "type": "object",
2096
+ "description": "Output for OnboardUser",
2097
+ "properties": {
2098
+ "message": {
2099
+ "type": "string"
2100
+ },
2101
+ "user": {
2102
+ "$ref": "#/components/schemas/User"
2103
+ }
2104
+ }
2105
+ },
2106
+ "PaginationInfo": {
2107
+ "type": "object",
2108
+ "properties": {
2109
+ "currentPage": {
2110
+ "type": "number"
2111
+ },
2112
+ "limit": {
2113
+ "type": "number"
2114
+ },
2115
+ "hasMore": {
2116
+ "type": "boolean"
2117
+ },
2118
+ "nextPage": {
2119
+ "type": "number",
2120
+ "description": "The next page number, or null if there are no more pages"
2121
+ }
2122
+ },
2123
+ "required": [
2124
+ "hasMore",
2125
+ "limit",
2126
+ "nextPage"
2127
+ ]
2128
+ },
2129
+ "PinnedShopPublicResponseContent": {
2130
+ "type": "object",
2131
+ "description": "Base shop structure returned from enrichList/enrichSingle",
2132
+ "properties": {
2133
+ "shop_id": {
2134
+ "type": "string"
2135
+ },
2136
+ "org_id": {
2137
+ "type": "string"
2138
+ },
2139
+ "preview": {
2140
+ "type": "string"
2141
+ },
2142
+ "name": {
2143
+ "type": "string"
2144
+ },
2145
+ "distance": {
2146
+ "type": "string"
2147
+ },
2148
+ "favorite": {
2149
+ "type": "boolean"
2150
+ },
2151
+ "location": {
2152
+ "$ref": "#/components/schemas/LocationDetails"
2153
+ },
2154
+ "shop_hours": {
2155
+ "type": "array",
2156
+ "items": {
2157
+ "$ref": "#/components/schemas/ShopHoursItem"
2158
+ },
2159
+ "description": "List of shop hours for all days"
2160
+ },
2161
+ "logo": {
2162
+ "type": "string"
2163
+ },
2164
+ "tags": {
2165
+ "type": "array",
2166
+ "items": {
2167
+ "type": "string"
2168
+ }
2169
+ }
2170
+ },
2171
+ "required": [
2172
+ "distance",
2173
+ "location",
2174
+ "name",
2175
+ "org_id",
2176
+ "preview",
2177
+ "shop_hours",
2178
+ "shop_id",
2179
+ "tags"
2180
+ ]
2181
+ },
2182
+ "PinnedShopResponseContent": {
2183
+ "type": "object",
2184
+ "description": "Base shop structure returned from enrichList/enrichSingle",
2185
+ "properties": {
2186
+ "shop_id": {
2187
+ "type": "string"
2188
+ },
2189
+ "org_id": {
2190
+ "type": "string"
2191
+ },
2192
+ "preview": {
2193
+ "type": "string"
2194
+ },
2195
+ "name": {
2196
+ "type": "string"
2197
+ },
2198
+ "distance": {
2199
+ "type": "string"
2200
+ },
2201
+ "favorite": {
2202
+ "type": "boolean"
2203
+ },
2204
+ "location": {
2205
+ "$ref": "#/components/schemas/LocationDetails"
2206
+ },
2207
+ "shop_hours": {
2208
+ "type": "array",
2209
+ "items": {
2210
+ "$ref": "#/components/schemas/ShopHoursItem"
2211
+ },
2212
+ "description": "List of shop hours for all days"
2213
+ },
2214
+ "logo": {
2215
+ "type": "string"
2216
+ },
2217
+ "tags": {
2218
+ "type": "array",
2219
+ "items": {
2220
+ "type": "string"
2221
+ }
2222
+ }
2223
+ },
2224
+ "required": [
2225
+ "distance",
2226
+ "location",
2227
+ "name",
2228
+ "org_id",
2229
+ "preview",
2230
+ "shop_hours",
2231
+ "shop_id",
2232
+ "tags"
2233
+ ]
2234
+ },
2235
+ "PlanPublicResponseContent": {
2236
+ "type": "object",
2237
+ "properties": {
2238
+ "reward_plan": {
2239
+ "$ref": "#/components/schemas/RewardPlan"
2240
+ },
2241
+ "visits": {
2242
+ "type": "number"
2243
+ },
2244
+ "points": {
2245
+ "type": "number"
2246
+ },
2247
+ "redeemableRewards": {
2248
+ "type": "array",
2249
+ "items": {
2250
+ "$ref": "#/components/schemas/Reward"
2251
+ }
2252
+ },
2253
+ "min_spend": {
2254
+ "type": "number"
2255
+ },
2256
+ "visits_active": {
2257
+ "type": "boolean"
2258
+ },
2259
+ "points_active": {
2260
+ "type": "boolean"
2261
+ },
2262
+ "firstPlan": {
2263
+ "type": "boolean"
2264
+ },
2265
+ "id": {
2266
+ "type": "string"
2267
+ },
2268
+ "active": {
2269
+ "type": "boolean"
2270
+ },
2271
+ "organization_id": {
2272
+ "type": "string"
2273
+ },
2274
+ "name": {
2275
+ "type": "string"
2276
+ },
2277
+ "favorite": {
2278
+ "type": "boolean"
2279
+ },
2280
+ "first_time_reward": {
2281
+ "$ref": "#/components/schemas/FirstTimeReward"
2282
+ }
2283
+ },
2284
+ "required": [
2285
+ "active",
2286
+ "favorite",
2287
+ "firstPlan",
2288
+ "first_time_reward",
2289
+ "id",
2290
+ "name",
2291
+ "points",
2292
+ "points_active",
2293
+ "redeemableRewards",
2294
+ "reward_plan",
2295
+ "visits",
2296
+ "visits_active"
2297
+ ]
2298
+ },
2299
+ "PlanResponseContent": {
2300
+ "type": "object",
2301
+ "properties": {
2302
+ "reward_plan": {
2303
+ "$ref": "#/components/schemas/RewardPlan"
2304
+ },
2305
+ "visits": {
2306
+ "type": "number"
2307
+ },
2308
+ "points": {
2309
+ "type": "number"
2310
+ },
2311
+ "redeemableRewards": {
2312
+ "type": "array",
2313
+ "items": {
2314
+ "$ref": "#/components/schemas/Reward"
2315
+ }
2316
+ },
2317
+ "min_spend": {
2318
+ "type": "number"
2319
+ },
2320
+ "visits_active": {
2321
+ "type": "boolean"
2322
+ },
2323
+ "points_active": {
2324
+ "type": "boolean"
2325
+ },
2326
+ "firstPlan": {
2327
+ "type": "boolean"
2328
+ },
2329
+ "id": {
2330
+ "type": "string"
2331
+ },
2332
+ "active": {
2333
+ "type": "boolean"
2334
+ },
2335
+ "organization_id": {
2336
+ "type": "string"
2337
+ },
2338
+ "name": {
2339
+ "type": "string"
2340
+ },
2341
+ "favorite": {
2342
+ "type": "boolean"
2343
+ },
2344
+ "first_time_reward": {
2345
+ "$ref": "#/components/schemas/FirstTimeReward"
2346
+ }
2347
+ },
2348
+ "required": [
2349
+ "active",
2350
+ "favorite",
2351
+ "firstPlan",
2352
+ "first_time_reward",
2353
+ "id",
2354
+ "name",
2355
+ "points",
2356
+ "points_active",
2357
+ "redeemableRewards",
2358
+ "reward_plan",
2359
+ "visits",
2360
+ "visits_active"
2361
+ ]
2362
+ },
2363
+ "PlansResponseContent": {
2364
+ "type": "object",
2365
+ "properties": {
2366
+ "value": {
2367
+ "type": "array",
2368
+ "items": {
2369
+ "$ref": "#/components/schemas/GroupedPlan"
2370
+ }
2371
+ },
2372
+ "count": {
2373
+ "type": "number"
2374
+ },
2375
+ "pagination": {
2376
+ "$ref": "#/components/schemas/PaginationInfo"
2377
+ }
2378
+ },
2379
+ "required": [
2380
+ "count",
2381
+ "pagination",
2382
+ "value"
2383
+ ]
2384
+ },
2385
+ "PointsRewardOption": {
2386
+ "type": "object",
2387
+ "properties": {
2388
+ "id": {
2389
+ "type": "string"
2390
+ },
2391
+ "reward": {
2392
+ "type": "string"
2393
+ },
2394
+ "points": {
2395
+ "type": "number"
2396
+ }
2397
+ },
2398
+ "required": [
2399
+ "id",
2400
+ "points",
2401
+ "reward"
2402
+ ]
2403
+ },
2404
+ "PopularShopsPublicResponseContent": {
2405
+ "type": "object",
2406
+ "description": "Output for NearbyShops, FavoriteShops, PopularShops, RadiusShops",
2407
+ "properties": {
2408
+ "message": {
2409
+ "type": "string"
2410
+ },
2411
+ "value": {
2412
+ "type": "array",
2413
+ "items": {
2414
+ "$ref": "#/components/schemas/EnrichedShop"
2415
+ }
2416
+ },
2417
+ "count": {
2418
+ "type": "number"
2419
+ },
2420
+ "pagination": {
2421
+ "$ref": "#/components/schemas/PaginationInfo"
2422
+ }
2423
+ }
2424
+ },
2425
+ "PopularShopsResponseContent": {
2426
+ "type": "object",
2427
+ "description": "Output for NearbyShops, FavoriteShops, PopularShops, RadiusShops",
2428
+ "properties": {
2429
+ "message": {
2430
+ "type": "string"
2431
+ },
2432
+ "value": {
2433
+ "type": "array",
2434
+ "items": {
2435
+ "$ref": "#/components/schemas/EnrichedShop"
2436
+ }
2437
+ },
2438
+ "count": {
2439
+ "type": "number"
2440
+ },
2441
+ "pagination": {
2442
+ "$ref": "#/components/schemas/PaginationInfo"
2443
+ }
2444
+ }
2445
+ },
2446
+ "RadiusShopsResponseContent": {
2447
+ "type": "object",
2448
+ "description": "Output for RadiusShops (simple location list)",
2449
+ "properties": {
2450
+ "message": {
2451
+ "type": "string"
2452
+ },
2453
+ "count": {
2454
+ "type": "number"
2455
+ },
2456
+ "value": {
2457
+ "type": "array",
2458
+ "items": {
2459
+ "$ref": "#/components/schemas/ShopLocation"
2460
+ }
2461
+ }
2462
+ }
2463
+ },
2464
+ "RecordVisitResponseContent": {
2465
+ "type": "object",
2466
+ "description": "Output for RecordVisit",
2467
+ "properties": {
2468
+ "success": {
2469
+ "type": "boolean"
2470
+ },
2471
+ "message": {
2472
+ "type": "string"
2473
+ },
2474
+ "visitId": {
2475
+ "type": "string"
2476
+ },
2477
+ "reason": {
2478
+ "type": "string"
2479
+ }
2480
+ },
2481
+ "required": [
2482
+ "message",
2483
+ "success",
2484
+ "visitId"
2485
+ ]
2486
+ },
2487
+ "RedeemFirstTimeRewardResponseContent": {
2488
+ "type": "object",
2489
+ "properties": {
2490
+ "message": {
2491
+ "type": "string"
2492
+ },
2493
+ "redeemed": {
2494
+ "type": "boolean"
2495
+ }
2496
+ },
2497
+ "required": [
2498
+ "message",
2499
+ "redeemed"
2500
+ ]
2501
+ },
2502
+ "RedeemPointRewardResponseContent": {
2503
+ "type": "object",
2504
+ "properties": {
2505
+ "message": {
2506
+ "type": "string"
2507
+ },
2508
+ "redeemed": {
2509
+ "type": "boolean"
2510
+ },
2511
+ "pointsUsed": {
2512
+ "type": "number"
2513
+ },
2514
+ "remainingPoints": {
2515
+ "type": "number"
2516
+ }
2517
+ },
2518
+ "required": [
2519
+ "message",
2520
+ "pointsUsed",
2521
+ "redeemed",
2522
+ "remainingPoints"
2523
+ ]
2524
+ },
2525
+ "RedeemVisitRewardResponseContent": {
2526
+ "type": "object",
2527
+ "properties": {
2528
+ "message": {
2529
+ "type": "string"
2530
+ },
2531
+ "redeemed": {
2532
+ "type": "boolean"
2533
+ }
2534
+ },
2535
+ "required": [
2536
+ "message",
2537
+ "redeemed"
2538
+ ]
2539
+ },
2540
+ "Reward": {
2541
+ "type": "object",
2542
+ "properties": {
2543
+ "reward_id": {
2544
+ "type": "string"
2545
+ },
2546
+ "id": {
2547
+ "type": "string"
2548
+ }
2549
+ }
2550
+ },
2551
+ "RewardPlan": {
2552
+ "type": "object",
2553
+ "properties": {
2554
+ "visits": {
2555
+ "$ref": "#/components/schemas/VisitRewardProps"
2556
+ },
2557
+ "points": {
2558
+ "type": "array",
2559
+ "items": {
2560
+ "$ref": "#/components/schemas/PointsRewardOption"
2561
+ }
2562
+ }
2563
+ }
2564
+ },
2565
+ "RuntimeErrorResponseContent": {
2566
+ "type": "object",
2567
+ "properties": {
2568
+ "message": {
2569
+ "type": "string"
2570
+ }
2571
+ }
2572
+ },
2573
+ "SearchShopsPublicResponseContent": {
2574
+ "type": "object",
2575
+ "description": "Output for NearbyShops, FavoriteShops, PopularShops, RadiusShops",
2576
+ "properties": {
2577
+ "message": {
2578
+ "type": "string"
2579
+ },
2580
+ "value": {
2581
+ "type": "array",
2582
+ "items": {
2583
+ "$ref": "#/components/schemas/EnrichedShop"
2584
+ }
2585
+ },
2586
+ "count": {
2587
+ "type": "number"
2588
+ },
2589
+ "pagination": {
2590
+ "$ref": "#/components/schemas/PaginationInfo"
2591
+ }
2592
+ }
2593
+ },
2594
+ "SearchSuggestionItem": {
2595
+ "type": "object",
2596
+ "description": "Search suggestion result structure",
2597
+ "properties": {
2598
+ "shop_id": {
2599
+ "type": "string"
2600
+ },
2601
+ "organization_id": {
2602
+ "type": "string"
2603
+ },
2604
+ "search_name": {
2605
+ "type": "string"
2606
+ },
2607
+ "favorite": {
2608
+ "type": "boolean"
2609
+ },
2610
+ "distance": {
2611
+ "type": "number",
2612
+ "format": "double"
2613
+ }
2614
+ },
2615
+ "required": [
2616
+ "distance",
2617
+ "favorite",
2618
+ "organization_id",
2619
+ "search_name",
2620
+ "shop_id"
2621
+ ]
2622
+ },
2623
+ "SearchSuggestionResponseContent": {
2624
+ "type": "object",
2625
+ "description": "Output for SearchSuggestion - returns SearchSuggestionList\nHandler should return { value: SearchSuggestionList } where value is the array",
2626
+ "properties": {
2627
+ "value": {
2628
+ "type": "array",
2629
+ "items": {
2630
+ "$ref": "#/components/schemas/SearchSuggestionItem"
2631
+ }
2632
+ }
2633
+ }
2634
+ },
2635
+ "ShopHoursItem": {
2636
+ "type": "object",
2637
+ "description": "Individual shop hours entry for a day",
2638
+ "properties": {
2639
+ "day": {
2640
+ "type": "string"
2641
+ },
2642
+ "open": {
2643
+ "type": "string"
2644
+ },
2645
+ "close": {
2646
+ "type": "string"
2647
+ }
2648
+ },
2649
+ "required": [
2650
+ "close",
2651
+ "day",
2652
+ "open"
2653
+ ]
2654
+ },
2655
+ "ShopLocation": {
2656
+ "type": "object",
2657
+ "description": "Simple shop structure with just coordinates",
2658
+ "properties": {
2659
+ "id": {
2660
+ "type": "string"
2661
+ },
2662
+ "longitude": {
2663
+ "type": "number",
2664
+ "format": "double"
2665
+ },
2666
+ "latitude": {
2667
+ "type": "number",
2668
+ "format": "double"
2669
+ }
2670
+ },
2671
+ "required": [
2672
+ "id",
2673
+ "latitude",
2674
+ "longitude"
2675
+ ]
2676
+ },
2677
+ "Tier": {
2678
+ "type": "object",
2679
+ "properties": {
2680
+ "id": {
2681
+ "type": "string"
2682
+ },
2683
+ "rewards": {
2684
+ "type": "array",
2685
+ "items": {
2686
+ "type": "string"
2687
+ }
2688
+ }
2689
+ },
2690
+ "required": [
2691
+ "id",
2692
+ "rewards"
2693
+ ]
2694
+ },
2695
+ "TierMap": {
2696
+ "type": "object",
2697
+ "additionalProperties": {
2698
+ "$ref": "#/components/schemas/Tier"
2699
+ },
2700
+ "propertyNames": {
2701
+ "type": "string"
2702
+ }
2703
+ },
2704
+ "UpdateUserRequestContent": {
2705
+ "type": "object",
2706
+ "description": "Input for UpdateUser - body contains fullname fields",
2707
+ "properties": {
2708
+ "fullname": {
2709
+ "$ref": "#/components/schemas/UserFullnameUpdate"
2710
+ }
2711
+ }
2712
+ },
2713
+ "UpdateUserResponseContent": {
2714
+ "type": "object",
2715
+ "description": "Output for UpdateUser",
2716
+ "properties": {
2717
+ "message": {
2718
+ "type": "string"
2719
+ },
2720
+ "user": {
2721
+ "$ref": "#/components/schemas/User"
2722
+ }
2723
+ }
2724
+ },
2725
+ "User": {
2726
+ "type": "object",
2727
+ "description": "Full user object structure",
2728
+ "properties": {
2729
+ "id": {
2730
+ "type": "string"
2731
+ },
2732
+ "email": {
2733
+ "type": "string"
2734
+ },
2735
+ "birthdate": {
2736
+ "type": "string"
2737
+ },
2738
+ "fullname": {
2739
+ "$ref": "#/components/schemas/UserFullname"
2740
+ },
2741
+ "date_created": {
2742
+ "type": "string"
2743
+ },
2744
+ "newAccount": {
2745
+ "type": "boolean"
2746
+ },
2747
+ "preferences": {
2748
+ "$ref": "#/components/schemas/UserPreferences"
2749
+ },
2750
+ "total_visits": {
2751
+ "type": "number"
2752
+ },
2753
+ "total_points": {
2754
+ "type": "number"
2755
+ },
2756
+ "total_rewards": {
2757
+ "type": "number"
2758
+ },
2759
+ "fraud_count": {
2760
+ "type": "number"
2761
+ },
2762
+ "num_redeemableRewards": {
2763
+ "type": "number"
2764
+ }
2765
+ },
2766
+ "required": [
2767
+ "birthdate",
2768
+ "date_created",
2769
+ "email",
2770
+ "id",
2771
+ "newAccount",
2772
+ "preferences",
2773
+ "total_points",
2774
+ "total_rewards",
2775
+ "total_visits"
2776
+ ]
2777
+ },
2778
+ "UserFullname": {
2779
+ "type": "object",
2780
+ "properties": {
2781
+ "firstName": {
2782
+ "type": "string"
2783
+ },
2784
+ "lastName": {
2785
+ "type": "string"
2786
+ }
2787
+ }
2788
+ },
2789
+ "UserFullnameUpdate": {
2790
+ "type": "object",
2791
+ "description": "Partial fullname structure for updates (all fields optional)",
2792
+ "properties": {
2793
+ "firstName": {
2794
+ "type": "string"
2795
+ },
2796
+ "lastName": {
2797
+ "type": "string"
2798
+ }
2799
+ }
2800
+ },
2801
+ "UserPreferences": {
2802
+ "type": "object",
2803
+ "properties": {
2804
+ "lightMode": {
2805
+ "type": "boolean"
2806
+ }
2807
+ }
2808
+ },
2809
+ "ValidationExceptionField": {
2810
+ "type": "object",
2811
+ "description": "Describes one specific validation failure for an input member.",
2812
+ "properties": {
2813
+ "path": {
2814
+ "type": "string",
2815
+ "description": "A JSONPointer expression to the structure member whose value failed to satisfy the modeled constraints."
2816
+ },
2817
+ "message": {
2818
+ "type": "string",
2819
+ "description": "A detailed description of the validation failure."
2820
+ }
2821
+ },
2822
+ "required": [
2823
+ "message",
2824
+ "path"
2825
+ ]
2826
+ },
2827
+ "ValidationExceptionResponseContent": {
2828
+ "type": "object",
2829
+ "description": "A standard error for input validation failures.\nThis should be thrown by services when a member of the input structure\nfalls outside of the modeled or documented constraints.",
2830
+ "properties": {
2831
+ "message": {
2832
+ "type": "string",
2833
+ "description": "A summary of the validation failure."
2834
+ },
2835
+ "fieldList": {
2836
+ "type": "array",
2837
+ "items": {
2838
+ "$ref": "#/components/schemas/ValidationExceptionField"
2839
+ },
2840
+ "description": "A list of specific failures encountered while validating the input.\nA member can appear in this list more than once if it failed to satisfy multiple constraints."
2841
+ }
2842
+ },
2843
+ "required": [
2844
+ "message"
2845
+ ]
2846
+ },
2847
+ "VisitRewardProps": {
2848
+ "type": "object",
2849
+ "properties": {
2850
+ "tiers": {
2851
+ "$ref": "#/components/schemas/TierMap"
2852
+ },
2853
+ "min_spend": {
2854
+ "type": "number"
2855
+ }
2856
+ },
2857
+ "required": [
2858
+ "min_spend",
2859
+ "tiers"
2860
+ ]
2861
+ }
2862
+ }
2863
+ }
2864
+ }