squarefi-bff-api-module 1.36.66 → 1.36.68

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.
@@ -884,6 +884,310 @@ export interface paths {
884
884
  };
885
885
  trace?: never;
886
886
  };
887
+ "/frontend/aml/{wallet_id}/quote": {
888
+ parameters: {
889
+ query?: never;
890
+ header?: never;
891
+ path?: never;
892
+ cookie?: never;
893
+ };
894
+ /**
895
+ * Price of one address screening in the chosen paying currency
896
+ * @description What the "Pay and screen" modal shows: the tenant's price in USD, the
897
+ * rate of the paying currency and the total that will leave the wallet.
898
+ * Nothing is charged. With `currency_id`, `asset.supported` says whether
899
+ * the token's network can be screened at all — when it cannot, show
900
+ * that the check is unavailable and let the transfer proceed; a
901
+ * screening is never a condition of sending.
902
+ *
903
+ */
904
+ get: {
905
+ parameters: {
906
+ query: {
907
+ /** @description Balance the fee will be paid from (any wallet currency, crypto or fiat) */
908
+ pay_from_currency_id: string;
909
+ /** @description The token the address would be checked for — adds `asset.supported` to the answer */
910
+ currency_id?: string;
911
+ };
912
+ header?: never;
913
+ path: {
914
+ /** @description Wallet the screening belongs to (and is paid from) */
915
+ wallet_id: components["parameters"]["AmlWalletId"];
916
+ };
917
+ cookie?: never;
918
+ };
919
+ requestBody?: never;
920
+ responses: {
921
+ /** @description The quote */
922
+ 200: {
923
+ headers: {
924
+ [name: string]: unknown;
925
+ };
926
+ content: {
927
+ "application/json": {
928
+ /** @example true */
929
+ success?: boolean;
930
+ data?: components["schemas"]["AmlScreeningQuote"];
931
+ };
932
+ };
933
+ };
934
+ /** @description Validation error, or the fee cannot be priced in this currency (AML_FEE_NOT_PRICEABLE) */
935
+ 400: {
936
+ headers: {
937
+ [name: string]: unknown;
938
+ };
939
+ content: {
940
+ "application/json": components["schemas"]["ErrorResponse"];
941
+ };
942
+ };
943
+ /** @description Feature not enabled for the tenant (AML_CHECK_NOT_ENABLED) or no access to the wallet */
944
+ 403: {
945
+ headers: {
946
+ [name: string]: unknown;
947
+ };
948
+ content: {
949
+ "application/json": components["schemas"]["ErrorResponse"];
950
+ };
951
+ };
952
+ };
953
+ };
954
+ put?: never;
955
+ post?: never;
956
+ delete?: never;
957
+ options?: never;
958
+ head?: never;
959
+ patch?: never;
960
+ trace?: never;
961
+ };
962
+ "/frontend/aml/{wallet_id}/screenings": {
963
+ parameters: {
964
+ query?: never;
965
+ header?: never;
966
+ path?: never;
967
+ cookie?: never;
968
+ };
969
+ get?: never;
970
+ put?: never;
971
+ /**
972
+ * Pay for and start an AML screening of a crypto address
973
+ * @description Charges the tenant's screening fee from `pay_from_currency_id` (an
974
+ * `AML_CHECK` order) and hands the address to the analytics provider.
975
+ * The answer is the screening in `PENDING`. Do not poll: subscribe to
976
+ * the wallet's realtime channel and wait for the `data.changed` hint
977
+ * with `entity: WALLET_AML_SCREENINGS`, then read
978
+ * `GET /frontend/aml/{wallet_id}/screenings/{id}` for the verdict
979
+ * (`COMPLETED` or `FAILED`). A failed screening refunds the fee in full.
980
+ *
981
+ * Send an `Idempotency-Key` header to make a retry return the screening
982
+ * the first call created instead of charging again.
983
+ *
984
+ * One screening of an address (per wallet and token) runs at a time: a
985
+ * second request while the first is still `PENDING` / `SCREENING`
986
+ * answers `409 SCREENING_IN_PROGRESS` with `details.screening_id` of the
987
+ * running one and charges nothing — wait on that screening instead. Once
988
+ * it has finished the address can be screened (and paid for) again; a
989
+ * screening stuck for more than 15 minutes stops blocking.
990
+ *
991
+ */
992
+ post: {
993
+ parameters: {
994
+ query?: never;
995
+ header?: {
996
+ "Idempotency-Key"?: string;
997
+ };
998
+ path: {
999
+ /** @description Wallet the screening belongs to (and is paid from) */
1000
+ wallet_id: components["parameters"]["AmlWalletId"];
1001
+ };
1002
+ cookie?: never;
1003
+ };
1004
+ requestBody: {
1005
+ content: {
1006
+ "application/json": {
1007
+ /** @example TAX544wj9oDmAqWLzuAnYLU9GfS8XncsJ9 */
1008
+ address: string;
1009
+ /**
1010
+ * Format: uuid
1011
+ * @description The token the address is checked for — decides the network (see `aml_supported` in the currency reference)
1012
+ */
1013
+ currency_id: string;
1014
+ /**
1015
+ * Format: uuid
1016
+ * @description Balance the fee is paid from
1017
+ */
1018
+ pay_from_currency_id: string;
1019
+ };
1020
+ };
1021
+ };
1022
+ responses: {
1023
+ /** @description Screening created and paid for */
1024
+ 201: {
1025
+ headers: {
1026
+ [name: string]: unknown;
1027
+ };
1028
+ content: {
1029
+ "application/json": {
1030
+ /** @example true */
1031
+ success?: boolean;
1032
+ data?: components["schemas"]["AmlScreening"];
1033
+ };
1034
+ };
1035
+ };
1036
+ /** @description Validation error, unsupported asset (AML_ASSET_NOT_SUPPORTED), insufficient funds (INSUFFICIENT_FUNDS) or a fee that cannot be priced (AML_FEE_NOT_PRICEABLE) */
1037
+ 400: {
1038
+ headers: {
1039
+ [name: string]: unknown;
1040
+ };
1041
+ content: {
1042
+ "application/json": components["schemas"]["ErrorResponse"];
1043
+ };
1044
+ };
1045
+ /** @description Feature not enabled (AML_CHECK_NOT_ENABLED), KYC not approved, or caller is not an admin of the wallet */
1046
+ 403: {
1047
+ headers: {
1048
+ [name: string]: unknown;
1049
+ };
1050
+ content: {
1051
+ "application/json": components["schemas"]["ErrorResponse"];
1052
+ };
1053
+ };
1054
+ /** @description The address is already being screened for this wallet (SCREENING_IN_PROGRESS, `details.screening_id`), or the same request is still being processed (OPERATION_IN_PROGRESS) */
1055
+ 409: {
1056
+ headers: {
1057
+ [name: string]: unknown;
1058
+ };
1059
+ content: {
1060
+ "application/json": components["schemas"]["ErrorResponse"];
1061
+ };
1062
+ };
1063
+ /** @description Rate limit exceeded */
1064
+ 429: {
1065
+ headers: {
1066
+ [name: string]: unknown;
1067
+ };
1068
+ content: {
1069
+ "application/json": components["schemas"]["ErrorResponse"];
1070
+ };
1071
+ };
1072
+ };
1073
+ };
1074
+ delete?: never;
1075
+ options?: never;
1076
+ head?: never;
1077
+ patch?: never;
1078
+ trace?: never;
1079
+ };
1080
+ "/frontend/aml/{wallet_id}/screenings/{id}": {
1081
+ parameters: {
1082
+ query?: never;
1083
+ header?: never;
1084
+ path?: never;
1085
+ cookie?: never;
1086
+ };
1087
+ /** Get a screening and its verdict */
1088
+ get: {
1089
+ parameters: {
1090
+ query?: never;
1091
+ header?: never;
1092
+ path: {
1093
+ /** @description Wallet the screening belongs to (and is paid from) */
1094
+ wallet_id: components["parameters"]["AmlWalletId"];
1095
+ id: components["parameters"]["AmlScreeningId"];
1096
+ };
1097
+ cookie?: never;
1098
+ };
1099
+ requestBody?: never;
1100
+ responses: {
1101
+ /** @description The screening */
1102
+ 200: {
1103
+ headers: {
1104
+ [name: string]: unknown;
1105
+ };
1106
+ content: {
1107
+ "application/json": {
1108
+ /** @example true */
1109
+ success?: boolean;
1110
+ data?: components["schemas"]["AmlScreening"];
1111
+ };
1112
+ };
1113
+ };
1114
+ /** @description Not found in this wallet (SCREENING_NOT_FOUND) */
1115
+ 404: {
1116
+ headers: {
1117
+ [name: string]: unknown;
1118
+ };
1119
+ content: {
1120
+ "application/json": components["schemas"]["ErrorResponse"];
1121
+ };
1122
+ };
1123
+ };
1124
+ };
1125
+ put?: never;
1126
+ post?: never;
1127
+ delete?: never;
1128
+ options?: never;
1129
+ head?: never;
1130
+ patch?: never;
1131
+ trace?: never;
1132
+ };
1133
+ "/frontend/aml/{wallet_id}/screenings/{id}/report": {
1134
+ parameters: {
1135
+ query?: never;
1136
+ header?: never;
1137
+ path?: never;
1138
+ cookie?: never;
1139
+ };
1140
+ /** Download the PDF report of a completed screening */
1141
+ get: {
1142
+ parameters: {
1143
+ query?: never;
1144
+ header?: never;
1145
+ path: {
1146
+ /** @description Wallet the screening belongs to (and is paid from) */
1147
+ wallet_id: components["parameters"]["AmlWalletId"];
1148
+ id: components["parameters"]["AmlScreeningId"];
1149
+ };
1150
+ cookie?: never;
1151
+ };
1152
+ requestBody?: never;
1153
+ responses: {
1154
+ /** @description The report as an attachment */
1155
+ 200: {
1156
+ headers: {
1157
+ [name: string]: unknown;
1158
+ };
1159
+ content: {
1160
+ "application/pdf": string;
1161
+ };
1162
+ };
1163
+ /** @description Not found in this wallet (SCREENING_NOT_FOUND) */
1164
+ 404: {
1165
+ headers: {
1166
+ [name: string]: unknown;
1167
+ };
1168
+ content: {
1169
+ "application/json": components["schemas"]["ErrorResponse"];
1170
+ };
1171
+ };
1172
+ /** @description The screening has not completed (SCREENING_REPORT_NOT_READY) */
1173
+ 409: {
1174
+ headers: {
1175
+ [name: string]: unknown;
1176
+ };
1177
+ content: {
1178
+ "application/json": components["schemas"]["ErrorResponse"];
1179
+ };
1180
+ };
1181
+ };
1182
+ };
1183
+ put?: never;
1184
+ post?: never;
1185
+ delete?: never;
1186
+ options?: never;
1187
+ head?: never;
1188
+ patch?: never;
1189
+ trace?: never;
1190
+ };
887
1191
  "/frontend/bank-data": {
888
1192
  parameters: {
889
1193
  query?: never;
@@ -3658,6 +3962,11 @@ export interface paths {
3658
3962
  */
3659
3963
  from_currency_id: string;
3660
3964
  amount: number;
3965
+ /**
3966
+ * @description When true, `amount` is what the sub-account is credited; the wallet debit (conversion + fees) is derived from it.
3967
+ * @default false
3968
+ */
3969
+ is_reverse?: boolean;
3661
3970
  note?: string;
3662
3971
  };
3663
3972
  };
@@ -4271,6 +4580,11 @@ export interface paths {
4271
4580
  * @example 250
4272
4581
  */
4273
4582
  amount: number;
4583
+ /**
4584
+ * @description When true, `amount` is what the sub-account is credited; the wallet debit (conversion + fees) is derived from it.
4585
+ * @default false
4586
+ */
4587
+ is_reverse?: boolean;
4274
4588
  /**
4275
4589
  * @description Optional description for the deposit
4276
4590
  * @example Top up sub-account
@@ -9060,12 +9374,18 @@ export interface paths {
9060
9374
  };
9061
9375
  requestBody?: never;
9062
9376
  responses: {
9063
- /** @description List of available order types */
9377
+ /** @description The whole order-type catalogue, each with the tenant markup */
9064
9378
  200: {
9065
9379
  headers: {
9066
9380
  [name: string]: unknown;
9067
9381
  };
9068
- content?: never;
9382
+ content: {
9383
+ "application/json": {
9384
+ /** @example true */
9385
+ success: boolean;
9386
+ data: components["schemas"]["OrderTypeInfo"][];
9387
+ };
9388
+ };
9069
9389
  };
9070
9390
  };
9071
9391
  };
@@ -9107,14 +9427,22 @@ export interface paths {
9107
9427
  headers: {
9108
9428
  [name: string]: unknown;
9109
9429
  };
9110
- content?: never;
9111
- };
9112
- /** @description Order type not found */
9113
- 404: {
9430
+ content: {
9431
+ "application/json": {
9432
+ /** @example true */
9433
+ success: boolean;
9434
+ data: components["schemas"]["OrderTypeInfo"];
9435
+ };
9436
+ };
9437
+ };
9438
+ /** @description Order type not found */
9439
+ 404: {
9114
9440
  headers: {
9115
9441
  [name: string]: unknown;
9116
9442
  };
9117
- content?: never;
9443
+ content: {
9444
+ "application/json": components["schemas"]["ErrorResponse"];
9445
+ };
9118
9446
  };
9119
9447
  };
9120
9448
  };
@@ -9641,6 +9969,8 @@ export interface paths {
9641
9969
  type?: "token" | "native";
9642
9970
  symbol?: string;
9643
9971
  enabled_only?: boolean;
9972
+ /** @description Only tokens whose network the tenant's AML provider can screen addresses on */
9973
+ aml_supported?: boolean;
9644
9974
  offset?: number;
9645
9975
  limit?: number;
9646
9976
  };
@@ -9650,7 +9980,7 @@ export interface paths {
9650
9980
  };
9651
9981
  requestBody?: never;
9652
9982
  responses: {
9653
- /** @description Currencies list retrieved successfully */
9983
+ /** @description Currencies list retrieved successfully. Every item carries `aml_supported` — true when an address on this token's network can be screened (`POST /frontend/aml/{wallet_id}/screenings`); always false while AML screening is off for the tenant. */
9654
9984
  200: {
9655
9985
  headers: {
9656
9986
  [name: string]: unknown;
@@ -9795,7 +10125,14 @@ export interface paths {
9795
10125
  headers: {
9796
10126
  [name: string]: unknown;
9797
10127
  };
9798
- content?: never;
10128
+ content: {
10129
+ "application/json": {
10130
+ /** @example true */
10131
+ success: boolean;
10132
+ data: components["schemas"]["ExchangeRate"][];
10133
+ pagination: components["schemas"]["PaginationResponse"];
10134
+ };
10135
+ };
9799
10136
  };
9800
10137
  401: components["responses"]["UnauthorizedError"];
9801
10138
  };
@@ -9848,7 +10185,14 @@ export interface paths {
9848
10185
  headers: {
9849
10186
  [name: string]: unknown;
9850
10187
  };
9851
- content?: never;
10188
+ content: {
10189
+ "application/json": {
10190
+ /** @example true */
10191
+ success: boolean;
10192
+ data: components["schemas"]["ReferenceOrderType"][];
10193
+ pagination: components["schemas"]["PaginationResponse"];
10194
+ };
10195
+ };
9852
10196
  };
9853
10197
  401: components["responses"]["UnauthorizedError"];
9854
10198
  };
@@ -9878,6 +10222,8 @@ export interface paths {
9878
10222
  get: {
9879
10223
  parameters: {
9880
10224
  query?: {
10225
+ /** @description Only networks the tenant's AML provider can screen addresses on */
10226
+ aml_supported?: boolean;
9881
10227
  offset?: number;
9882
10228
  limit?: number;
9883
10229
  };
@@ -9887,7 +10233,7 @@ export interface paths {
9887
10233
  };
9888
10234
  requestBody?: never;
9889
10235
  responses: {
9890
- /** @description Chains retrieved successfully */
10236
+ /** @description Chains retrieved successfully. Every item carries `aml_supported`; always false while AML screening is off for the tenant. */
9891
10237
  200: {
9892
10238
  headers: {
9893
10239
  [name: string]: unknown;
@@ -9930,19 +10276,666 @@ export interface paths {
9930
10276
  limit?: number;
9931
10277
  };
9932
10278
  header?: never;
9933
- path?: never;
10279
+ path?: never;
10280
+ cookie?: never;
10281
+ };
10282
+ requestBody?: never;
10283
+ responses: {
10284
+ /** @description Countries retrieved successfully */
10285
+ 200: {
10286
+ headers: {
10287
+ [name: string]: unknown;
10288
+ };
10289
+ content?: never;
10290
+ };
10291
+ 401: components["responses"]["UnauthorizedError"];
10292
+ };
10293
+ };
10294
+ put?: never;
10295
+ post?: never;
10296
+ delete?: never;
10297
+ options?: never;
10298
+ head?: never;
10299
+ patch?: never;
10300
+ trace?: never;
10301
+ };
10302
+ "/frontend/reference/regions": {
10303
+ parameters: {
10304
+ query?: never;
10305
+ header?: never;
10306
+ path?: never;
10307
+ cookie?: never;
10308
+ };
10309
+ /**
10310
+ * List regions
10311
+ * @description Returns world regions (e.g. Europe, Asia, Americas).
10312
+ *
10313
+ * **Authentication**: Bearer token + x-tenant-id header
10314
+ *
10315
+ */
10316
+ get: {
10317
+ parameters: {
10318
+ query?: {
10319
+ offset?: number;
10320
+ limit?: number;
10321
+ };
10322
+ header?: never;
10323
+ path?: never;
10324
+ cookie?: never;
10325
+ };
10326
+ requestBody?: never;
10327
+ responses: {
10328
+ /** @description Regions retrieved successfully */
10329
+ 200: {
10330
+ headers: {
10331
+ [name: string]: unknown;
10332
+ };
10333
+ content?: never;
10334
+ };
10335
+ 401: components["responses"]["UnauthorizedError"];
10336
+ };
10337
+ };
10338
+ put?: never;
10339
+ post?: never;
10340
+ delete?: never;
10341
+ options?: never;
10342
+ head?: never;
10343
+ patch?: never;
10344
+ trace?: never;
10345
+ };
10346
+ "/frontend/reference/states": {
10347
+ parameters: {
10348
+ query?: never;
10349
+ header?: never;
10350
+ path?: never;
10351
+ cookie?: never;
10352
+ };
10353
+ /**
10354
+ * List states
10355
+ * @description Returns states / provinces. Use `country_id` or `country_code` to filter.
10356
+ *
10357
+ * **Authentication**: Bearer token + x-tenant-id header
10358
+ *
10359
+ */
10360
+ get: {
10361
+ parameters: {
10362
+ query?: {
10363
+ country_id?: number;
10364
+ country_code?: string;
10365
+ search?: string;
10366
+ offset?: number;
10367
+ limit?: number;
10368
+ };
10369
+ header?: never;
10370
+ path?: never;
10371
+ cookie?: never;
10372
+ };
10373
+ requestBody?: never;
10374
+ responses: {
10375
+ /** @description States retrieved successfully */
10376
+ 200: {
10377
+ headers: {
10378
+ [name: string]: unknown;
10379
+ };
10380
+ content?: never;
10381
+ };
10382
+ 401: components["responses"]["UnauthorizedError"];
10383
+ };
10384
+ };
10385
+ put?: never;
10386
+ post?: never;
10387
+ delete?: never;
10388
+ options?: never;
10389
+ head?: never;
10390
+ patch?: never;
10391
+ trace?: never;
10392
+ };
10393
+ "/frontend/referrals/summary": {
10394
+ parameters: {
10395
+ query?: never;
10396
+ header?: never;
10397
+ path?: never;
10398
+ cookie?: never;
10399
+ };
10400
+ /**
10401
+ * The agent's referral summary
10402
+ * @description The main referral screen in one call — the agent's code, this month's earnings and level, what waits for a payout, what was paid so far, the ladder and the program terms. A user without a referral code gets one here.
10403
+ */
10404
+ get: {
10405
+ parameters: {
10406
+ query?: never;
10407
+ header?: never;
10408
+ path?: never;
10409
+ cookie?: never;
10410
+ };
10411
+ requestBody?: never;
10412
+ responses: {
10413
+ /** @description The summary. */
10414
+ 200: {
10415
+ headers: {
10416
+ [name: string]: unknown;
10417
+ };
10418
+ content: {
10419
+ "application/json": {
10420
+ /** @example true */
10421
+ success?: boolean;
10422
+ data?: components["schemas"]["ReferralSummary"];
10423
+ };
10424
+ };
10425
+ };
10426
+ 401: components["responses"]["UnauthorizedError"];
10427
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10428
+ 403: {
10429
+ headers: {
10430
+ [name: string]: unknown;
10431
+ };
10432
+ content?: never;
10433
+ };
10434
+ };
10435
+ };
10436
+ put?: never;
10437
+ post?: never;
10438
+ delete?: never;
10439
+ options?: never;
10440
+ head?: never;
10441
+ patch?: never;
10442
+ trace?: never;
10443
+ };
10444
+ "/frontend/referrals/events": {
10445
+ parameters: {
10446
+ query?: never;
10447
+ header?: never;
10448
+ path?: never;
10449
+ cookie?: never;
10450
+ };
10451
+ /**
10452
+ * The agent's rewards of a month
10453
+ * @description One row per rewarded order (and per reversal), newest first. Canceled rows are not listed. Without `period` the current month is served; a level change is visible as a change of `level_no` between rows.
10454
+ */
10455
+ get: {
10456
+ parameters: {
10457
+ query?: {
10458
+ /** @description UTC month `YYYY-MM`; defaults to the current one. */
10459
+ period?: string;
10460
+ offset?: number;
10461
+ limit?: number;
10462
+ };
10463
+ header?: never;
10464
+ path?: never;
10465
+ cookie?: never;
10466
+ };
10467
+ requestBody?: never;
10468
+ responses: {
10469
+ /** @description A page of rows; `meta.period` names the month served. */
10470
+ 200: {
10471
+ headers: {
10472
+ [name: string]: unknown;
10473
+ };
10474
+ content: {
10475
+ "application/json": {
10476
+ /** @example true */
10477
+ success?: boolean;
10478
+ data?: components["schemas"]["ReferralEvent"][];
10479
+ pagination?: components["schemas"]["PaginationResponse"];
10480
+ meta?: {
10481
+ /** @example 2026-09 */
10482
+ period?: string;
10483
+ };
10484
+ };
10485
+ };
10486
+ };
10487
+ /** @description Invalid query (`VALIDATION_ERROR`). */
10488
+ 400: {
10489
+ headers: {
10490
+ [name: string]: unknown;
10491
+ };
10492
+ content?: never;
10493
+ };
10494
+ 401: components["responses"]["UnauthorizedError"];
10495
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10496
+ 403: {
10497
+ headers: {
10498
+ [name: string]: unknown;
10499
+ };
10500
+ content?: never;
10501
+ };
10502
+ };
10503
+ };
10504
+ put?: never;
10505
+ post?: never;
10506
+ delete?: never;
10507
+ options?: never;
10508
+ head?: never;
10509
+ patch?: never;
10510
+ trace?: never;
10511
+ };
10512
+ "/frontend/referrals/payouts": {
10513
+ parameters: {
10514
+ query?: never;
10515
+ header?: never;
10516
+ path?: never;
10517
+ cookie?: never;
10518
+ };
10519
+ /**
10520
+ * The agent's payouts
10521
+ * @description One per closed month the agent was paid for (or is being paid for), newest month first.
10522
+ */
10523
+ get: {
10524
+ parameters: {
10525
+ query?: {
10526
+ offset?: number;
10527
+ limit?: number;
10528
+ };
10529
+ header?: never;
10530
+ path?: never;
10531
+ cookie?: never;
10532
+ };
10533
+ requestBody?: never;
10534
+ responses: {
10535
+ /** @description A page of payouts. */
10536
+ 200: {
10537
+ headers: {
10538
+ [name: string]: unknown;
10539
+ };
10540
+ content: {
10541
+ "application/json": {
10542
+ /** @example true */
10543
+ success?: boolean;
10544
+ data?: components["schemas"]["ReferralPayout"][];
10545
+ pagination?: components["schemas"]["PaginationResponse"];
10546
+ };
10547
+ };
10548
+ };
10549
+ 401: components["responses"]["UnauthorizedError"];
10550
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10551
+ 403: {
10552
+ headers: {
10553
+ [name: string]: unknown;
10554
+ };
10555
+ content?: never;
10556
+ };
10557
+ };
10558
+ };
10559
+ put?: never;
10560
+ post?: never;
10561
+ delete?: never;
10562
+ options?: never;
10563
+ head?: never;
10564
+ patch?: never;
10565
+ trace?: never;
10566
+ };
10567
+ "/frontend/referrals/report": {
10568
+ parameters: {
10569
+ query?: never;
10570
+ header?: never;
10571
+ path?: never;
10572
+ cookie?: never;
10573
+ };
10574
+ /**
10575
+ * Download the monthly referral report (PDF)
10576
+ * @description The month's summary, the breakdown by order type and the reward rows, on the tenant's branded sheet. Without `period` the last closed month is served — the one a payout is made for; the current month is served too, marked preliminary. Generated on the fly and streamed; nothing is persisted.
10577
+ */
10578
+ get: {
10579
+ parameters: {
10580
+ query?: {
10581
+ /** @description UTC month `YYYY-MM`; defaults to the last closed month. */
10582
+ period?: string;
10583
+ };
10584
+ header?: never;
10585
+ path?: never;
10586
+ cookie?: never;
10587
+ };
10588
+ requestBody?: never;
10589
+ responses: {
10590
+ /** @description PDF file */
10591
+ 200: {
10592
+ headers: {
10593
+ [name: string]: unknown;
10594
+ };
10595
+ content: {
10596
+ "application/pdf": string;
10597
+ };
10598
+ };
10599
+ /** @description Invalid query (`VALIDATION_ERROR`). */
10600
+ 400: {
10601
+ headers: {
10602
+ [name: string]: unknown;
10603
+ };
10604
+ content?: never;
10605
+ };
10606
+ 401: components["responses"]["UnauthorizedError"];
10607
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10608
+ 403: {
10609
+ headers: {
10610
+ [name: string]: unknown;
10611
+ };
10612
+ content?: never;
10613
+ };
10614
+ /** @description More than 5 report requests (downloads and Telegram sends together) in a minute (`RATE_LIMIT_EXCEEDED`). */
10615
+ 429: {
10616
+ headers: {
10617
+ [name: string]: unknown;
10618
+ };
10619
+ content?: never;
10620
+ };
10621
+ };
10622
+ };
10623
+ put?: never;
10624
+ post?: never;
10625
+ delete?: never;
10626
+ options?: never;
10627
+ head?: never;
10628
+ patch?: never;
10629
+ trace?: never;
10630
+ };
10631
+ "/frontend/referrals/report/telegram": {
10632
+ parameters: {
10633
+ query?: never;
10634
+ header?: never;
10635
+ path?: never;
10636
+ cookie?: never;
10637
+ };
10638
+ get?: never;
10639
+ put?: never;
10640
+ /**
10641
+ * Send the monthly referral report to the user's Telegram
10642
+ * @description The same PDF as `GET /report`, delivered as a document to the chat the user has with the tenant's Telegram bot. Without `period` the last closed month is sent.
10643
+ */
10644
+ post: {
10645
+ parameters: {
10646
+ query?: never;
10647
+ header?: never;
10648
+ path?: never;
10649
+ cookie?: never;
10650
+ };
10651
+ requestBody?: {
10652
+ content: {
10653
+ "application/json": {
10654
+ /**
10655
+ * @description UTC month; defaults to the last closed month.
10656
+ * @example 2026-08
10657
+ */
10658
+ period?: string;
10659
+ };
10660
+ };
10661
+ };
10662
+ responses: {
10663
+ /** @description The report was handed to Telegram. */
10664
+ 200: {
10665
+ headers: {
10666
+ [name: string]: unknown;
10667
+ };
10668
+ content: {
10669
+ "application/json": {
10670
+ /** @example true */
10671
+ success?: boolean;
10672
+ data?: {
10673
+ /** @example true */
10674
+ sent?: boolean;
10675
+ /** @example 2026-08 */
10676
+ period?: string;
10677
+ };
10678
+ };
10679
+ };
10680
+ };
10681
+ /** @description Invalid body (`VALIDATION_ERROR`). */
10682
+ 400: {
10683
+ headers: {
10684
+ [name: string]: unknown;
10685
+ };
10686
+ content?: never;
10687
+ };
10688
+ 401: components["responses"]["UnauthorizedError"];
10689
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10690
+ 403: {
10691
+ headers: {
10692
+ [name: string]: unknown;
10693
+ };
10694
+ content?: never;
10695
+ };
10696
+ /** @description The user has not started the tenant's bot (`TELEGRAM_NOT_LINKED`), or the tenant runs no bot (`TELEGRAM_NOT_AVAILABLE`). */
10697
+ 409: {
10698
+ headers: {
10699
+ [name: string]: unknown;
10700
+ };
10701
+ content?: never;
10702
+ };
10703
+ /** @description More than 5 report requests (downloads and Telegram sends together) in a minute (`RATE_LIMIT_EXCEEDED`). */
10704
+ 429: {
10705
+ headers: {
10706
+ [name: string]: unknown;
10707
+ };
10708
+ content?: never;
10709
+ };
10710
+ /** @description Telegram did not accept the document (`TELEGRAM_DELIVERY_FAILED`); retry later. */
10711
+ 503: {
10712
+ headers: {
10713
+ [name: string]: unknown;
10714
+ };
10715
+ content?: never;
10716
+ };
10717
+ };
10718
+ };
10719
+ delete?: never;
10720
+ options?: never;
10721
+ head?: never;
10722
+ patch?: never;
10723
+ trace?: never;
10724
+ };
10725
+ "/frontend/referrals/telegram-report": {
10726
+ parameters: {
10727
+ query?: never;
10728
+ header?: never;
10729
+ path?: never;
10730
+ cookie?: never;
10731
+ };
10732
+ /**
10733
+ * The "report every month" Telegram setting
10734
+ * @description Whether the user has linked the tenant's Telegram bot, and whether they asked for their referral report there every month. The report is sent when the month's payout is made.
10735
+ */
10736
+ get: {
10737
+ parameters: {
10738
+ query?: never;
10739
+ header?: never;
10740
+ path?: never;
10741
+ cookie?: never;
10742
+ };
10743
+ requestBody?: never;
10744
+ responses: {
10745
+ /** @description The setting. */
10746
+ 200: {
10747
+ headers: {
10748
+ [name: string]: unknown;
10749
+ };
10750
+ content: {
10751
+ "application/json": {
10752
+ /** @example true */
10753
+ success?: boolean;
10754
+ data?: components["schemas"]["ReferralTelegramReportSetting"];
10755
+ };
10756
+ };
10757
+ };
10758
+ 401: components["responses"]["UnauthorizedError"];
10759
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10760
+ 403: {
10761
+ headers: {
10762
+ [name: string]: unknown;
10763
+ };
10764
+ content?: never;
10765
+ };
10766
+ };
10767
+ };
10768
+ /** Switch the monthly Telegram report on or off */
10769
+ put: {
10770
+ parameters: {
10771
+ query?: never;
10772
+ header?: never;
10773
+ path?: never;
10774
+ cookie?: never;
10775
+ };
10776
+ requestBody: {
10777
+ content: {
10778
+ "application/json": {
10779
+ enabled: boolean;
10780
+ };
10781
+ };
10782
+ };
10783
+ responses: {
10784
+ /** @description The setting after the change. */
10785
+ 200: {
10786
+ headers: {
10787
+ [name: string]: unknown;
10788
+ };
10789
+ content: {
10790
+ "application/json": {
10791
+ /** @example true */
10792
+ success?: boolean;
10793
+ data?: components["schemas"]["ReferralTelegramReportSetting"];
10794
+ };
10795
+ };
10796
+ };
10797
+ /** @description Invalid body (`VALIDATION_ERROR`). */
10798
+ 400: {
10799
+ headers: {
10800
+ [name: string]: unknown;
10801
+ };
10802
+ content?: never;
10803
+ };
10804
+ 401: components["responses"]["UnauthorizedError"];
10805
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10806
+ 403: {
10807
+ headers: {
10808
+ [name: string]: unknown;
10809
+ };
10810
+ content?: never;
10811
+ };
10812
+ /** @description The user has not started the tenant's bot (`TELEGRAM_NOT_LINKED`) — there is nowhere to send the report. */
10813
+ 409: {
10814
+ headers: {
10815
+ [name: string]: unknown;
10816
+ };
10817
+ content?: never;
10818
+ };
10819
+ };
10820
+ };
10821
+ post?: never;
10822
+ delete?: never;
10823
+ options?: never;
10824
+ head?: never;
10825
+ patch?: never;
10826
+ trace?: never;
10827
+ };
10828
+ "/frontend/rfi/{wallet_id}": {
10829
+ parameters: {
10830
+ query?: never;
10831
+ header?: never;
10832
+ path?: never;
10833
+ cookie?: never;
10834
+ };
10835
+ /**
10836
+ * List compliance requests (RFI) of an account, with the banner counters
10837
+ * @description Requests for information compliance sent about this account, newest first. `summary`
10838
+ * counts every open request regardless of paging — use it for the home-screen banner:
10839
+ * `action_required > 0` shows it, `overdue > 0` turns it red, `next_due_at` is the
10840
+ * nearest deadline. Any wallet member except the scoped `user` role may read.
10841
+ * Refresh on the realtime `data.changed` hint with entity `WALLET_RFI`.
10842
+ *
10843
+ */
10844
+ get: {
10845
+ parameters: {
10846
+ query?: {
10847
+ /** @description `open` — everything still in progress (`action_required` + `awaiting_compliance`), the Open tab; `closed` — the Resolved tab. */
10848
+ status?: "open" | "action_required" | "awaiting_compliance" | "closed";
10849
+ /** @description Only the requests covering this transaction — what the transaction screen asks by to decide whether to show "compliance has questions". A transaction of another account, or one no request covers, returns an empty page. */
10850
+ order_uuid?: string;
10851
+ limit?: number;
10852
+ offset?: number;
10853
+ };
10854
+ header?: never;
10855
+ path: {
10856
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
10857
+ wallet_id: components["parameters"]["RfiWalletId"];
10858
+ };
10859
+ cookie?: never;
10860
+ };
10861
+ requestBody?: never;
10862
+ responses: {
10863
+ /** @description Page of requests and the open-request counters */
10864
+ 200: {
10865
+ headers: {
10866
+ [name: string]: unknown;
10867
+ };
10868
+ content: {
10869
+ "application/json": {
10870
+ /** @example true */
10871
+ success?: boolean;
10872
+ data?: {
10873
+ summary?: {
10874
+ action_required?: number;
10875
+ overdue?: number;
10876
+ awaiting_compliance?: number;
10877
+ /** Format: date-time */
10878
+ next_due_at?: string | null;
10879
+ };
10880
+ items?: components["schemas"]["RfiCase"][];
10881
+ total?: number;
10882
+ limit?: number;
10883
+ offset?: number;
10884
+ };
10885
+ };
10886
+ };
10887
+ };
10888
+ 403: components["responses"]["ForbiddenError"];
10889
+ };
10890
+ };
10891
+ put?: never;
10892
+ post?: never;
10893
+ delete?: never;
10894
+ options?: never;
10895
+ head?: never;
10896
+ patch?: never;
10897
+ trace?: never;
10898
+ };
10899
+ "/frontend/rfi/{wallet_id}/{case_id}": {
10900
+ parameters: {
10901
+ query?: never;
10902
+ header?: never;
10903
+ path?: never;
10904
+ cookie?: never;
10905
+ };
10906
+ /**
10907
+ * Get a compliance request with its conversation and covered transactions
10908
+ * @description The conversation holds compliance's questions and the client's answers, oldest first.
10909
+ * A request of another account answers 404.
10910
+ *
10911
+ */
10912
+ get: {
10913
+ parameters: {
10914
+ query?: never;
10915
+ header?: never;
10916
+ path: {
10917
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
10918
+ wallet_id: components["parameters"]["RfiWalletId"];
10919
+ case_id: components["parameters"]["RfiCaseId"];
10920
+ };
9934
10921
  cookie?: never;
9935
10922
  };
9936
10923
  requestBody?: never;
9937
10924
  responses: {
9938
- /** @description Countries retrieved successfully */
10925
+ /** @description The request */
9939
10926
  200: {
9940
10927
  headers: {
9941
10928
  [name: string]: unknown;
9942
10929
  };
9943
- content?: never;
10930
+ content: {
10931
+ "application/json": {
10932
+ /** @example true */
10933
+ success?: boolean;
10934
+ data?: components["schemas"]["RfiCaseDetail"];
10935
+ };
10936
+ };
9944
10937
  };
9945
- 401: components["responses"]["UnauthorizedError"];
10938
+ 404: components["responses"]["NotFoundError"];
9946
10939
  };
9947
10940
  };
9948
10941
  put?: never;
@@ -9953,87 +10946,127 @@ export interface paths {
9953
10946
  patch?: never;
9954
10947
  trace?: never;
9955
10948
  };
9956
- "/frontend/reference/regions": {
10949
+ "/frontend/rfi/{wallet_id}/{case_id}/messages": {
9957
10950
  parameters: {
9958
10951
  query?: never;
9959
10952
  header?: never;
9960
10953
  path?: never;
9961
10954
  cookie?: never;
9962
10955
  };
10956
+ get?: never;
10957
+ put?: never;
9963
10958
  /**
9964
- * List regions
9965
- * @description Returns world regions (e.g. Europe, Asia, Americas).
9966
- *
9967
- * **Authentication**: Bearer token + x-tenant-id header
10959
+ * Answer a compliance request
10960
+ * @description `multipart/form-data` with a `body` text field and up to 10 files under `files`
10961
+ * (PDF, JPEG, PNG, WebP, TXT, DOCX, XLSX; 20 MB each). At least one of the two is required.
10962
+ * The request moves to `awaiting_compliance`; answering again while compliance reviews is
10963
+ * allowed, and compliance may ask further rounds. Requires the `admin` role on the wallet.
10964
+ * Do not set `Content-Type` manually — the browser adds the multipart boundary.
9968
10965
  *
9969
10966
  */
9970
- get: {
10967
+ post: {
9971
10968
  parameters: {
9972
- query?: {
9973
- offset?: number;
9974
- limit?: number;
9975
- };
10969
+ query?: never;
9976
10970
  header?: never;
9977
- path?: never;
10971
+ path: {
10972
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
10973
+ wallet_id: components["parameters"]["RfiWalletId"];
10974
+ case_id: components["parameters"]["RfiCaseId"];
10975
+ };
9978
10976
  cookie?: never;
9979
10977
  };
9980
- requestBody?: never;
10978
+ requestBody: {
10979
+ content: {
10980
+ "multipart/form-data": {
10981
+ body?: string;
10982
+ files?: string[];
10983
+ };
10984
+ };
10985
+ };
9981
10986
  responses: {
9982
- /** @description Regions retrieved successfully */
9983
- 200: {
10987
+ /** @description The message as stored */
10988
+ 201: {
10989
+ headers: {
10990
+ [name: string]: unknown;
10991
+ };
10992
+ content: {
10993
+ "application/json": {
10994
+ /** @example true */
10995
+ success?: boolean;
10996
+ data?: components["schemas"]["RfiMessage"];
10997
+ };
10998
+ };
10999
+ };
11000
+ /** @description `VALIDATION_ERROR` (empty answer, too many files), `FILE_TOO_LARGE`, `UNSUPPORTED_FILE_TYPE` or `INVALID_REQUEST` (malformed multipart) */
11001
+ 400: {
11002
+ headers: {
11003
+ [name: string]: unknown;
11004
+ };
11005
+ content?: never;
11006
+ };
11007
+ 404: components["responses"]["NotFoundError"];
11008
+ /** @description `RFI_CLOSED` — the request no longer accepts replies */
11009
+ 409: {
11010
+ headers: {
11011
+ [name: string]: unknown;
11012
+ };
11013
+ content?: never;
11014
+ };
11015
+ /** @description Too many replies */
11016
+ 429: {
9984
11017
  headers: {
9985
11018
  [name: string]: unknown;
9986
11019
  };
9987
11020
  content?: never;
9988
11021
  };
9989
- 401: components["responses"]["UnauthorizedError"];
9990
11022
  };
9991
11023
  };
9992
- put?: never;
9993
- post?: never;
9994
11024
  delete?: never;
9995
11025
  options?: never;
9996
11026
  head?: never;
9997
11027
  patch?: never;
9998
11028
  trace?: never;
9999
11029
  };
10000
- "/frontend/reference/states": {
11030
+ "/frontend/rfi/{wallet_id}/{case_id}/attachments/{attachment_id}": {
10001
11031
  parameters: {
10002
11032
  query?: never;
10003
11033
  header?: never;
10004
11034
  path?: never;
10005
11035
  cookie?: never;
10006
11036
  };
10007
- /**
10008
- * List states
10009
- * @description Returns states / provinces. Use `country_id` or `country_code` to filter.
10010
- *
10011
- * **Authentication**: Bearer token + x-tenant-id header
10012
- *
10013
- */
11037
+ /** Get a short-lived download link for a file in the conversation */
10014
11038
  get: {
10015
11039
  parameters: {
10016
- query?: {
10017
- country_id?: number;
10018
- country_code?: string;
10019
- search?: string;
10020
- offset?: number;
10021
- limit?: number;
10022
- };
11040
+ query?: never;
10023
11041
  header?: never;
10024
- path?: never;
11042
+ path: {
11043
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
11044
+ wallet_id: components["parameters"]["RfiWalletId"];
11045
+ case_id: components["parameters"]["RfiCaseId"];
11046
+ attachment_id: string;
11047
+ };
10025
11048
  cookie?: never;
10026
11049
  };
10027
11050
  requestBody?: never;
10028
11051
  responses: {
10029
- /** @description States retrieved successfully */
11052
+ /** @description A signed link, valid for `expires_in` seconds — open it right away, do not store it */
10030
11053
  200: {
10031
11054
  headers: {
10032
11055
  [name: string]: unknown;
10033
11056
  };
10034
- content?: never;
11057
+ content: {
11058
+ "application/json": {
11059
+ /** @example true */
11060
+ success?: boolean;
11061
+ data?: {
11062
+ url?: string;
11063
+ /** @example 120 */
11064
+ expires_in?: number;
11065
+ };
11066
+ };
11067
+ };
10035
11068
  };
10036
- 401: components["responses"]["UnauthorizedError"];
11069
+ 404: components["responses"]["NotFoundError"];
10037
11070
  };
10038
11071
  };
10039
11072
  put?: never;
@@ -13411,7 +14444,7 @@ export interface components {
13411
14444
  * @example EXCHANGE_OMNI
13412
14445
  * @enum {string}
13413
14446
  */
13414
- OrderTypeId: "EXCHANGE_OMNI" | "EXCHANGE_OMNI_ONRAMP" | "EXCHANGE_OMNI_OFFRAMP" | "EXCHANGE_OMNI_CRYPTO" | "EXCHANGE_CRYPTO_INTERNAL" | "L2F_ACH_ONRAMP" | "L2F_ACH_OFFRAMP" | "L2F_SEPA_ONRAMP" | "L2F_SEPA_OFFRAMP" | "L2F_SWIFT_ONRAMP" | "L2F_SWIFT_OFFRAMP" | "L2F_WIRE_ONRAMP" | "L2F_WIRE_OFFRAMP" | "L2F_CHAPS_ONRAMP" | "L2F_CHAPS_OFFRAMP" | "L2F_FPS_ONRAMP" | "L2F_FPS_OFFRAMP" | "BRL_WIRE_ONRAMP" | "BRL_WIRE_OFFRAMP" | "BRL_ACH_ONRAMP" | "BRL_ACH_OFFRAMP" | "BRL_RTP_OFFRAMP" | "DLS_WIRE_ONRAMP" | "DLS_WIRE_OFFRAMP" | "DLS_ACH_ONRAMP" | "DLS_ACH_OFFRAMP" | "DLS_SEPA_ONRAMP" | "DLS_SEPA_OFFRAMP" | "DLS_SWIFT_ONRAMP" | "DLS_SWIFT_OFFRAMP" | "BC1_SEPA_ONRAMP" | "BC1_SEPA_OFFRAMP" | "BC1_SWIFT_ONRAMP" | "BC1_SWIFT_OFFRAMP" | "BC3_SEPA_ONRAMP" | "BC3_SEPA_OFFRAMP" | "RPP_SWIFT_OFFRAMP" | "RPP_SEPA_OFFRAMP" | "RPP_FPS_OFFRAMP" | "RPP_ACH_OFFRAMP" | "OMNIBUS_CRYPTO_TRANSFER" | "OMNIBUS_CRYPTO_WITHDRAWAL" | "OMNIBUS_INTERNAL_TRANSFER" | "SEGREGATED_CRYPTO_TRANSFER" | "TRANSFER_INTERNAL" | "TRANSFER_CARD_PREPAID" | "TRANSFER_CARD_SUBACCOUNT" | "TRANSFER_CARD_WHOLESALE" | "WITHDRAW_CARD_PREPAID" | "WITHDRAW_CARD_SUBACCOUNT" | "REFUND_CARD_PREPAID" | "REFUND_CARD_SUBACCOUNT" | "RN_CARDS_OFFRAMP" | "CARD_ISSUING_FEE" | "MONTHLY_FEE";
14447
+ OrderTypeId: "EXCHANGE_OMNI" | "EXCHANGE_OMNI_ONRAMP" | "EXCHANGE_OMNI_OFFRAMP" | "EXCHANGE_OMNI_CRYPTO" | "EXCHANGE_CRYPTO_INTERNAL" | "L2F_ACH_ONRAMP" | "L2F_ACH_OFFRAMP" | "L2F_SEPA_ONRAMP" | "L2F_SEPA_OFFRAMP" | "L2F_SWIFT_ONRAMP" | "L2F_SWIFT_OFFRAMP" | "L2F_WIRE_ONRAMP" | "L2F_WIRE_OFFRAMP" | "L2F_CHAPS_ONRAMP" | "L2F_CHAPS_OFFRAMP" | "L2F_FPS_ONRAMP" | "L2F_FPS_OFFRAMP" | "BRL_WIRE_ONRAMP" | "BRL_WIRE_OFFRAMP" | "BRL_ACH_ONRAMP" | "BRL_ACH_OFFRAMP" | "BRL_RTP_OFFRAMP" | "DLS_WIRE_ONRAMP" | "DLS_WIRE_OFFRAMP" | "DLS_ACH_ONRAMP" | "DLS_ACH_OFFRAMP" | "DLS_SEPA_ONRAMP" | "DLS_SEPA_OFFRAMP" | "DLS_SWIFT_ONRAMP" | "DLS_SWIFT_OFFRAMP" | "BC1_SEPA_ONRAMP" | "BC1_SEPA_OFFRAMP" | "BC1_SWIFT_ONRAMP" | "BC1_SWIFT_OFFRAMP" | "BC3_SEPA_ONRAMP" | "BC3_SEPA_OFFRAMP" | "RPP_SWIFT_OFFRAMP" | "RPP_SEPA_OFFRAMP" | "RPP_FPS_OFFRAMP" | "RPP_ACH_OFFRAMP" | "OMNIBUS_CRYPTO_TRANSFER" | "OMNIBUS_CRYPTO_WITHDRAWAL" | "OMNIBUS_INTERNAL_TRANSFER" | "SEGREGATED_CRYPTO_TRANSFER" | "TRANSFER_INTERNAL" | "TRANSFER_CARD_PREPAID" | "TRANSFER_CARD_SUBACCOUNT" | "TRANSFER_CARD_WHOLESALE" | "WITHDRAW_CARD_PREPAID" | "WITHDRAW_CARD_SUBACCOUNT" | "REFUND_CARD_PREPAID" | "REFUND_CARD_SUBACCOUNT" | "RN_CARDS_OFFRAMP" | "CARD_ISSUING_FEE" | "MONTHLY_FEE" | "REFERRAL_PAYOUT";
13415
14448
  OrderCalculation: {
13416
14449
  /**
13417
14450
  * Format: uuid
@@ -13480,6 +14513,90 @@ export interface components {
13480
14513
  total: number;
13481
14514
  has_more: boolean;
13482
14515
  };
14516
+ /** @description A currency pair enabled for the tenant: the `exchange_rates` row with the tenant FX spread applied. Pairs a vendor rate table adds for its own order types (Reap Payments, `RPP_*`) have no `id`. */
14517
+ ExchangeRate: {
14518
+ /** @description Absent on a vendor-only pair */
14519
+ id?: number;
14520
+ /** Format: date-time */
14521
+ updated_at: string;
14522
+ /** @description Symbol of the currency sold */
14523
+ from?: string;
14524
+ /** @description Symbol of the currency bought */
14525
+ to?: string;
14526
+ /** @description Rate the tenant trades at — `base_rate` with `fx_spread_percent` taken off */
14527
+ rate: number;
14528
+ /** @description Exact inverse of `rate` */
14529
+ inverted_rate: number;
14530
+ /**
14531
+ * @description Feed the market rate came from; `reap_payments` on vendor pairs
14532
+ * @enum {string|null}
14533
+ */
14534
+ rate_source?: "cryptomus" | "coingecko" | "openexchangerates" | "reap_payments" | null;
14535
+ /** Format: uuid */
14536
+ from_uuid: string;
14537
+ /** Format: uuid */
14538
+ to_uuid: string;
14539
+ /** @description Market rate before the tenant FX spread */
14540
+ base_rate: number;
14541
+ /** @description Tenant FX spread taken off `base_rate`, in percent; 0 when none applies */
14542
+ fx_spread_percent: number;
14543
+ };
14544
+ /**
14545
+ * @description Rail an order type pays through (`order_types.payment_method`)
14546
+ * @enum {string}
14547
+ */
14548
+ OrderPaymentMethod: "ACH" | "SWIFT" | "SEPA" | "CRYPTO_EXTERNAL" | "CRYPTO_INTERNAL" | "CHAPS" | "FPS" | "FEDWIRE" | "RTP" | "INTERNAL" | "CARD";
14549
+ /** @description The tenant's markup for the order type (`tenant_order_type_rates`) */
14550
+ OrderTypeTenantRates: {
14551
+ markup_percent: number | null;
14552
+ markup_fixed: number | null;
14553
+ mon_min_usd: number | null;
14554
+ };
14555
+ /** @description An order type from the global catalogue (`order_types`), with its KYC rails and the tenant markup. */
14556
+ OrderTypeInfo: {
14557
+ /** @description Order type id, e.g. `TRANSFER_CARD_SUBACCOUNT` */
14558
+ id: string;
14559
+ name: string | null;
14560
+ description: string | null;
14561
+ /** @enum {string|null} */
14562
+ transaction_type: "deposit" | "withdrawal" | null;
14563
+ payment_method: components["schemas"]["OrderPaymentMethod"] | null;
14564
+ is_internal: boolean | null;
14565
+ /** @description Trusted order types skip the OTP step on approve */
14566
+ is_trusted: boolean;
14567
+ is_deprecated: boolean;
14568
+ /** @description Payouts are limited to the wallet owner's own account */
14569
+ first_party_only: boolean;
14570
+ /**
14571
+ * Format: uuid
14572
+ * @description Legacy single rail; use `order_types_kyc_rails`
14573
+ */
14574
+ kyc_rails_id: string | null;
14575
+ /** @description Minimum amount the product should allow */
14576
+ min_amount: number | null;
14577
+ /** @description Maximum amount the product should allow */
14578
+ max_amount: number | null;
14579
+ order_types_kyc_rails: {
14580
+ /** Format: uuid */
14581
+ id: string;
14582
+ /** Format: uuid */
14583
+ kyc_rail_id: string;
14584
+ }[];
14585
+ /** @description Null when the tenant has no rate row for the type; absent if the rates lookup failed */
14586
+ tenant_rates?: components["schemas"]["OrderTypeTenantRates"] | null;
14587
+ };
14588
+ /** @description An order type enabled for the tenant — one with a `tenant_order_type_rates` row. */
14589
+ ReferenceOrderType: {
14590
+ id: string;
14591
+ description: string | null;
14592
+ is_internal: boolean | null;
14593
+ payment_method: components["schemas"]["OrderPaymentMethod"] | null;
14594
+ is_trusted: boolean;
14595
+ min_amount: number | null;
14596
+ max_amount: number | null;
14597
+ first_party_only: boolean;
14598
+ tenant_rates: components["schemas"]["OrderTypeTenantRates"];
14599
+ };
13483
14600
  ErrorResponse: {
13484
14601
  /** @example false */
13485
14602
  success?: boolean;
@@ -14687,7 +15804,7 @@ export interface components {
14687
15804
  transaction_amount_currency?: string | null;
14688
15805
  /** @description Total amount debited (including fees) */
14689
15806
  billing_amount?: number | null;
14690
- /** Format: uuid */
15807
+ /** @description Currency of `billing_amount`. Not uniform across rails: a currency uuid on most orders, an ISO code (e.g. `EUR`) on L2F off-ramps, the destination currency uuid on BC/DLS on-ramps. Use the order's `from_uuid` for the debited currency. */
14691
15808
  billing_amount_currency?: string | null;
14692
15809
  fee?: number | null;
14693
15810
  /** Format: uuid */
@@ -14734,6 +15851,11 @@ export interface components {
14734
15851
  linked_order_uuid?: string | null;
14735
15852
  /** @description True when the order settled as an internal (on-platform) transfer */
14736
15853
  is_internal?: boolean | null;
15854
+ /**
15855
+ * @description Leg side of an internal transfer: 'out' on the sender's order, 'in' on the receiver's. Card authorizations carry 'out', their refunds 'in'.
15856
+ * @enum {string|null}
15857
+ */
15858
+ direction?: "in" | "out" | null;
14737
15859
  /** Format: uuid */
14738
15860
  counterparty_account_id?: string | null;
14739
15861
  counterparty_account_name?: string | null;
@@ -15254,6 +16376,11 @@ export interface components {
15254
16376
  to_fiat_account_id?: string;
15255
16377
  to_vendor_id?: string;
15256
16378
  txid?: string;
16379
+ /**
16380
+ * @description Which side of the movement this row is: 'out' debits the wallet, 'in' credits it. Set on internal-transfer legs (copied from the order's meta), card authorizations ('out') and their refunds ('in').
16381
+ * @enum {string}
16382
+ */
16383
+ direction?: "in" | "out";
15257
16384
  /** Format: uuid */
15258
16385
  order_id?: string;
15259
16386
  } & {
@@ -15292,6 +16419,94 @@ export interface components {
15292
16419
  /** Format: uuid */
15293
16420
  wallet_id?: string;
15294
16421
  };
16422
+ AmlProvider: {
16423
+ /** @description Name of the on-chain analytics partner, for the "Screening by …" line */
16424
+ display_name?: string;
16425
+ };
16426
+ AmlScreeningAsset: {
16427
+ /** Format: uuid */
16428
+ currency_id?: string;
16429
+ /** @example USDT */
16430
+ symbol?: string;
16431
+ chain_id?: number;
16432
+ /** @example TRX */
16433
+ chain_symbol?: string;
16434
+ /** @example Tron */
16435
+ chain_name?: string;
16436
+ };
16437
+ AmlCheckedCategory: {
16438
+ /** @example sanctions */
16439
+ code?: string;
16440
+ /** @example Sanctions */
16441
+ title?: string;
16442
+ /** @description True when the address has exposure to this category */
16443
+ flagged?: boolean;
16444
+ };
16445
+ AmlScreeningResult: {
16446
+ /** @enum {string} */
16447
+ risk_level?: "LOW" | "ELEVATED" | "HIGH";
16448
+ risk_score?: number;
16449
+ checked_categories?: components["schemas"]["AmlCheckedCategory"][];
16450
+ checked_categories_total?: number;
16451
+ /**
16452
+ * Format: date-time
16453
+ * @description The on-chain data cut the verdict was made against
16454
+ */
16455
+ data_as_of?: string;
16456
+ };
16457
+ AmlScreening: {
16458
+ /** Format: uuid */
16459
+ id?: string;
16460
+ /**
16461
+ * @description PENDING — paid, not yet handed to the provider. SCREENING — the
16462
+ * provider is analysing it; poll `GET …/screenings/{id}`. COMPLETED —
16463
+ * `result` is set and the report can be downloaded. FAILED — no
16464
+ * result will come; the fee has been refunded to the paying balance.
16465
+ *
16466
+ * @enum {string}
16467
+ */
16468
+ status?: "PENDING" | "SCREENING" | "COMPLETED" | "FAILED";
16469
+ /**
16470
+ * @description PAYMENT_FAILED — the fee could not be taken, nothing was charged; the other two refund the fee
16471
+ * @enum {string|null}
16472
+ */
16473
+ failure_reason?: "PAYMENT_FAILED" | "PROVIDER_ERROR" | "TIMEOUT" | null;
16474
+ address?: string;
16475
+ asset?: components["schemas"]["AmlScreeningAsset"];
16476
+ provider?: components["schemas"]["AmlProvider"];
16477
+ /**
16478
+ * Format: uuid
16479
+ * @description The AML_CHECK fee order that paid for the screening
16480
+ */
16481
+ order_id?: string | null;
16482
+ result?: components["schemas"]["AmlScreeningResult"] | null;
16483
+ report_available?: boolean;
16484
+ /** Format: date-time */
16485
+ created_at?: string;
16486
+ /** Format: date-time */
16487
+ completed_at?: string | null;
16488
+ };
16489
+ AmlScreeningQuote: {
16490
+ /** @example 10 */
16491
+ price_usd?: number;
16492
+ /** Format: uuid */
16493
+ price_currency_id?: string;
16494
+ /** Format: uuid */
16495
+ pay_from_currency_id?: string;
16496
+ /** @description How many USD one unit of the paying currency is worth */
16497
+ rate?: number;
16498
+ /** @description What leaves the wallet, in the paying currency */
16499
+ total?: number;
16500
+ provider?: components["schemas"]["AmlProvider"];
16501
+ /** @description Present when `currency_id` was given — whether that token's network can be screened */
16502
+ asset?: {
16503
+ /** Format: uuid */
16504
+ currency_id?: string;
16505
+ supported?: boolean;
16506
+ /** @enum {string|null} */
16507
+ unsupported_reason?: "NOT_CRYPTO" | "UNKNOWN_CURRENCY" | "NETWORK_NOT_SUPPORTED" | null;
16508
+ } | null;
16509
+ };
15295
16510
  Invoice: {
15296
16511
  /** Format: uuid */
15297
16512
  id?: string;
@@ -15581,7 +16796,7 @@ export interface components {
15581
16796
  /** Format: uuid */
15582
16797
  id: string;
15583
16798
  /** @enum {string} */
15584
- type: "DEPOSIT_RECEIVED" | "TRANSFER_RECEIVED" | "ORDER_STATUS_CHANGED" | "KYC_STATUS_CHANGED" | "ANNOUNCEMENT" | "SYSTEM_MESSAGE" | "MASS_PAYOUT_STATUS_CHANGED" | "CARD_OTP";
16799
+ type: "DEPOSIT_RECEIVED" | "DEPOSIT_NOT_ACCEPTED" | "TRANSFER_RECEIVED" | "ORDER_STATUS_CHANGED" | "KYC_STATUS_CHANGED" | "ANNOUNCEMENT" | "SYSTEM_MESSAGE" | "MASS_PAYOUT_STATUS_CHANGED" | "CARD_OTP" | "RFI_REQUESTED" | "RFI_RESOLVED";
15585
16800
  /** @description Structured fact snapshot; the client renders the presentation. Shape depends on `type`; evolution is additive-only. */
15586
16801
  payload: Record<string, never>;
15587
16802
  /** Format: uuid */
@@ -15601,6 +16816,241 @@ export interface components {
15601
16816
  category: "TRANSACTIONS" | "COMPLIANCE" | "ANNOUNCEMENTS" | "SYSTEM" | "SECURITY";
15602
16817
  enabled: boolean;
15603
16818
  };
16819
+ ReferralLevelRate: {
16820
+ /** @example TRANSFER_CARD_SUBACCOUNT */
16821
+ order_type?: string;
16822
+ /** @example Top-ups */
16823
+ label?: string;
16824
+ /** @example 0.7 */
16825
+ percent?: number;
16826
+ /** @example 0 */
16827
+ fixed_usd?: number;
16828
+ };
16829
+ ReferralSummary: {
16830
+ /**
16831
+ * @description The agent's referral code. The invite link is built by the client (`t.me/<bot>?start=referrer=<code>`).
16832
+ * @example k3j9dm2p1q
16833
+ */
16834
+ code?: string;
16835
+ /** @description The current UTC month — the one `earned_usd`, `level` and `breakdown` are about. */
16836
+ period?: {
16837
+ /** @example 2026-09 */
16838
+ month?: string;
16839
+ /** Format: date-time */
16840
+ closes_at?: string;
16841
+ };
16842
+ /**
16843
+ * @description Signed sum of this month's rewards (reversals are negative).
16844
+ * @example 186
16845
+ */
16846
+ earned_usd?: number;
16847
+ /**
16848
+ * @description Earned in closed months and waiting for a payout.
16849
+ * @example 75
16850
+ */
16851
+ pending_usd?: number;
16852
+ /** @example 980 */
16853
+ paid_total_usd?: number;
16854
+ /**
16855
+ * Format: date-time
16856
+ * @description When the first payout was made.
16857
+ */
16858
+ paid_since?: string | null;
16859
+ /** @description Whether the tenant's default tariff runs the program. When false there is no ladder — `level` is null, `levels` and `terms` are empty — while the money fields are still real. */
16860
+ participating?: boolean;
16861
+ level?: {
16862
+ /** @example 2 */
16863
+ no?: number;
16864
+ /** @example Bronze */
16865
+ name?: string;
16866
+ /**
16867
+ * @description This month's turnover the level is measured by.
16868
+ * @example 186000
16869
+ */
16870
+ turnover_usd?: number;
16871
+ /** @description The next level; null on the top one. */
16872
+ next?: {
16873
+ /** @example 3 */
16874
+ no?: number;
16875
+ /** @example Silver */
16876
+ name?: string;
16877
+ /** @example 300000 */
16878
+ min_turnover_usd?: number;
16879
+ /** @example 114000 */
16880
+ remaining_usd?: number;
16881
+ } | null;
16882
+ } | null;
16883
+ /** @description This month by order type — every type the program prices (a zero line before the first order), plus any type the month earned on. */
16884
+ breakdown?: {
16885
+ /** @example CARD_ISSUING_FEE */
16886
+ order_type?: string;
16887
+ /** @example Card openings */
16888
+ label?: string;
16889
+ /** @example 6 */
16890
+ orders?: number;
16891
+ /** @example 300 */
16892
+ amount_usd?: number;
16893
+ /** @example 150 */
16894
+ reward_usd?: number;
16895
+ /** @description What the type pays on the agent's current level; null when the program no longer prices it. */
16896
+ current_rate_percent?: number | null;
16897
+ current_fixed_usd?: number | null;
16898
+ }[];
16899
+ /** @description The ladder, for the levels carousel. */
16900
+ levels?: {
16901
+ no?: number;
16902
+ name?: string;
16903
+ min_turnover_usd?: number;
16904
+ /** @description The threshold of the next level; null on the top one. */
16905
+ max_turnover_usd?: number | null;
16906
+ rates?: components["schemas"]["ReferralLevelRate"][];
16907
+ }[];
16908
+ /** @description The "Program terms" lines — what each order type pays across the levels. */
16909
+ terms?: {
16910
+ order_type?: string;
16911
+ /** @example Top-ups */
16912
+ label?: string;
16913
+ /** @example 0.5%–1.3% */
16914
+ fee_label?: string;
16915
+ counts_toward_turnover?: boolean;
16916
+ }[];
16917
+ };
16918
+ ReferralEvent: {
16919
+ /** Format: uuid */
16920
+ id?: string;
16921
+ /** @enum {string} */
16922
+ kind?: "ACCRUAL" | "REVERSAL";
16923
+ /** @enum {string} */
16924
+ status?: "PENDING" | "PAID";
16925
+ /** @example TRANSFER_CARD_SUBACCOUNT */
16926
+ order_type?: string;
16927
+ /** @example Top-ups */
16928
+ label?: string;
16929
+ /**
16930
+ * @description The referred customer, anonymised.
16931
+ * @example Customer 4821
16932
+ */
16933
+ customer_alias?: string;
16934
+ /** @example 18000 */
16935
+ amount_usd?: number;
16936
+ /** @example 0.7 */
16937
+ rate_percent?: number;
16938
+ /** @example 0 */
16939
+ fixed_usd?: number;
16940
+ /**
16941
+ * @description Negative on a REVERSAL.
16942
+ * @example 126
16943
+ */
16944
+ reward_usd?: number;
16945
+ /** @example 2 */
16946
+ level_no?: number;
16947
+ /** @example Bronze */
16948
+ level_name?: string;
16949
+ /** Format: date-time */
16950
+ occurred_at?: string;
16951
+ };
16952
+ ReferralPayout: {
16953
+ /** @example 2026-08 */
16954
+ period?: string;
16955
+ /** @enum {string} */
16956
+ status?: "PROCESSING" | "PAID";
16957
+ /** @example 980 */
16958
+ amount_usd?: number;
16959
+ /** Format: date-time */
16960
+ created_at?: string;
16961
+ /** Format: date-time */
16962
+ paid_at?: string | null;
16963
+ };
16964
+ ReferralTelegramReportSetting: {
16965
+ /** @description The user has started the tenant's Telegram bot. */
16966
+ linked?: boolean;
16967
+ /** @description The report is sent to Telegram every month. Always false while not linked. */
16968
+ enabled?: boolean;
16969
+ };
16970
+ RfiCase: {
16971
+ /** Format: uuid */
16972
+ id?: string;
16973
+ /**
16974
+ * @description Human-facing id — quoted in the notification email
16975
+ * @example RFI-000042
16976
+ */
16977
+ reference?: string;
16978
+ /** @enum {string} */
16979
+ type?: "onboarding" | "transaction" | "ongoing";
16980
+ /**
16981
+ * @description `action_required` — compliance asked and waits for the client; `awaiting_compliance` — the client answered, compliance is reviewing; `closed` — no longer accepts replies.
16982
+ * @enum {string}
16983
+ */
16984
+ status?: "action_required" | "awaiting_compliance" | "closed";
16985
+ /**
16986
+ * Format: date-time
16987
+ * @description When the answer is due
16988
+ */
16989
+ due_at?: string | null;
16990
+ /** @description True only while `action_required` and past `due_at` (red banner) */
16991
+ overdue?: boolean;
16992
+ /** @description One of the covered transactions is held until the request closes */
16993
+ holds_transaction?: boolean;
16994
+ /** @description The account is on hold while the request is open */
16995
+ holds_account?: boolean;
16996
+ /** @description How many transactions the request covers */
16997
+ transactions_count?: number;
16998
+ /** @description The last message of the conversation, for the card — null while nothing is visible yet */
16999
+ last_message?: {
17000
+ /** @enum {string} */
17001
+ author?: "compliance" | "client";
17002
+ /** @description One line of the message, up to 140 characters, cut at a word */
17003
+ preview?: string | null;
17004
+ /** Format: date-time */
17005
+ created_at?: string;
17006
+ } | null;
17007
+ /** Format: date-time */
17008
+ created_at?: string;
17009
+ /** Format: date-time */
17010
+ updated_at?: string;
17011
+ /** Format: date-time */
17012
+ closed_at?: string | null;
17013
+ };
17014
+ RfiAttachment: {
17015
+ /** Format: uuid */
17016
+ id?: string;
17017
+ file_name?: string;
17018
+ content_type?: string | null;
17019
+ size_bytes?: number | null;
17020
+ /** Format: date-time */
17021
+ created_at?: string;
17022
+ };
17023
+ RfiMessage: {
17024
+ /** Format: uuid */
17025
+ id?: string;
17026
+ /** @enum {string} */
17027
+ author?: "compliance" | "client";
17028
+ /**
17029
+ * @description The analyst's signature on a compliance message — first name and last initial, from the analyst's current name. Null on the client's own messages (render them as "You") and when no name is on record.
17030
+ * @example Polina S
17031
+ */
17032
+ author_name?: string | null;
17033
+ body?: string;
17034
+ attachments?: components["schemas"]["RfiAttachment"][];
17035
+ /** Format: date-time */
17036
+ created_at?: string;
17037
+ };
17038
+ RfiTransaction: {
17039
+ order_uuid?: string;
17040
+ order_type?: string | null;
17041
+ status?: string | null;
17042
+ amount_from?: number | null;
17043
+ amount_to?: number | null;
17044
+ /** Format: date-time */
17045
+ created_at?: string | null;
17046
+ };
17047
+ RfiCaseDetail: components["schemas"]["RfiCase"] & {
17048
+ can_reply?: boolean;
17049
+ /** @description The conversation, oldest first */
17050
+ messages?: components["schemas"]["RfiMessage"][];
17051
+ /** @description Every transaction the request covers, in the order compliance linked them */
17052
+ transactions?: components["schemas"]["RfiTransaction"][];
17053
+ };
15604
17054
  };
15605
17055
  responses: {
15606
17056
  /** @description Authentication credentials are missing or invalid */
@@ -15658,6 +17108,9 @@ export interface components {
15658
17108
  * @example e04c0c85-b031-47d7-8541-207b4e83d91a
15659
17109
  */
15660
17110
  TenantId: string;
17111
+ /** @description Wallet the screening belongs to (and is paid from) */
17112
+ AmlWalletId: string;
17113
+ AmlScreeningId: string;
15661
17114
  /** @description Wallet the invoices belong to */
15662
17115
  InvoiceWalletId: string;
15663
17116
  InvoiceId: string;
@@ -15667,6 +17120,9 @@ export interface components {
15667
17120
  MassPayoutWalletId: string;
15668
17121
  MassPayoutId: string;
15669
17122
  MassPayoutTemplateId: string;
17123
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
17124
+ RfiWalletId: string;
17125
+ RfiCaseId: string;
15670
17126
  };
15671
17127
  requestBodies: never;
15672
17128
  headers: never;