squarefi-bff-api-module 1.36.65 → 1.36.67

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
@@ -9641,6 +9955,8 @@ export interface paths {
9641
9955
  type?: "token" | "native";
9642
9956
  symbol?: string;
9643
9957
  enabled_only?: boolean;
9958
+ /** @description Only tokens whose network the tenant's AML provider can screen addresses on */
9959
+ aml_supported?: boolean;
9644
9960
  offset?: number;
9645
9961
  limit?: number;
9646
9962
  };
@@ -9650,7 +9966,7 @@ export interface paths {
9650
9966
  };
9651
9967
  requestBody?: never;
9652
9968
  responses: {
9653
- /** @description Currencies list retrieved successfully */
9969
+ /** @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
9970
  200: {
9655
9971
  headers: {
9656
9972
  [name: string]: unknown;
@@ -9878,6 +10194,8 @@ export interface paths {
9878
10194
  get: {
9879
10195
  parameters: {
9880
10196
  query?: {
10197
+ /** @description Only networks the tenant's AML provider can screen addresses on */
10198
+ aml_supported?: boolean;
9881
10199
  offset?: number;
9882
10200
  limit?: number;
9883
10201
  };
@@ -9887,7 +10205,7 @@ export interface paths {
9887
10205
  };
9888
10206
  requestBody?: never;
9889
10207
  responses: {
9890
- /** @description Chains retrieved successfully */
10208
+ /** @description Chains retrieved successfully. Every item carries `aml_supported`; always false while AML screening is off for the tenant. */
9891
10209
  200: {
9892
10210
  headers: {
9893
10211
  [name: string]: unknown;
@@ -10044,24 +10362,711 @@ export interface paths {
10044
10362
  patch?: never;
10045
10363
  trace?: never;
10046
10364
  };
10047
- "/frontend/user_verification/init": {
10365
+ "/frontend/referrals/summary": {
10048
10366
  parameters: {
10049
10367
  query?: never;
10050
10368
  header?: never;
10051
10369
  path?: never;
10052
10370
  cookie?: never;
10053
10371
  };
10054
- get?: never;
10055
- put?: never;
10056
10372
  /**
10057
- * Initialize user-level Sumsub verification
10058
- * @description Starts (or upgrades) the caller's user-level Sumsub verification via
10059
- * the Auth API. The chosen `flow` maps to a tenant-configured Sumsub
10060
- * level — `data` (personal information), `documents` (+identity
10061
- * document) or `face` (+face check) — and the whole level is completed
10062
- * as one WebSDK session. Returns the Sumsub applicant id plus a
10063
- * short-lived WebSDK access token. The caller's Bearer token is
10064
- * forwarded to the Auth API.
10373
+ * The agent's referral summary
10374
+ * @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.
10375
+ */
10376
+ get: {
10377
+ parameters: {
10378
+ query?: never;
10379
+ header?: never;
10380
+ path?: never;
10381
+ cookie?: never;
10382
+ };
10383
+ requestBody?: never;
10384
+ responses: {
10385
+ /** @description The summary. */
10386
+ 200: {
10387
+ headers: {
10388
+ [name: string]: unknown;
10389
+ };
10390
+ content: {
10391
+ "application/json": {
10392
+ /** @example true */
10393
+ success?: boolean;
10394
+ data?: components["schemas"]["ReferralSummary"];
10395
+ };
10396
+ };
10397
+ };
10398
+ 401: components["responses"]["UnauthorizedError"];
10399
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10400
+ 403: {
10401
+ headers: {
10402
+ [name: string]: unknown;
10403
+ };
10404
+ content?: never;
10405
+ };
10406
+ };
10407
+ };
10408
+ put?: never;
10409
+ post?: never;
10410
+ delete?: never;
10411
+ options?: never;
10412
+ head?: never;
10413
+ patch?: never;
10414
+ trace?: never;
10415
+ };
10416
+ "/frontend/referrals/events": {
10417
+ parameters: {
10418
+ query?: never;
10419
+ header?: never;
10420
+ path?: never;
10421
+ cookie?: never;
10422
+ };
10423
+ /**
10424
+ * The agent's rewards of a month
10425
+ * @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.
10426
+ */
10427
+ get: {
10428
+ parameters: {
10429
+ query?: {
10430
+ /** @description UTC month `YYYY-MM`; defaults to the current one. */
10431
+ period?: string;
10432
+ offset?: number;
10433
+ limit?: number;
10434
+ };
10435
+ header?: never;
10436
+ path?: never;
10437
+ cookie?: never;
10438
+ };
10439
+ requestBody?: never;
10440
+ responses: {
10441
+ /** @description A page of rows; `meta.period` names the month served. */
10442
+ 200: {
10443
+ headers: {
10444
+ [name: string]: unknown;
10445
+ };
10446
+ content: {
10447
+ "application/json": {
10448
+ /** @example true */
10449
+ success?: boolean;
10450
+ data?: components["schemas"]["ReferralEvent"][];
10451
+ pagination?: components["schemas"]["PaginationResponse"];
10452
+ meta?: {
10453
+ /** @example 2026-09 */
10454
+ period?: string;
10455
+ };
10456
+ };
10457
+ };
10458
+ };
10459
+ /** @description Invalid query (`VALIDATION_ERROR`). */
10460
+ 400: {
10461
+ headers: {
10462
+ [name: string]: unknown;
10463
+ };
10464
+ content?: never;
10465
+ };
10466
+ 401: components["responses"]["UnauthorizedError"];
10467
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10468
+ 403: {
10469
+ headers: {
10470
+ [name: string]: unknown;
10471
+ };
10472
+ content?: never;
10473
+ };
10474
+ };
10475
+ };
10476
+ put?: never;
10477
+ post?: never;
10478
+ delete?: never;
10479
+ options?: never;
10480
+ head?: never;
10481
+ patch?: never;
10482
+ trace?: never;
10483
+ };
10484
+ "/frontend/referrals/payouts": {
10485
+ parameters: {
10486
+ query?: never;
10487
+ header?: never;
10488
+ path?: never;
10489
+ cookie?: never;
10490
+ };
10491
+ /**
10492
+ * The agent's payouts
10493
+ * @description One per closed month the agent was paid for (or is being paid for), newest month first.
10494
+ */
10495
+ get: {
10496
+ parameters: {
10497
+ query?: {
10498
+ offset?: number;
10499
+ limit?: number;
10500
+ };
10501
+ header?: never;
10502
+ path?: never;
10503
+ cookie?: never;
10504
+ };
10505
+ requestBody?: never;
10506
+ responses: {
10507
+ /** @description A page of payouts. */
10508
+ 200: {
10509
+ headers: {
10510
+ [name: string]: unknown;
10511
+ };
10512
+ content: {
10513
+ "application/json": {
10514
+ /** @example true */
10515
+ success?: boolean;
10516
+ data?: components["schemas"]["ReferralPayout"][];
10517
+ pagination?: components["schemas"]["PaginationResponse"];
10518
+ };
10519
+ };
10520
+ };
10521
+ 401: components["responses"]["UnauthorizedError"];
10522
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10523
+ 403: {
10524
+ headers: {
10525
+ [name: string]: unknown;
10526
+ };
10527
+ content?: never;
10528
+ };
10529
+ };
10530
+ };
10531
+ put?: never;
10532
+ post?: never;
10533
+ delete?: never;
10534
+ options?: never;
10535
+ head?: never;
10536
+ patch?: never;
10537
+ trace?: never;
10538
+ };
10539
+ "/frontend/referrals/report": {
10540
+ parameters: {
10541
+ query?: never;
10542
+ header?: never;
10543
+ path?: never;
10544
+ cookie?: never;
10545
+ };
10546
+ /**
10547
+ * Download the monthly referral report (PDF)
10548
+ * @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.
10549
+ */
10550
+ get: {
10551
+ parameters: {
10552
+ query?: {
10553
+ /** @description UTC month `YYYY-MM`; defaults to the last closed month. */
10554
+ period?: string;
10555
+ };
10556
+ header?: never;
10557
+ path?: never;
10558
+ cookie?: never;
10559
+ };
10560
+ requestBody?: never;
10561
+ responses: {
10562
+ /** @description PDF file */
10563
+ 200: {
10564
+ headers: {
10565
+ [name: string]: unknown;
10566
+ };
10567
+ content: {
10568
+ "application/pdf": string;
10569
+ };
10570
+ };
10571
+ /** @description Invalid query (`VALIDATION_ERROR`). */
10572
+ 400: {
10573
+ headers: {
10574
+ [name: string]: unknown;
10575
+ };
10576
+ content?: never;
10577
+ };
10578
+ 401: components["responses"]["UnauthorizedError"];
10579
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10580
+ 403: {
10581
+ headers: {
10582
+ [name: string]: unknown;
10583
+ };
10584
+ content?: never;
10585
+ };
10586
+ /** @description More than 5 report requests (downloads and Telegram sends together) in a minute (`RATE_LIMIT_EXCEEDED`). */
10587
+ 429: {
10588
+ headers: {
10589
+ [name: string]: unknown;
10590
+ };
10591
+ content?: never;
10592
+ };
10593
+ };
10594
+ };
10595
+ put?: never;
10596
+ post?: never;
10597
+ delete?: never;
10598
+ options?: never;
10599
+ head?: never;
10600
+ patch?: never;
10601
+ trace?: never;
10602
+ };
10603
+ "/frontend/referrals/report/telegram": {
10604
+ parameters: {
10605
+ query?: never;
10606
+ header?: never;
10607
+ path?: never;
10608
+ cookie?: never;
10609
+ };
10610
+ get?: never;
10611
+ put?: never;
10612
+ /**
10613
+ * Send the monthly referral report to the user's Telegram
10614
+ * @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.
10615
+ */
10616
+ post: {
10617
+ parameters: {
10618
+ query?: never;
10619
+ header?: never;
10620
+ path?: never;
10621
+ cookie?: never;
10622
+ };
10623
+ requestBody?: {
10624
+ content: {
10625
+ "application/json": {
10626
+ /**
10627
+ * @description UTC month; defaults to the last closed month.
10628
+ * @example 2026-08
10629
+ */
10630
+ period?: string;
10631
+ };
10632
+ };
10633
+ };
10634
+ responses: {
10635
+ /** @description The report was handed to Telegram. */
10636
+ 200: {
10637
+ headers: {
10638
+ [name: string]: unknown;
10639
+ };
10640
+ content: {
10641
+ "application/json": {
10642
+ /** @example true */
10643
+ success?: boolean;
10644
+ data?: {
10645
+ /** @example true */
10646
+ sent?: boolean;
10647
+ /** @example 2026-08 */
10648
+ period?: string;
10649
+ };
10650
+ };
10651
+ };
10652
+ };
10653
+ /** @description Invalid body (`VALIDATION_ERROR`). */
10654
+ 400: {
10655
+ headers: {
10656
+ [name: string]: unknown;
10657
+ };
10658
+ content?: never;
10659
+ };
10660
+ 401: components["responses"]["UnauthorizedError"];
10661
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10662
+ 403: {
10663
+ headers: {
10664
+ [name: string]: unknown;
10665
+ };
10666
+ content?: never;
10667
+ };
10668
+ /** @description The user has not started the tenant's bot (`TELEGRAM_NOT_LINKED`), or the tenant runs no bot (`TELEGRAM_NOT_AVAILABLE`). */
10669
+ 409: {
10670
+ headers: {
10671
+ [name: string]: unknown;
10672
+ };
10673
+ content?: never;
10674
+ };
10675
+ /** @description More than 5 report requests (downloads and Telegram sends together) in a minute (`RATE_LIMIT_EXCEEDED`). */
10676
+ 429: {
10677
+ headers: {
10678
+ [name: string]: unknown;
10679
+ };
10680
+ content?: never;
10681
+ };
10682
+ /** @description Telegram did not accept the document (`TELEGRAM_DELIVERY_FAILED`); retry later. */
10683
+ 503: {
10684
+ headers: {
10685
+ [name: string]: unknown;
10686
+ };
10687
+ content?: never;
10688
+ };
10689
+ };
10690
+ };
10691
+ delete?: never;
10692
+ options?: never;
10693
+ head?: never;
10694
+ patch?: never;
10695
+ trace?: never;
10696
+ };
10697
+ "/frontend/referrals/telegram-report": {
10698
+ parameters: {
10699
+ query?: never;
10700
+ header?: never;
10701
+ path?: never;
10702
+ cookie?: never;
10703
+ };
10704
+ /**
10705
+ * The "report every month" Telegram setting
10706
+ * @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.
10707
+ */
10708
+ get: {
10709
+ parameters: {
10710
+ query?: never;
10711
+ header?: never;
10712
+ path?: never;
10713
+ cookie?: never;
10714
+ };
10715
+ requestBody?: never;
10716
+ responses: {
10717
+ /** @description The setting. */
10718
+ 200: {
10719
+ headers: {
10720
+ [name: string]: unknown;
10721
+ };
10722
+ content: {
10723
+ "application/json": {
10724
+ /** @example true */
10725
+ success?: boolean;
10726
+ data?: components["schemas"]["ReferralTelegramReportSetting"];
10727
+ };
10728
+ };
10729
+ };
10730
+ 401: components["responses"]["UnauthorizedError"];
10731
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10732
+ 403: {
10733
+ headers: {
10734
+ [name: string]: unknown;
10735
+ };
10736
+ content?: never;
10737
+ };
10738
+ };
10739
+ };
10740
+ /** Switch the monthly Telegram report on or off */
10741
+ put: {
10742
+ parameters: {
10743
+ query?: never;
10744
+ header?: never;
10745
+ path?: never;
10746
+ cookie?: never;
10747
+ };
10748
+ requestBody: {
10749
+ content: {
10750
+ "application/json": {
10751
+ enabled: boolean;
10752
+ };
10753
+ };
10754
+ };
10755
+ responses: {
10756
+ /** @description The setting after the change. */
10757
+ 200: {
10758
+ headers: {
10759
+ [name: string]: unknown;
10760
+ };
10761
+ content: {
10762
+ "application/json": {
10763
+ /** @example true */
10764
+ success?: boolean;
10765
+ data?: components["schemas"]["ReferralTelegramReportSetting"];
10766
+ };
10767
+ };
10768
+ };
10769
+ /** @description Invalid body (`VALIDATION_ERROR`). */
10770
+ 400: {
10771
+ headers: {
10772
+ [name: string]: unknown;
10773
+ };
10774
+ content?: never;
10775
+ };
10776
+ 401: components["responses"]["UnauthorizedError"];
10777
+ /** @description The referral program is not enabled for the tenant (`REFERRAL_PROGRAM_NOT_ENABLED`). */
10778
+ 403: {
10779
+ headers: {
10780
+ [name: string]: unknown;
10781
+ };
10782
+ content?: never;
10783
+ };
10784
+ /** @description The user has not started the tenant's bot (`TELEGRAM_NOT_LINKED`) — there is nowhere to send the report. */
10785
+ 409: {
10786
+ headers: {
10787
+ [name: string]: unknown;
10788
+ };
10789
+ content?: never;
10790
+ };
10791
+ };
10792
+ };
10793
+ post?: never;
10794
+ delete?: never;
10795
+ options?: never;
10796
+ head?: never;
10797
+ patch?: never;
10798
+ trace?: never;
10799
+ };
10800
+ "/frontend/rfi/{wallet_id}": {
10801
+ parameters: {
10802
+ query?: never;
10803
+ header?: never;
10804
+ path?: never;
10805
+ cookie?: never;
10806
+ };
10807
+ /**
10808
+ * List compliance requests (RFI) of an account, with the banner counters
10809
+ * @description Requests for information compliance sent about this account, newest first. `summary`
10810
+ * counts every open request regardless of paging — use it for the home-screen banner:
10811
+ * `action_required > 0` shows it, `overdue > 0` turns it red, `next_due_at` is the
10812
+ * nearest deadline. Any wallet member except the scoped `user` role may read.
10813
+ * Refresh on the realtime `data.changed` hint with entity `WALLET_RFI`.
10814
+ *
10815
+ */
10816
+ get: {
10817
+ parameters: {
10818
+ query?: {
10819
+ /** @description `open` — everything still in progress (`action_required` + `awaiting_compliance`), the Open tab; `closed` — the Resolved tab. */
10820
+ status?: "open" | "action_required" | "awaiting_compliance" | "closed";
10821
+ /** @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. */
10822
+ order_uuid?: string;
10823
+ limit?: number;
10824
+ offset?: number;
10825
+ };
10826
+ header?: never;
10827
+ path: {
10828
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
10829
+ wallet_id: components["parameters"]["RfiWalletId"];
10830
+ };
10831
+ cookie?: never;
10832
+ };
10833
+ requestBody?: never;
10834
+ responses: {
10835
+ /** @description Page of requests and the open-request counters */
10836
+ 200: {
10837
+ headers: {
10838
+ [name: string]: unknown;
10839
+ };
10840
+ content: {
10841
+ "application/json": {
10842
+ /** @example true */
10843
+ success?: boolean;
10844
+ data?: {
10845
+ summary?: {
10846
+ action_required?: number;
10847
+ overdue?: number;
10848
+ awaiting_compliance?: number;
10849
+ /** Format: date-time */
10850
+ next_due_at?: string | null;
10851
+ };
10852
+ items?: components["schemas"]["RfiCase"][];
10853
+ total?: number;
10854
+ limit?: number;
10855
+ offset?: number;
10856
+ };
10857
+ };
10858
+ };
10859
+ };
10860
+ 403: components["responses"]["ForbiddenError"];
10861
+ };
10862
+ };
10863
+ put?: never;
10864
+ post?: never;
10865
+ delete?: never;
10866
+ options?: never;
10867
+ head?: never;
10868
+ patch?: never;
10869
+ trace?: never;
10870
+ };
10871
+ "/frontend/rfi/{wallet_id}/{case_id}": {
10872
+ parameters: {
10873
+ query?: never;
10874
+ header?: never;
10875
+ path?: never;
10876
+ cookie?: never;
10877
+ };
10878
+ /**
10879
+ * Get a compliance request with its conversation and covered transactions
10880
+ * @description The conversation holds compliance's questions and the client's answers, oldest first.
10881
+ * A request of another account answers 404.
10882
+ *
10883
+ */
10884
+ get: {
10885
+ parameters: {
10886
+ query?: never;
10887
+ header?: never;
10888
+ path: {
10889
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
10890
+ wallet_id: components["parameters"]["RfiWalletId"];
10891
+ case_id: components["parameters"]["RfiCaseId"];
10892
+ };
10893
+ cookie?: never;
10894
+ };
10895
+ requestBody?: never;
10896
+ responses: {
10897
+ /** @description The request */
10898
+ 200: {
10899
+ headers: {
10900
+ [name: string]: unknown;
10901
+ };
10902
+ content: {
10903
+ "application/json": {
10904
+ /** @example true */
10905
+ success?: boolean;
10906
+ data?: components["schemas"]["RfiCaseDetail"];
10907
+ };
10908
+ };
10909
+ };
10910
+ 404: components["responses"]["NotFoundError"];
10911
+ };
10912
+ };
10913
+ put?: never;
10914
+ post?: never;
10915
+ delete?: never;
10916
+ options?: never;
10917
+ head?: never;
10918
+ patch?: never;
10919
+ trace?: never;
10920
+ };
10921
+ "/frontend/rfi/{wallet_id}/{case_id}/messages": {
10922
+ parameters: {
10923
+ query?: never;
10924
+ header?: never;
10925
+ path?: never;
10926
+ cookie?: never;
10927
+ };
10928
+ get?: never;
10929
+ put?: never;
10930
+ /**
10931
+ * Answer a compliance request
10932
+ * @description `multipart/form-data` with a `body` text field and up to 10 files under `files`
10933
+ * (PDF, JPEG, PNG, WebP, TXT, DOCX, XLSX; 20 MB each). At least one of the two is required.
10934
+ * The request moves to `awaiting_compliance`; answering again while compliance reviews is
10935
+ * allowed, and compliance may ask further rounds. Requires the `admin` role on the wallet.
10936
+ * Do not set `Content-Type` manually — the browser adds the multipart boundary.
10937
+ *
10938
+ */
10939
+ post: {
10940
+ parameters: {
10941
+ query?: never;
10942
+ header?: never;
10943
+ path: {
10944
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
10945
+ wallet_id: components["parameters"]["RfiWalletId"];
10946
+ case_id: components["parameters"]["RfiCaseId"];
10947
+ };
10948
+ cookie?: never;
10949
+ };
10950
+ requestBody: {
10951
+ content: {
10952
+ "multipart/form-data": {
10953
+ body?: string;
10954
+ files?: string[];
10955
+ };
10956
+ };
10957
+ };
10958
+ responses: {
10959
+ /** @description The message as stored */
10960
+ 201: {
10961
+ headers: {
10962
+ [name: string]: unknown;
10963
+ };
10964
+ content: {
10965
+ "application/json": {
10966
+ /** @example true */
10967
+ success?: boolean;
10968
+ data?: components["schemas"]["RfiMessage"];
10969
+ };
10970
+ };
10971
+ };
10972
+ /** @description `VALIDATION_ERROR` (empty answer, too many files), `FILE_TOO_LARGE`, `UNSUPPORTED_FILE_TYPE` or `INVALID_REQUEST` (malformed multipart) */
10973
+ 400: {
10974
+ headers: {
10975
+ [name: string]: unknown;
10976
+ };
10977
+ content?: never;
10978
+ };
10979
+ 404: components["responses"]["NotFoundError"];
10980
+ /** @description `RFI_CLOSED` — the request no longer accepts replies */
10981
+ 409: {
10982
+ headers: {
10983
+ [name: string]: unknown;
10984
+ };
10985
+ content?: never;
10986
+ };
10987
+ /** @description Too many replies */
10988
+ 429: {
10989
+ headers: {
10990
+ [name: string]: unknown;
10991
+ };
10992
+ content?: never;
10993
+ };
10994
+ };
10995
+ };
10996
+ delete?: never;
10997
+ options?: never;
10998
+ head?: never;
10999
+ patch?: never;
11000
+ trace?: never;
11001
+ };
11002
+ "/frontend/rfi/{wallet_id}/{case_id}/attachments/{attachment_id}": {
11003
+ parameters: {
11004
+ query?: never;
11005
+ header?: never;
11006
+ path?: never;
11007
+ cookie?: never;
11008
+ };
11009
+ /** Get a short-lived download link for a file in the conversation */
11010
+ get: {
11011
+ parameters: {
11012
+ query?: never;
11013
+ header?: never;
11014
+ path: {
11015
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
11016
+ wallet_id: components["parameters"]["RfiWalletId"];
11017
+ case_id: components["parameters"]["RfiCaseId"];
11018
+ attachment_id: string;
11019
+ };
11020
+ cookie?: never;
11021
+ };
11022
+ requestBody?: never;
11023
+ responses: {
11024
+ /** @description A signed link, valid for `expires_in` seconds — open it right away, do not store it */
11025
+ 200: {
11026
+ headers: {
11027
+ [name: string]: unknown;
11028
+ };
11029
+ content: {
11030
+ "application/json": {
11031
+ /** @example true */
11032
+ success?: boolean;
11033
+ data?: {
11034
+ url?: string;
11035
+ /** @example 120 */
11036
+ expires_in?: number;
11037
+ };
11038
+ };
11039
+ };
11040
+ };
11041
+ 404: components["responses"]["NotFoundError"];
11042
+ };
11043
+ };
11044
+ put?: never;
11045
+ post?: never;
11046
+ delete?: never;
11047
+ options?: never;
11048
+ head?: never;
11049
+ patch?: never;
11050
+ trace?: never;
11051
+ };
11052
+ "/frontend/user_verification/init": {
11053
+ parameters: {
11054
+ query?: never;
11055
+ header?: never;
11056
+ path?: never;
11057
+ cookie?: never;
11058
+ };
11059
+ get?: never;
11060
+ put?: never;
11061
+ /**
11062
+ * Initialize user-level Sumsub verification
11063
+ * @description Starts (or upgrades) the caller's user-level Sumsub verification via
11064
+ * the Auth API. The chosen `flow` maps to a tenant-configured Sumsub
11065
+ * level — `data` (personal information), `documents` (+identity
11066
+ * document) or `face` (+face check) — and the whole level is completed
11067
+ * as one WebSDK session. Returns the Sumsub applicant id plus a
11068
+ * short-lived WebSDK access token. The caller's Bearer token is
11069
+ * forwarded to the Auth API.
10065
11070
  *
10066
11071
  * User-scoped: no wallet is involved, unlike
10067
11072
  * `/frontend/kyc_verification/{wallet_id}/init`.
@@ -11257,7 +12262,7 @@ export interface paths {
11257
12262
  * Each wallet includes `access_role` (owner/admin/user/auditor) and `is_owner` boolean.
11258
12263
  *
11259
12264
  * Wallets where the caller holds the scoped `user` role are returned as a reduced shell
11260
- * (`uuid`, `name`, `display_name`, `tenant_id`, `kyc_info`, `created_at` + the role fields) — no `logo_url`.
12265
+ * (`uuid`, `name`, `display_name`, `tenant_id`, `kyc_entity_id`, `kyc_info`, `created_at` + the role fields) — no `logo_url`.
11261
12266
  *
11262
12267
  * **Authentication**: Bearer token with x-tenant-id header required
11263
12268
  *
@@ -11323,20 +12328,18 @@ export interface paths {
11323
12328
  access_role: "owner" | "admin" | "user" | "auditor";
11324
12329
  /** @description True if user is the wallet owner */
11325
12330
  is_owner: boolean;
12331
+ /**
12332
+ * Format: uuid
12333
+ * @description KYC entity the wallet was opened for (`GET /kyc/entities`) — group the
12334
+ * list by it to see which accounts an entity already has. `null` for a
12335
+ * wallet created without one.
12336
+ *
12337
+ */
12338
+ kyc_entity_id: string | null;
11326
12339
  /** @description KYC entity attached to the wallet (joined from `kyc_entity`).
11327
12340
  * `null` when the wallet has no KYC entity yet.
11328
12341
  * */
11329
- kyc_info: {
11330
- /** @description KYC entity type (e.g. INDIVIDUAL, BUSINESS) */
11331
- type: string;
11332
- /** @description KYC verification status (e.g. UNVERIFIED, PENDING, APPROVED, REJECTED) */
11333
- status: string;
11334
- business_name: string | null;
11335
- first_name: string | null;
11336
- last_name: string | null;
11337
- email: string | null;
11338
- phone: string | null;
11339
- } | null;
12342
+ kyc_info: components["schemas"]["WalletKycInfo"] | null;
11340
12343
  }[];
11341
12344
  pagination: {
11342
12345
  offset: number;
@@ -11373,6 +12376,10 @@ export interface paths {
11373
12376
  * - `empty_name: false` or omitted (default) → a random placeholder name
11374
12377
  * is generated (e.g., "Golden Vault 42").
11375
12378
  * - `empty_name: true` → the wallet is created with `name: null`.
12379
+ * - **purpose** — what the account is opened for, one of the listed codes.
12380
+ * `other` needs a free-text **purpose_other**; any other code refuses it.
12381
+ * Stored once with the wallet: it cannot be changed later and no
12382
+ * endpoint returns it.
11376
12383
  *
11377
12384
  * **Authentication**: Bearer token with x-tenant-id header required
11378
12385
  *
@@ -11410,6 +12417,21 @@ export interface paths {
11410
12417
  *
11411
12418
  */
11412
12419
  kyc_entity_id?: string;
12420
+ /**
12421
+ * @description What the account is opened for. Only the code travels — labels
12422
+ * are the client's. Write-once and never returned.
12423
+ *
12424
+ * @example payroll
12425
+ * @enum {string}
12426
+ */
12427
+ purpose?: "payroll" | "client_or_project_funds" | "treasury_or_reserves" | "separate_by_team" | "separate_by_currency_or_region" | "other";
12428
+ /**
12429
+ * @description Free-text purpose. Required when `purpose` is `other`, refused
12430
+ * with any other `purpose` (a blank value counts as absent).
12431
+ *
12432
+ * @example Contractor payouts
12433
+ */
12434
+ purpose_other?: string | null;
11413
12435
  };
11414
12436
  };
11415
12437
  };
@@ -11438,25 +12460,22 @@ export interface paths {
11438
12460
  tenant_id: string;
11439
12461
  /** Format: date-time */
11440
12462
  created_at: string;
12463
+ /**
12464
+ * Format: uuid
12465
+ * @description KYC entity the wallet was opened for. `null` for a wallet created without one.
12466
+ */
12467
+ kyc_entity_id: string | null;
11441
12468
  /** @description Mirrors the GET-wallet shape. `null` when the wallet was created
11442
12469
  * without `kyc_entity_id`; populated with the linked entity otherwise.
11443
12470
  * */
11444
- kyc_info: {
11445
- type: string;
11446
- status: string;
11447
- business_name: string | null;
11448
- first_name: string | null;
11449
- last_name: string | null;
11450
- email: string | null;
11451
- phone: string | null;
11452
- } | null;
12471
+ kyc_info: components["schemas"]["WalletKycInfo"] | null;
11453
12472
  };
11454
12473
  /** @example Wallet created successfully */
11455
12474
  message: string;
11456
12475
  };
11457
12476
  };
11458
12477
  };
11459
- /** @description Bad request — invalid name, or `kyc_entity_id` is malformed / not an entity of the current user / belongs to another tenant */
12478
+ /** @description Bad request — invalid name; `kyc_entity_id` is malformed / not an entity of the current user / belongs to another tenant; `purpose` is not a listed code; `purpose_other` is missing for `other`, longer than 255 characters or sent with another `purpose` */
11460
12479
  400: {
11461
12480
  headers: {
11462
12481
  [name: string]: unknown;
@@ -11670,7 +12689,7 @@ export interface paths {
11670
12689
  * - `owner` / `admin` / `auditor` — the full wallet (`WalletDetails`): identity, KYC, `balance`,
11671
12690
  * `fiat_accounts`, `base_currency` and the totals.
11672
12691
  * - `user` — a shell-only wallet (`WalletDetailsScopedUser`): `uuid`, `id`, `name`, `display_name`,
11673
- * `tenant_id`, `kyc_info`, `created_at` + the role fields. `logo_url`, `balance`, `fiat_accounts`,
12692
+ * `tenant_id`, `kyc_entity_id`, `kyc_info`, `created_at` + the role fields. `logo_url`, `balance`, `fiat_accounts`,
11674
12693
  * `base_currency`, `fiat_total`, `crypto_total`, `pending_balance` and `total_amount` are absent
11675
12694
  * (not null) for that role — check `access_role` before reading them.
11676
12695
  *
@@ -11788,18 +12807,15 @@ export interface paths {
11788
12807
  tenant_id: string;
11789
12808
  /** Format: date-time */
11790
12809
  created_at: string;
12810
+ /**
12811
+ * Format: uuid
12812
+ * @description KYC entity the wallet was opened for. `null` for a wallet created without one.
12813
+ */
12814
+ kyc_entity_id: string | null;
11791
12815
  /** @description KYC entity attached to the wallet (joined from `kyc_entity`).
11792
12816
  * `null` when the wallet has no KYC entity yet.
11793
12817
  * */
11794
- kyc_info: {
11795
- type: string;
11796
- status: string;
11797
- business_name: string | null;
11798
- first_name: string | null;
11799
- last_name: string | null;
11800
- email: string | null;
11801
- phone: string | null;
11802
- } | null;
12818
+ kyc_info: components["schemas"]["WalletKycInfo"] | null;
11803
12819
  };
11804
12820
  /** @example Wallet updated successfully */
11805
12821
  message: string;
@@ -13400,7 +14416,7 @@ export interface components {
13400
14416
  * @example EXCHANGE_OMNI
13401
14417
  * @enum {string}
13402
14418
  */
13403
- 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";
14419
+ 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";
13404
14420
  OrderCalculation: {
13405
14421
  /**
13406
14422
  * Format: uuid
@@ -15093,8 +16109,16 @@ export interface components {
15093
16109
  };
15094
16110
  /** @description KYC entity attached to the wallet. `null` when the wallet has no KYC entity yet. */
15095
16111
  WalletKycInfo: {
15096
- type: string;
15097
- status: string;
16112
+ /**
16113
+ * @description KYC entity type, lower-case.
16114
+ * @enum {string}
16115
+ */
16116
+ type: "individual" | "business" | "universal";
16117
+ /**
16118
+ * @description KYC verification status. A refusal is one of three values: `DECLINED`, `REJECT` or `SOFT_REJECT`. Only `APPROVED` (full access) and `HOLD` (read-only) open the wallet.
16119
+ * @enum {string}
16120
+ */
16121
+ status: "APPROVED" | "DECLINED" | "PENDING" | "PROCESSING" | "HOLD" | "NEEDS_ATTENTION" | "DOUBLE" | "SOFT_REJECT" | "REJECT" | "UNVERIFIED" | "WAITING_ON_UBOS" | "WAITING_ON_REVIEW";
15098
16122
  business_name: string | null;
15099
16123
  first_name: string | null;
15100
16124
  last_name: string | null;
@@ -15130,6 +16154,11 @@ export interface components {
15130
16154
  tenant_id: string;
15131
16155
  /** Format: date-time */
15132
16156
  created_at: string;
16157
+ /**
16158
+ * Format: uuid
16159
+ * @description KYC entity the wallet was opened for (`GET /kyc/entities`). `null` for a wallet created without one.
16160
+ */
16161
+ kyc_entity_id: string | null;
15133
16162
  kyc_info: components["schemas"]["WalletKycInfo"] | null;
15134
16163
  /** @description Aggregated crypto balances */
15135
16164
  balance: components["schemas"]["WalletBalanceEntry"][];
@@ -15171,6 +16200,11 @@ export interface components {
15171
16200
  tenant_id: string;
15172
16201
  /** Format: date-time */
15173
16202
  created_at: string;
16203
+ /**
16204
+ * Format: uuid
16205
+ * @description KYC entity the wallet was opened for (`GET /kyc/entities`). `null` for a wallet created without one.
16206
+ */
16207
+ kyc_entity_id: string | null;
15174
16208
  kyc_info: components["schemas"]["WalletKycInfo"] | null;
15175
16209
  /**
15176
16210
  * @description Always `user` on this shape. (enum property replaced by openapi-typescript)
@@ -15263,6 +16297,94 @@ export interface components {
15263
16297
  /** Format: uuid */
15264
16298
  wallet_id?: string;
15265
16299
  };
16300
+ AmlProvider: {
16301
+ /** @description Name of the on-chain analytics partner, for the "Screening by …" line */
16302
+ display_name?: string;
16303
+ };
16304
+ AmlScreeningAsset: {
16305
+ /** Format: uuid */
16306
+ currency_id?: string;
16307
+ /** @example USDT */
16308
+ symbol?: string;
16309
+ chain_id?: number;
16310
+ /** @example TRX */
16311
+ chain_symbol?: string;
16312
+ /** @example Tron */
16313
+ chain_name?: string;
16314
+ };
16315
+ AmlCheckedCategory: {
16316
+ /** @example sanctions */
16317
+ code?: string;
16318
+ /** @example Sanctions */
16319
+ title?: string;
16320
+ /** @description True when the address has exposure to this category */
16321
+ flagged?: boolean;
16322
+ };
16323
+ AmlScreeningResult: {
16324
+ /** @enum {string} */
16325
+ risk_level?: "LOW" | "ELEVATED" | "HIGH";
16326
+ risk_score?: number;
16327
+ checked_categories?: components["schemas"]["AmlCheckedCategory"][];
16328
+ checked_categories_total?: number;
16329
+ /**
16330
+ * Format: date-time
16331
+ * @description The on-chain data cut the verdict was made against
16332
+ */
16333
+ data_as_of?: string;
16334
+ };
16335
+ AmlScreening: {
16336
+ /** Format: uuid */
16337
+ id?: string;
16338
+ /**
16339
+ * @description PENDING — paid, not yet handed to the provider. SCREENING — the
16340
+ * provider is analysing it; poll `GET …/screenings/{id}`. COMPLETED —
16341
+ * `result` is set and the report can be downloaded. FAILED — no
16342
+ * result will come; the fee has been refunded to the paying balance.
16343
+ *
16344
+ * @enum {string}
16345
+ */
16346
+ status?: "PENDING" | "SCREENING" | "COMPLETED" | "FAILED";
16347
+ /**
16348
+ * @description PAYMENT_FAILED — the fee could not be taken, nothing was charged; the other two refund the fee
16349
+ * @enum {string|null}
16350
+ */
16351
+ failure_reason?: "PAYMENT_FAILED" | "PROVIDER_ERROR" | "TIMEOUT" | null;
16352
+ address?: string;
16353
+ asset?: components["schemas"]["AmlScreeningAsset"];
16354
+ provider?: components["schemas"]["AmlProvider"];
16355
+ /**
16356
+ * Format: uuid
16357
+ * @description The AML_CHECK fee order that paid for the screening
16358
+ */
16359
+ order_id?: string | null;
16360
+ result?: components["schemas"]["AmlScreeningResult"] | null;
16361
+ report_available?: boolean;
16362
+ /** Format: date-time */
16363
+ created_at?: string;
16364
+ /** Format: date-time */
16365
+ completed_at?: string | null;
16366
+ };
16367
+ AmlScreeningQuote: {
16368
+ /** @example 10 */
16369
+ price_usd?: number;
16370
+ /** Format: uuid */
16371
+ price_currency_id?: string;
16372
+ /** Format: uuid */
16373
+ pay_from_currency_id?: string;
16374
+ /** @description How many USD one unit of the paying currency is worth */
16375
+ rate?: number;
16376
+ /** @description What leaves the wallet, in the paying currency */
16377
+ total?: number;
16378
+ provider?: components["schemas"]["AmlProvider"];
16379
+ /** @description Present when `currency_id` was given — whether that token's network can be screened */
16380
+ asset?: {
16381
+ /** Format: uuid */
16382
+ currency_id?: string;
16383
+ supported?: boolean;
16384
+ /** @enum {string|null} */
16385
+ unsupported_reason?: "NOT_CRYPTO" | "UNKNOWN_CURRENCY" | "NETWORK_NOT_SUPPORTED" | null;
16386
+ } | null;
16387
+ };
15266
16388
  Invoice: {
15267
16389
  /** Format: uuid */
15268
16390
  id?: string;
@@ -15552,7 +16674,7 @@ export interface components {
15552
16674
  /** Format: uuid */
15553
16675
  id: string;
15554
16676
  /** @enum {string} */
15555
- type: "DEPOSIT_RECEIVED" | "TRANSFER_RECEIVED" | "ORDER_STATUS_CHANGED" | "KYC_STATUS_CHANGED" | "ANNOUNCEMENT" | "SYSTEM_MESSAGE" | "MASS_PAYOUT_STATUS_CHANGED" | "CARD_OTP";
16677
+ 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";
15556
16678
  /** @description Structured fact snapshot; the client renders the presentation. Shape depends on `type`; evolution is additive-only. */
15557
16679
  payload: Record<string, never>;
15558
16680
  /** Format: uuid */
@@ -15572,6 +16694,241 @@ export interface components {
15572
16694
  category: "TRANSACTIONS" | "COMPLIANCE" | "ANNOUNCEMENTS" | "SYSTEM" | "SECURITY";
15573
16695
  enabled: boolean;
15574
16696
  };
16697
+ ReferralLevelRate: {
16698
+ /** @example TRANSFER_CARD_SUBACCOUNT */
16699
+ order_type?: string;
16700
+ /** @example Top-ups */
16701
+ label?: string;
16702
+ /** @example 0.7 */
16703
+ percent?: number;
16704
+ /** @example 0 */
16705
+ fixed_usd?: number;
16706
+ };
16707
+ ReferralSummary: {
16708
+ /**
16709
+ * @description The agent's referral code. The invite link is built by the client (`t.me/<bot>?start=referrer=<code>`).
16710
+ * @example k3j9dm2p1q
16711
+ */
16712
+ code?: string;
16713
+ /** @description The current UTC month — the one `earned_usd`, `level` and `breakdown` are about. */
16714
+ period?: {
16715
+ /** @example 2026-09 */
16716
+ month?: string;
16717
+ /** Format: date-time */
16718
+ closes_at?: string;
16719
+ };
16720
+ /**
16721
+ * @description Signed sum of this month's rewards (reversals are negative).
16722
+ * @example 186
16723
+ */
16724
+ earned_usd?: number;
16725
+ /**
16726
+ * @description Earned in closed months and waiting for a payout.
16727
+ * @example 75
16728
+ */
16729
+ pending_usd?: number;
16730
+ /** @example 980 */
16731
+ paid_total_usd?: number;
16732
+ /**
16733
+ * Format: date-time
16734
+ * @description When the first payout was made.
16735
+ */
16736
+ paid_since?: string | null;
16737
+ /** @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. */
16738
+ participating?: boolean;
16739
+ level?: {
16740
+ /** @example 2 */
16741
+ no?: number;
16742
+ /** @example Bronze */
16743
+ name?: string;
16744
+ /**
16745
+ * @description This month's turnover the level is measured by.
16746
+ * @example 186000
16747
+ */
16748
+ turnover_usd?: number;
16749
+ /** @description The next level; null on the top one. */
16750
+ next?: {
16751
+ /** @example 3 */
16752
+ no?: number;
16753
+ /** @example Silver */
16754
+ name?: string;
16755
+ /** @example 300000 */
16756
+ min_turnover_usd?: number;
16757
+ /** @example 114000 */
16758
+ remaining_usd?: number;
16759
+ } | null;
16760
+ } | null;
16761
+ /** @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. */
16762
+ breakdown?: {
16763
+ /** @example CARD_ISSUING_FEE */
16764
+ order_type?: string;
16765
+ /** @example Card openings */
16766
+ label?: string;
16767
+ /** @example 6 */
16768
+ orders?: number;
16769
+ /** @example 300 */
16770
+ amount_usd?: number;
16771
+ /** @example 150 */
16772
+ reward_usd?: number;
16773
+ /** @description What the type pays on the agent's current level; null when the program no longer prices it. */
16774
+ current_rate_percent?: number | null;
16775
+ current_fixed_usd?: number | null;
16776
+ }[];
16777
+ /** @description The ladder, for the levels carousel. */
16778
+ levels?: {
16779
+ no?: number;
16780
+ name?: string;
16781
+ min_turnover_usd?: number;
16782
+ /** @description The threshold of the next level; null on the top one. */
16783
+ max_turnover_usd?: number | null;
16784
+ rates?: components["schemas"]["ReferralLevelRate"][];
16785
+ }[];
16786
+ /** @description The "Program terms" lines — what each order type pays across the levels. */
16787
+ terms?: {
16788
+ order_type?: string;
16789
+ /** @example Top-ups */
16790
+ label?: string;
16791
+ /** @example 0.5%–1.3% */
16792
+ fee_label?: string;
16793
+ counts_toward_turnover?: boolean;
16794
+ }[];
16795
+ };
16796
+ ReferralEvent: {
16797
+ /** Format: uuid */
16798
+ id?: string;
16799
+ /** @enum {string} */
16800
+ kind?: "ACCRUAL" | "REVERSAL";
16801
+ /** @enum {string} */
16802
+ status?: "PENDING" | "PAID";
16803
+ /** @example TRANSFER_CARD_SUBACCOUNT */
16804
+ order_type?: string;
16805
+ /** @example Top-ups */
16806
+ label?: string;
16807
+ /**
16808
+ * @description The referred customer, anonymised.
16809
+ * @example Customer 4821
16810
+ */
16811
+ customer_alias?: string;
16812
+ /** @example 18000 */
16813
+ amount_usd?: number;
16814
+ /** @example 0.7 */
16815
+ rate_percent?: number;
16816
+ /** @example 0 */
16817
+ fixed_usd?: number;
16818
+ /**
16819
+ * @description Negative on a REVERSAL.
16820
+ * @example 126
16821
+ */
16822
+ reward_usd?: number;
16823
+ /** @example 2 */
16824
+ level_no?: number;
16825
+ /** @example Bronze */
16826
+ level_name?: string;
16827
+ /** Format: date-time */
16828
+ occurred_at?: string;
16829
+ };
16830
+ ReferralPayout: {
16831
+ /** @example 2026-08 */
16832
+ period?: string;
16833
+ /** @enum {string} */
16834
+ status?: "PROCESSING" | "PAID";
16835
+ /** @example 980 */
16836
+ amount_usd?: number;
16837
+ /** Format: date-time */
16838
+ created_at?: string;
16839
+ /** Format: date-time */
16840
+ paid_at?: string | null;
16841
+ };
16842
+ ReferralTelegramReportSetting: {
16843
+ /** @description The user has started the tenant's Telegram bot. */
16844
+ linked?: boolean;
16845
+ /** @description The report is sent to Telegram every month. Always false while not linked. */
16846
+ enabled?: boolean;
16847
+ };
16848
+ RfiCase: {
16849
+ /** Format: uuid */
16850
+ id?: string;
16851
+ /**
16852
+ * @description Human-facing id — quoted in the notification email
16853
+ * @example RFI-000042
16854
+ */
16855
+ reference?: string;
16856
+ /** @enum {string} */
16857
+ type?: "onboarding" | "transaction" | "ongoing";
16858
+ /**
16859
+ * @description `action_required` — compliance asked and waits for the client; `awaiting_compliance` — the client answered, compliance is reviewing; `closed` — no longer accepts replies.
16860
+ * @enum {string}
16861
+ */
16862
+ status?: "action_required" | "awaiting_compliance" | "closed";
16863
+ /**
16864
+ * Format: date-time
16865
+ * @description When the answer is due
16866
+ */
16867
+ due_at?: string | null;
16868
+ /** @description True only while `action_required` and past `due_at` (red banner) */
16869
+ overdue?: boolean;
16870
+ /** @description One of the covered transactions is held until the request closes */
16871
+ holds_transaction?: boolean;
16872
+ /** @description The account is on hold while the request is open */
16873
+ holds_account?: boolean;
16874
+ /** @description How many transactions the request covers */
16875
+ transactions_count?: number;
16876
+ /** @description The last message of the conversation, for the card — null while nothing is visible yet */
16877
+ last_message?: {
16878
+ /** @enum {string} */
16879
+ author?: "compliance" | "client";
16880
+ /** @description One line of the message, up to 140 characters, cut at a word */
16881
+ preview?: string | null;
16882
+ /** Format: date-time */
16883
+ created_at?: string;
16884
+ } | null;
16885
+ /** Format: date-time */
16886
+ created_at?: string;
16887
+ /** Format: date-time */
16888
+ updated_at?: string;
16889
+ /** Format: date-time */
16890
+ closed_at?: string | null;
16891
+ };
16892
+ RfiAttachment: {
16893
+ /** Format: uuid */
16894
+ id?: string;
16895
+ file_name?: string;
16896
+ content_type?: string | null;
16897
+ size_bytes?: number | null;
16898
+ /** Format: date-time */
16899
+ created_at?: string;
16900
+ };
16901
+ RfiMessage: {
16902
+ /** Format: uuid */
16903
+ id?: string;
16904
+ /** @enum {string} */
16905
+ author?: "compliance" | "client";
16906
+ /**
16907
+ * @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.
16908
+ * @example Polina S
16909
+ */
16910
+ author_name?: string | null;
16911
+ body?: string;
16912
+ attachments?: components["schemas"]["RfiAttachment"][];
16913
+ /** Format: date-time */
16914
+ created_at?: string;
16915
+ };
16916
+ RfiTransaction: {
16917
+ order_uuid?: string;
16918
+ order_type?: string | null;
16919
+ status?: string | null;
16920
+ amount_from?: number | null;
16921
+ amount_to?: number | null;
16922
+ /** Format: date-time */
16923
+ created_at?: string | null;
16924
+ };
16925
+ RfiCaseDetail: components["schemas"]["RfiCase"] & {
16926
+ can_reply?: boolean;
16927
+ /** @description The conversation, oldest first */
16928
+ messages?: components["schemas"]["RfiMessage"][];
16929
+ /** @description Every transaction the request covers, in the order compliance linked them */
16930
+ transactions?: components["schemas"]["RfiTransaction"][];
16931
+ };
15575
16932
  };
15576
16933
  responses: {
15577
16934
  /** @description Authentication credentials are missing or invalid */
@@ -15629,6 +16986,9 @@ export interface components {
15629
16986
  * @example e04c0c85-b031-47d7-8541-207b4e83d91a
15630
16987
  */
15631
16988
  TenantId: string;
16989
+ /** @description Wallet the screening belongs to (and is paid from) */
16990
+ AmlWalletId: string;
16991
+ AmlScreeningId: string;
15632
16992
  /** @description Wallet the invoices belong to */
15633
16993
  InvoiceWalletId: string;
15634
16994
  InvoiceId: string;
@@ -15638,6 +16998,9 @@ export interface components {
15638
16998
  MassPayoutWalletId: string;
15639
16999
  MassPayoutId: string;
15640
17000
  MassPayoutTemplateId: string;
17001
+ /** @description The account the requests are about. Requests and their conversations are kept per account. */
17002
+ RfiWalletId: string;
17003
+ RfiCaseId: string;
15641
17004
  };
15642
17005
  requestBodies: never;
15643
17006
  headers: never;