squarefi-bff-api-module 1.36.87 → 1.36.89

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.
@@ -571,7 +571,116 @@ export interface paths {
571
571
  };
572
572
  };
573
573
  put?: never;
574
- post?: never;
574
+ /**
575
+ * Create destination
576
+ * @description counterparty_account_id is required in the body.
577
+ *
578
+ * **Banking types** (ACH, SWIFT, SEPA, CHAPS, FPS, FEDWIRE):
579
+ * banking_data: { account_number, routing_number, bank_name, swift_bic, iban, sort_code, note, address }
580
+ *
581
+ * **Crypto types** (CRYPTO_EXTERNAL, CRYPTO_INTERNAL):
582
+ * crypto_data: { address, currency_id, memo }
583
+ *
584
+ * **Internal type** (INTERNAL):
585
+ * internal_data: { wallet_id, description? } — receiver wallet on the same platform
586
+ *
587
+ */
588
+ post: {
589
+ parameters: {
590
+ query?: never;
591
+ header?: never;
592
+ path?: never;
593
+ cookie?: never;
594
+ };
595
+ requestBody: {
596
+ content: {
597
+ "application/json": {
598
+ /** Format: uuid */
599
+ counterparty_account_id: string;
600
+ /** @enum {string} */
601
+ type: "ACH" | "SWIFT" | "SEPA" | "CRYPTO_EXTERNAL" | "CRYPTO_INTERNAL" | "CHAPS" | "FPS" | "FEDWIRE" | "INTERNAL";
602
+ nickname?: string;
603
+ banking_data?: {
604
+ account_number?: string;
605
+ routing_number?: string;
606
+ bank_name?: string;
607
+ swift_bic?: string;
608
+ iban?: string;
609
+ /** @description Sort code (6 digits, UK banking) */
610
+ sort_code?: string;
611
+ note?: string;
612
+ address?: {
613
+ country_id?: number;
614
+ city?: string;
615
+ postcode?: string;
616
+ street1?: string;
617
+ street2?: string;
618
+ /** @description Required when the selected country has states; countries without states may omit it */
619
+ state_id?: number | null;
620
+ };
621
+ };
622
+ crypto_data?: {
623
+ address?: string;
624
+ /** Format: uuid */
625
+ currency_id?: string;
626
+ memo?: string;
627
+ /**
628
+ * @description Hosting classification of the address
629
+ * @default unknown
630
+ * @enum {string}
631
+ */
632
+ wallet_custody_type?: "custodial" | "selfhosted" | "unknown";
633
+ };
634
+ /** @description Required for type INTERNAL — points at the receiver wallet on the same platform. An account holds one INTERNAL destination per wallet; if it already has an active one to this wallet, that destination is returned instead of a new one. */
635
+ internal_data?: {
636
+ /**
637
+ * Format: uuid
638
+ * @description Target (receiver) wallet uuid on the same platform.
639
+ */
640
+ wallet_id: string;
641
+ /** @description Optional, reserved for future use. */
642
+ description?: string;
643
+ };
644
+ };
645
+ };
646
+ };
647
+ responses: {
648
+ /** @description Counterparty destination created */
649
+ 201: {
650
+ headers: {
651
+ [name: string]: unknown;
652
+ };
653
+ content: {
654
+ "application/json": {
655
+ /** @example true */
656
+ success?: boolean;
657
+ data?: {
658
+ destination?: components["schemas"]["CounterpartyDestination"];
659
+ /** @example Counterparty destination created successfully */
660
+ message?: string;
661
+ };
662
+ };
663
+ };
664
+ };
665
+ /** @description Validation error. Bank-details problems come as `VALIDATION_ERROR` with every problem in `error.details.issues` (`field`, `code`, `message`, optional `country` / `detected`).
666
+ *
667
+ * **Until 2026-10-12 00:00 UTC** the stricter bank-details rules (per-country IBAN checks, SEPA-zone IBAN, BIC details, ABA check digit, account formats) are reported by `POST /admin/counterparty/destinations/validate` but do not refuse this request; from then on they do.
668
+ * */
669
+ 400: {
670
+ headers: {
671
+ [name: string]: unknown;
672
+ };
673
+ content?: never;
674
+ };
675
+ /** @description Account not found */
676
+ 404: {
677
+ headers: {
678
+ [name: string]: unknown;
679
+ };
680
+ content?: never;
681
+ };
682
+ };
683
+ };
575
684
  delete?: never;
576
685
  options?: never;
577
686
  head?: never;
@@ -706,6 +815,76 @@ export interface paths {
706
815
  };
707
816
  trace?: never;
708
817
  };
818
+ "/admin/counterparty/destinations/validate": {
819
+ parameters: {
820
+ query?: never;
821
+ header?: never;
822
+ path?: never;
823
+ cookie?: never;
824
+ };
825
+ get?: never;
826
+ put?: never;
827
+ /**
828
+ * Validate destination details without saving
829
+ * @description Dry run of `POST /admin/counterparty/destinations`: the same body and the same checks — bank details per
830
+ * payment method, address completeness, location reference data, bank-country consistency — with nothing
831
+ * saved and no counterparty account needed. Answers `200` whether or not the details are valid;
832
+ * `valid: false` comes with every problem in `issues`.
833
+ *
834
+ * It always applies the strict bank-details rules, including before they start refusing creation on this
835
+ * surface (2026-10-12 00:00 UTC) — use it to find out what your integration sends that will be refused.
836
+ * Without an account it cannot tell whether an INTERNAL target wallet is active — creation still checks
837
+ * that. Rate limited to 60 requests per minute per tenant API key.
838
+ *
839
+ */
840
+ post: {
841
+ parameters: {
842
+ query?: never;
843
+ header?: never;
844
+ path?: never;
845
+ cookie?: never;
846
+ };
847
+ requestBody: {
848
+ content: {
849
+ "application/json": {
850
+ /** @enum {string} */
851
+ type: "ACH" | "RTP" | "SWIFT" | "SEPA" | "CRYPTO_EXTERNAL" | "CRYPTO_INTERNAL" | "CHAPS" | "FPS" | "FEDWIRE" | "INTERNAL";
852
+ /** @description Same shape as in `POST /admin/counterparty/destinations`. */
853
+ banking_data?: Record<string, never>;
854
+ crypto_data?: Record<string, never>;
855
+ internal_data?: Record<string, never>;
856
+ };
857
+ };
858
+ };
859
+ responses: {
860
+ /** @description Validation result */
861
+ 200: {
862
+ headers: {
863
+ [name: string]: unknown;
864
+ };
865
+ content: {
866
+ "application/json": {
867
+ /** @example true */
868
+ success?: boolean;
869
+ data?: components["schemas"]["DestinationValidationResult"];
870
+ };
871
+ };
872
+ };
873
+ /** @description Too many validation requests */
874
+ 429: {
875
+ headers: {
876
+ [name: string]: unknown;
877
+ };
878
+ content?: never;
879
+ };
880
+ };
881
+ };
882
+ delete?: never;
883
+ options?: never;
884
+ head?: never;
885
+ patch?: never;
886
+ trace?: never;
887
+ };
709
888
  "/admin/crypto_addresses/{wallet_id}": {
710
889
  parameters: {
711
890
  query?: never;
@@ -860,6 +1039,201 @@ export interface paths {
860
1039
  patch?: never;
861
1040
  trace?: never;
862
1041
  };
1042
+ "/admin/crypto_wallets/{wallet_id}": {
1043
+ parameters: {
1044
+ query?: never;
1045
+ header?: never;
1046
+ path?: never;
1047
+ cookie?: never;
1048
+ };
1049
+ /** List crypto wallets */
1050
+ get: {
1051
+ parameters: {
1052
+ query?: {
1053
+ /** @description Filter by exact external_id */
1054
+ external_id?: string;
1055
+ /** @description Search by name (case-insensitive, partial match) */
1056
+ name?: string;
1057
+ /** @description Filter by status (default active) */
1058
+ status?: "active" | "inactive";
1059
+ /** @description Filter wallets created after this date (ISO 8601) */
1060
+ created_after?: string;
1061
+ /** @description Filter wallets created before this date (ISO 8601) */
1062
+ created_before?: string;
1063
+ offset?: number;
1064
+ limit?: number;
1065
+ };
1066
+ header?: never;
1067
+ path: {
1068
+ wallet_id: string;
1069
+ };
1070
+ cookie?: never;
1071
+ };
1072
+ requestBody?: never;
1073
+ responses: {
1074
+ /** @description Crypto wallets listed */
1075
+ 200: {
1076
+ headers: {
1077
+ [name: string]: unknown;
1078
+ };
1079
+ content: {
1080
+ "application/json": {
1081
+ success?: boolean;
1082
+ data?: components["schemas"]["CryptoWalletListItem"][];
1083
+ pagination?: components["schemas"]["PaginationResponse"];
1084
+ };
1085
+ };
1086
+ };
1087
+ /** @description Wallet does not belong to tenant, or its KYC status does not allow the operation (`KYC_REQUIREMENTS_NOT_MET`) */
1088
+ 403: {
1089
+ headers: {
1090
+ [name: string]: unknown;
1091
+ };
1092
+ content: {
1093
+ "application/json": components["schemas"]["ErrorResponse"];
1094
+ };
1095
+ };
1096
+ /** @description Internal server error */
1097
+ 500: {
1098
+ headers: {
1099
+ [name: string]: unknown;
1100
+ };
1101
+ content: {
1102
+ "application/json": components["schemas"]["ErrorResponse"];
1103
+ };
1104
+ };
1105
+ };
1106
+ };
1107
+ put?: never;
1108
+ /** Create crypto wallet */
1109
+ post: {
1110
+ parameters: {
1111
+ query?: never;
1112
+ header?: never;
1113
+ path: {
1114
+ wallet_id: string;
1115
+ };
1116
+ cookie?: never;
1117
+ };
1118
+ requestBody: {
1119
+ content: {
1120
+ "application/json": {
1121
+ name: string;
1122
+ external_id?: string;
1123
+ /** @description Chain IDs to create addresses on. Omit or leave empty to create a wallet without addresses; the first address added later creates the custody-provider wallet. */
1124
+ chains?: number[];
1125
+ };
1126
+ };
1127
+ };
1128
+ responses: {
1129
+ /** @description Crypto wallet created */
1130
+ 201: {
1131
+ headers: {
1132
+ [name: string]: unknown;
1133
+ };
1134
+ content: {
1135
+ "application/json": {
1136
+ success?: boolean;
1137
+ data?: components["schemas"]["CryptoWallet"];
1138
+ message?: string;
1139
+ };
1140
+ };
1141
+ };
1142
+ /** @description Invalid request (missing name, invalid chains) */
1143
+ 400: {
1144
+ headers: {
1145
+ [name: string]: unknown;
1146
+ };
1147
+ content: {
1148
+ "application/json": components["schemas"]["ErrorResponse"];
1149
+ };
1150
+ };
1151
+ /** @description Wallet does not belong to tenant, or its KYC status does not allow the operation (`KYC_REQUIREMENTS_NOT_MET`) */
1152
+ 403: {
1153
+ headers: {
1154
+ [name: string]: unknown;
1155
+ };
1156
+ content: {
1157
+ "application/json": components["schemas"]["ErrorResponse"];
1158
+ };
1159
+ };
1160
+ /** @description external_id already exists for this tenant */
1161
+ 409: {
1162
+ headers: {
1163
+ [name: string]: unknown;
1164
+ };
1165
+ content: {
1166
+ "application/json": components["schemas"]["ErrorResponse"];
1167
+ };
1168
+ };
1169
+ };
1170
+ };
1171
+ delete?: never;
1172
+ options?: never;
1173
+ head?: never;
1174
+ patch?: never;
1175
+ trace?: never;
1176
+ };
1177
+ "/admin/crypto_wallets/{wallet_id}/addresses": {
1178
+ parameters: {
1179
+ query?: never;
1180
+ header?: never;
1181
+ path?: never;
1182
+ cookie?: never;
1183
+ };
1184
+ /** List crypto wallet addresses */
1185
+ get: {
1186
+ parameters: {
1187
+ query?: {
1188
+ /** @description Filter by chain ID */
1189
+ chain?: number;
1190
+ /** @description Filter by specific crypto wallet */
1191
+ crypto_wallet_id?: string;
1192
+ /** @description Search by address (case-insensitive, partial match) */
1193
+ address?: string;
1194
+ offset?: number;
1195
+ limit?: number;
1196
+ };
1197
+ header?: never;
1198
+ path: {
1199
+ wallet_id: string;
1200
+ };
1201
+ cookie?: never;
1202
+ };
1203
+ requestBody?: never;
1204
+ responses: {
1205
+ /** @description Addresses listed */
1206
+ 200: {
1207
+ headers: {
1208
+ [name: string]: unknown;
1209
+ };
1210
+ content: {
1211
+ "application/json": {
1212
+ success?: boolean;
1213
+ data?: components["schemas"]["CryptoWalletAddressListItem"][];
1214
+ pagination?: components["schemas"]["PaginationResponse"];
1215
+ };
1216
+ };
1217
+ };
1218
+ /** @description Wallet does not belong to tenant, or its KYC status does not allow the operation (`KYC_REQUIREMENTS_NOT_MET`) */
1219
+ 403: {
1220
+ headers: {
1221
+ [name: string]: unknown;
1222
+ };
1223
+ content: {
1224
+ "application/json": components["schemas"]["ErrorResponse"];
1225
+ };
1226
+ };
1227
+ };
1228
+ };
1229
+ put?: never;
1230
+ post?: never;
1231
+ delete?: never;
1232
+ options?: never;
1233
+ head?: never;
1234
+ patch?: never;
1235
+ trace?: never;
1236
+ };
863
1237
  "/admin/crypto_wallets/{wallet_id}/{crypto_wallet_id}": {
864
1238
  parameters: {
865
1239
  query?: never;
@@ -914,7 +1288,57 @@ export interface paths {
914
1288
  };
915
1289
  put?: never;
916
1290
  post?: never;
917
- delete?: never;
1291
+ /**
1292
+ * Delete crypto wallet
1293
+ * @description Soft-deletes a crypto wallet and archives it with the custody provider.
1294
+ * The wallet is marked as deleted and all addresses are deactivated.
1295
+ *
1296
+ */
1297
+ delete: {
1298
+ parameters: {
1299
+ query?: never;
1300
+ header?: never;
1301
+ path: {
1302
+ wallet_id: string;
1303
+ crypto_wallet_id: string;
1304
+ };
1305
+ cookie?: never;
1306
+ };
1307
+ requestBody?: never;
1308
+ responses: {
1309
+ /** @description Crypto wallet soft-deleted */
1310
+ 200: {
1311
+ headers: {
1312
+ [name: string]: unknown;
1313
+ };
1314
+ content: {
1315
+ "application/json": {
1316
+ success?: boolean;
1317
+ data?: components["schemas"]["CryptoWalletDeleteResponse"];
1318
+ message?: string;
1319
+ };
1320
+ };
1321
+ };
1322
+ /** @description Wallet does not belong to tenant, or its KYC status does not allow the operation (`KYC_REQUIREMENTS_NOT_MET`) */
1323
+ 403: {
1324
+ headers: {
1325
+ [name: string]: unknown;
1326
+ };
1327
+ content: {
1328
+ "application/json": components["schemas"]["ErrorResponse"];
1329
+ };
1330
+ };
1331
+ /** @description Crypto wallet not found */
1332
+ 404: {
1333
+ headers: {
1334
+ [name: string]: unknown;
1335
+ };
1336
+ content: {
1337
+ "application/json": components["schemas"]["ErrorResponse"];
1338
+ };
1339
+ };
1340
+ };
1341
+ };
918
1342
  options?: never;
919
1343
  head?: never;
920
1344
  patch?: never;
@@ -1164,46 +1588,11 @@ export interface paths {
1164
1588
  gov_id_country?: string;
1165
1589
  gov_id_type?: string;
1166
1590
  gov_id_number?: string;
1167
- /** @description URL to selfie image */
1168
- selfie_url?: string;
1169
- /** @description URL to government ID front image */
1170
- gov_id_front_url?: string;
1171
- /** @description URL to government ID back image */
1172
- gov_id_back_url?: string;
1173
- /** @description URL to hand-held government ID image */
1174
- gov_id_hand_hold_url?: string;
1175
- /** @description URL to proof of address document */
1176
- proof_of_address_url?: string;
1177
1591
  /** @description Type of proof of address document */
1178
1592
  proof_of_address_type?: string;
1179
- /** @description URL to formation document (business) */
1180
- formation_doc_url?: string;
1181
- /** @description URL to proof of ownership (business) */
1182
- proof_of_ownership_url?: string;
1183
1593
  certificate_of_registration_doc_type?: string;
1184
- /** @description URL to certificate of registration (business) */
1185
- certificate_of_registration_doc_url?: string;
1186
1594
  certificate_number?: string;
1187
- /** @description URL to business registration document */
1188
- business_registration_doc_url?: string;
1189
- /** @description URL to share structure document (business) */
1190
- share_structure_url?: string;
1191
- /** @description URL to constitution or annual report (business) */
1192
- constitution_or_annual_report_url?: string;
1193
- /** @description URL to articles of association (business) */
1194
- articles_of_association_url?: string;
1195
- /** @description URL to UBO declaration (business) */
1196
- ubo_declaration_url?: string;
1197
- /** @description URL to partnership minutes of meeting (business) */
1198
- partnership_mins_of_meeting_url?: string;
1199
- /** @description URL to partnership deed (business) */
1200
- partnership_deed_url?: string;
1201
- /** @description URL to certificate of incumbency (business) */
1202
- certificate_of_incumbency_url?: string;
1203
- /** @description URL to regulatory license (business) */
1204
- regulatory_license_url?: string;
1205
- /** @description URL to supplementary document */
1206
- supplementary_url?: string;
1595
+ documents?: components["schemas"]["KycDocumentsInput"];
1207
1596
  };
1208
1597
  };
1209
1598
  };
@@ -1371,27 +1760,10 @@ export interface paths {
1371
1760
  gov_id_country?: string;
1372
1761
  gov_id_type?: string;
1373
1762
  gov_id_number?: string;
1374
- selfie_url?: string;
1375
- gov_id_front_url?: string;
1376
- gov_id_back_url?: string;
1377
- gov_id_hand_hold_url?: string;
1378
- proof_of_address_url?: string;
1379
1763
  proof_of_address_type?: string;
1380
- formation_doc_url?: string;
1381
- proof_of_ownership_url?: string;
1382
1764
  certificate_of_registration_doc_type?: string;
1383
- certificate_of_registration_doc_url?: string;
1384
1765
  certificate_number?: string;
1385
- business_registration_doc_url?: string;
1386
- share_structure_url?: string;
1387
- constitution_or_annual_report_url?: string;
1388
- articles_of_association_url?: string;
1389
- ubo_declaration_url?: string;
1390
- partnership_mins_of_meeting_url?: string;
1391
- partnership_deed_url?: string;
1392
- certificate_of_incumbency_url?: string;
1393
- regulatory_license_url?: string;
1394
- supplementary_url?: string;
1766
+ documents?: components["schemas"]["KycDocumentsInput"];
1395
1767
  };
1396
1768
  };
1397
1769
  };
@@ -1427,6 +1799,82 @@ export interface paths {
1427
1799
  };
1428
1800
  trace?: never;
1429
1801
  };
1802
+ "/admin/kyc_entity/{entity_id}/documents/{document_id}": {
1803
+ parameters: {
1804
+ query?: never;
1805
+ header?: never;
1806
+ path?: never;
1807
+ cookie?: never;
1808
+ };
1809
+ get?: never;
1810
+ put?: never;
1811
+ post?: never;
1812
+ /**
1813
+ * Remove a KYC document
1814
+ * @description Removes one document of the KYC entity — or of one of its beneficial owners — by the `id`
1815
+ * it carries in `documents[]`. Allowed while the entity is in `UNVERIFIED` or `SOFT_REJECT`,
1816
+ * the same window as `PATCH`. Documents are added through `documents[]` of `POST` / `PATCH`.
1817
+ *
1818
+ */
1819
+ delete: {
1820
+ parameters: {
1821
+ query?: never;
1822
+ header?: never;
1823
+ path: {
1824
+ entity_id: string;
1825
+ /** @description The document `id` from `documents[]` */
1826
+ document_id: string;
1827
+ };
1828
+ cookie?: never;
1829
+ };
1830
+ requestBody?: never;
1831
+ responses: {
1832
+ /** @description Document removed */
1833
+ 200: {
1834
+ headers: {
1835
+ [name: string]: unknown;
1836
+ };
1837
+ content: {
1838
+ "application/json": {
1839
+ /** @example true */
1840
+ success?: boolean;
1841
+ data?: {
1842
+ /** Format: uuid */
1843
+ id?: string;
1844
+ /** @example formation_doc */
1845
+ type?: string;
1846
+ };
1847
+ };
1848
+ };
1849
+ };
1850
+ /** @description Entity not editable in its current status, or malformed id */
1851
+ 400: {
1852
+ headers: {
1853
+ [name: string]: unknown;
1854
+ };
1855
+ content?: never;
1856
+ };
1857
+ /** @description Entity does not belong to this tenant */
1858
+ 403: {
1859
+ headers: {
1860
+ [name: string]: unknown;
1861
+ };
1862
+ content?: never;
1863
+ };
1864
+ /** @description Entity or document not found */
1865
+ 404: {
1866
+ headers: {
1867
+ [name: string]: unknown;
1868
+ };
1869
+ content?: never;
1870
+ };
1871
+ };
1872
+ };
1873
+ options?: never;
1874
+ head?: never;
1875
+ patch?: never;
1876
+ trace?: never;
1877
+ };
1430
1878
  "/admin/kyc_entity/{entity_id}/submit": {
1431
1879
  parameters: {
1432
1880
  query?: never;
@@ -2250,7 +2698,7 @@ export interface paths {
2250
2698
  note?: string;
2251
2699
  /**
2252
2700
  * Format: date-time
2253
- * @description Optional. Schedule the transfer for a future time (min 1 hour, max 90 days ahead). No funds are reserved; after approval the order waits in EXPECTED status and executes automatically.
2701
+ * @description Optional. Schedule the transfer for a future time (min 1 hour, max 90 days ahead). No funds are reserved; after approval the order waits in EXPECTED status and executes automatically, once. If the balance does not cover it then, it fails with `scheduled_failure.code` INSUFFICIENT_FUNDS and is not retried. Approve at least 1 hour before scheduled_at.
2254
2702
  */
2255
2703
  scheduled_at?: string;
2256
2704
  documents?: Record<string, never>[];
@@ -2920,7 +3368,9 @@ export interface paths {
2920
3368
  * text operator, e.g. `[{"meta->>workflow_status":"PROCESSING"}]` or, to find an order by
2921
3369
  * your own reference, `[{"meta->>reference":"invoice-2026-04-001"}]`. Besides order columns
2922
3370
  * it accepts `mass_payout_id` (uuid), which narrows the result to the orders of one mass
2923
- * payout batch. Malformed JSON or a non-array value is rejected with 400.
3371
+ * payout batch, and `scheduled` — scheduled payments only: `all`, `upcoming` (approved and
3372
+ * waiting, `EXPECTED`) or `past` (any status but `NEW` and `EXPECTED`); it combines with
3373
+ * `status`. Malformed JSON or a non-array value is rejected with 400.
2924
3374
  *
2925
3375
  * @example [{"status":"COMPLETE"}]
2926
3376
  */
@@ -2954,7 +3404,7 @@ export interface paths {
2954
3404
  };
2955
3405
  };
2956
3406
  };
2957
- /** @description Invalid `filters` (not a JSON array) or non-uuid `mass_payout_id` */
3407
+ /** @description Invalid `filters` (not a JSON array), non-uuid `mass_payout_id`, or `scheduled` other than `all` / `upcoming` / `past` */
2958
3408
  400: {
2959
3409
  headers: {
2960
3410
  [name: string]: unknown;
@@ -3123,6 +3573,9 @@ export interface paths {
3123
3573
  * status NEW can be approved. Orders
3124
3574
  * created with `scheduled_at` move to EXPECTED instead — no funds are
3125
3575
  * debited until execution at the requested time.
3576
+ * A scheduled order is approved only while its `scheduled_at` is at least
3577
+ * one hour away; a later approve answers 400 `SCHEDULED_AT_TOO_SOON`
3578
+ * (create the payment again with a new date).
3126
3579
  *
3127
3580
  */
3128
3581
  post: {
@@ -3150,7 +3603,7 @@ export interface paths {
3150
3603
  };
3151
3604
  };
3152
3605
  };
3153
- /** @description Insufficient funds (`INSUFFICIENT_FUNDS` — the order is released back to NEW) or validation error */
3606
+ /** @description Insufficient funds (`INSUFFICIENT_FUNDS` — the order is released back to NEW), a scheduled order less than an hour before its `scheduled_at` (`SCHEDULED_AT_TOO_SOON`), or validation error */
3154
3607
  400: {
3155
3608
  headers: {
3156
3609
  [name: string]: unknown;
@@ -3583,7 +4036,10 @@ export interface paths {
3583
4036
  card_limit?: number | null;
3584
4037
  form_factor?: string | null;
3585
4038
  type?: string | null;
4039
+ /** @description At least one mobile wallet is supported; which ones — `digital_wallets` */
3586
4040
  tokenizable?: boolean | null;
4041
+ /** @description Mobile wallets cards of this program can be added to; empty when none. A program can support one without the other */
4042
+ digital_wallets?: ("APPLE_PAY" | "GOOGLE_PAY")[];
3587
4043
  order_types?: string[] | null;
3588
4044
  kyc_rails?: {
3589
4045
  /** Format: uuid */
@@ -5205,13 +5661,14 @@ export interface paths {
5205
5661
  /**
5206
5662
  * Get wallet balance
5207
5663
  * @description Returns raw balance records with crypto metadata.
5208
- * Dust balances below `render_threshold` are hidden unless `show_low_balance=true`.
5664
+ * Dust balances — smaller than the currency threshold in absolute value — are hidden unless `show_low_balance=true`;
5665
+ * a negative balance (a debt) beyond the threshold is always returned.
5209
5666
  *
5210
5667
  */
5211
5668
  get: {
5212
5669
  parameters: {
5213
5670
  query?: {
5214
- /** @description When false (default), dust balances below threshold are hidden */
5671
+ /** @description When false (default), dust balances — smaller than the currency threshold in absolute value — are hidden */
5215
5672
  show_low_balance?: boolean;
5216
5673
  };
5217
5674
  header?: never;
@@ -5231,7 +5688,7 @@ export interface paths {
5231
5688
  "application/json": {
5232
5689
  /** @example true */
5233
5690
  success?: boolean;
5234
- /** @description Filtered by render_threshold unless show_low_balance=true; icon may be stripped from crypto.meta */
5691
+ /** @description Dust balances are left out unless show_low_balance=true; icon may be stripped from crypto.meta */
5235
5692
  data?: {
5236
5693
  /** Format: uuid */
5237
5694
  crypto_id?: string;
@@ -7011,6 +7468,12 @@ export interface paths {
7011
7468
  * @description Returns all active issuing programs available for the tenant.
7012
7469
  * Programs are enriched with group-level pricing and limits.
7013
7470
  *
7471
+ * Each program also publishes what a cardholder on it must carry
7472
+ * (`cardholder_requirements`): the KYC level, the required fields and
7473
+ * documents, and what each country changes. Read it before building the
7474
+ * cardholder form instead of hardcoding one — it can differ between
7475
+ * programs, and a sandbox program may ask for less than the production one.
7476
+ *
7014
7477
  */
7015
7478
  get: {
7016
7479
  parameters: {
@@ -7039,8 +7502,13 @@ export interface paths {
7039
7502
  /** @enum {string} */
7040
7503
  form_factor?: "virtual" | "physical" | "both";
7041
7504
  brand?: string;
7505
+ /** @description At least one mobile wallet is supported; which ones — `digital_wallets` */
7506
+ tokenizable?: boolean;
7507
+ /** @description Mobile wallets cards of this program can be added to; empty when none. A program can support one without the other */
7508
+ digital_wallets?: ("APPLE_PAY" | "GOOGLE_PAY")[];
7042
7509
  issuing_price_usd?: number;
7043
7510
  initial_topup_usd?: number;
7511
+ cardholder_requirements?: components["schemas"]["CardholderRequirements"];
7044
7512
  }[];
7045
7513
  };
7046
7514
  };
@@ -7488,6 +7956,59 @@ export interface paths {
7488
7956
  export type webhooks = Record<string, never>;
7489
7957
  export interface components {
7490
7958
  schemas: {
7959
+ /** @description What a cardholder on this program must carry. Set per program in the vendor config, so it can change without a release — read it instead of hardcoding the form. */
7960
+ CardholderRequirements: {
7961
+ /**
7962
+ * @description Cumulative KYC level; each level includes the previous one
7963
+ * @enum {string}
7964
+ */
7965
+ level?: "minimal" | "basic" | "declared" | "full";
7966
+ /**
7967
+ * @description Required field names; address fields are dotted (address.line1). Some CONSUMER programs also list gov_id_issuance_date and gov_id_expiration_date (ISO YYYY-MM-DD).
7968
+ * @example [
7969
+ * "first_name",
7970
+ * "last_name",
7971
+ * "email",
7972
+ * "phone",
7973
+ * "birth_date",
7974
+ * "nationality"
7975
+ * ]
7976
+ */
7977
+ required?: string[];
7978
+ /** @description Documents that must be attached; empty below the full level */
7979
+ required_documents?: ("gov_id_front" | "gov_id_back" | "selfie")[];
7980
+ /** @description Human-readable constraints the field list cannot express — e.g. a CONSUMER program requiring tax_identification_number to be a valid SSN when nationality is USA. */
7981
+ notes?: string[];
7982
+ /** @description What each country changes, keyed by ISO 3166-1 alpha-3 with a `default` entry; empty when the vendor reviews nothing. These fields stay out of `required` because they only hold once the nationality or address country is known: read the rule for the nationality the user picked (required_by_nationality), the rule for the address country (required_by_address), and the rule for the country that issued the document (gov_id_types). */
7983
+ country_rules?: {
7984
+ [key: string]: {
7985
+ /**
7986
+ * @description gov_id_type values accepted for a document issued by this country
7987
+ * @example [
7988
+ * "passport",
7989
+ * "driving_license",
7990
+ * "id_card"
7991
+ * ]
7992
+ */
7993
+ gov_id_types?: string[];
7994
+ /**
7995
+ * @description Extra fields a person of this nationality must provide
7996
+ * @example [
7997
+ * "tax_identification_number"
7998
+ * ]
7999
+ */
8000
+ required_by_nationality?: string[];
8001
+ /**
8002
+ * @description Extra fields an address in this country must carry
8003
+ * @example [
8004
+ * "address.state"
8005
+ * ]
8006
+ */
8007
+ required_by_address?: string[];
8008
+ notes?: string[];
8009
+ };
8010
+ };
8011
+ };
7491
8012
  ErrorResponse: {
7492
8013
  /** @example false */
7493
8014
  success?: boolean;
@@ -7575,8 +8096,10 @@ export interface components {
7575
8096
  * @enum {string}
7576
8097
  */
7577
8098
  brand?: "VISA" | "MASTERCARD";
7578
- /** @description Whether card can be tokenized */
8099
+ /** @description Whether this card can be added to a mobile wallet; set when the card was issued. Which ones: `digital_wallets`. */
7579
8100
  tokenizable?: boolean;
8101
+ /** @description Mobile wallets this card can be added to: the wallets of the card's program, or none when the card's `tokenizable` is false. Left out when the program could not be read. */
8102
+ digital_wallets?: ("APPLE_PAY" | "GOOGLE_PAY")[];
7580
8103
  /** @description Total spending cap/limit */
7581
8104
  spend_cap?: number;
7582
8105
  /** @description Total amount spent */
@@ -8256,6 +8779,35 @@ export interface components {
8256
8779
  crypto_data?: components["schemas"]["CryptoData"];
8257
8780
  internal_data?: components["schemas"]["CounterpartyInternalData"];
8258
8781
  counterparty_account?: components["schemas"]["CounterpartyAccountRef"];
8782
+ /** @description Banking destinations only: problems that make the stored bank details unpayable (an IBAN that fails its checks, an IBAN outside SEPA on a SEPA destination, a routing number that fails the ABA check). Non-empty means withdrawals to this destination are refused with `DESTINATION_INVALID` — details cannot be edited, so add a new destination. Empty for valid banking destinations; absent for crypto and internal ones. */
8783
+ validation_issues?: components["schemas"]["DestinationValidationIssue"][];
8784
+ };
8785
+ /** @description One problem with a destination payload. `field` is the request path of the offending value (`iban`, `routing_number`, `address.city`…); `message` is ready to show under that field. */
8786
+ DestinationValidationIssue: {
8787
+ /** @example iban */
8788
+ field: string;
8789
+ /**
8790
+ * @description Machine-readable reason. Bank details: `REQUIRED`, `IBAN_WRONG_FORMAT`, `IBAN_INVALID_CHARACTERS`, `IBAN_COUNTRY_NOT_SUPPORTED`, `IBAN_WRONG_LENGTH`, `IBAN_WRONG_BBAN_FORMAT`, `IBAN_WRONG_CHECKSUM`, `IBAN_WRONG_NATIONAL_CHECKSUM`, `IBAN_QR_NOT_ALLOWED`, `IBAN_NOT_SEPA`, `IBAN_BIC_COUNTRY_MISMATCH`, `BIC_WRONG_FORMAT`, `BIC_UNKNOWN_COUNTRY`, `BIC_TEST_CODE`, `ROUTING_NUMBER_INVALID`, `ACCOUNT_NUMBER_INVALID`, `SORT_CODE_INVALID`, `WRONG_IDENTIFIER_TYPE`, `INVALID_VALUE`; reference data: `BANK_COUNTRY_MISMATCH`, `VALIDATION_ERROR`; dry run only: `INVALID_TYPE`. New codes may be added — show `message` for an unknown one.
8791
+ * @example IBAN_NOT_SEPA
8792
+ */
8793
+ code: string;
8794
+ /** @example IBAN country AE is outside the SEPA zone — SEPA transfers cannot reach it */
8795
+ message: string;
8796
+ /**
8797
+ * @description ISO 3166-1 alpha-2 country the problem is about, when there is one
8798
+ * @example AE
8799
+ */
8800
+ country?: string;
8801
+ /**
8802
+ * @description For `WRONG_IDENTIFIER_TYPE`: what the value looks like (an IBAN typed into a US account-number field…)
8803
+ * @enum {string}
8804
+ */
8805
+ detected?: "IBAN" | "BIC" | "ROUTING_NUMBER";
8806
+ };
8807
+ DestinationValidationResult: {
8808
+ /** @description True when creating the destination with this payload would pass every check */
8809
+ valid: boolean;
8810
+ issues: components["schemas"]["DestinationValidationIssue"][];
8259
8811
  };
8260
8812
  /** @description Owning counterparty account, embedded on destination reads; absent on create/update. */
8261
8813
  CounterpartyAccountRef: {
@@ -8286,6 +8838,19 @@ export interface components {
8286
8838
  /** Format: date-time */
8287
8839
  updated_at?: string;
8288
8840
  };
8841
+ /** @description Documents to file for the KYC entity. Each entry is stored as a document of its type; an earlier document of the same type stays on record (several documents of one type are allowed). All entries of one request form one batch in the given order, so a multi-file document (e.g. the pages of a bank statement) is sent as several entries of the same type in one request. A document is removed through DELETE /admin/kyc_entity/{entity_id}/documents/{document_id}. */
8842
+ KycDocumentsInput: {
8843
+ /**
8844
+ * @description Document type: supplementary, gov_id_front, gov_id_back, gov_id_hand_hold, selfie, proof_of_address, auth_letter, formation_doc, proof_of_ownership, certificate_of_registration_doc, business_registration_doc, share_structure, constitution_or_annual_report, articles_of_association, ubo_declaration, partnership_mins_of_meeting, partnership_deed, certificate_of_incumbency, regulatory_license, state_registry_doc, good_standing_cert, business_proof_of_address, invoices, contracts, financial_statements, source_of_funds, business_bank_statement, source_of_wealth_ubo, customer_supplier_agreements.
8845
+ * @example formation_doc
8846
+ */
8847
+ type: string;
8848
+ /**
8849
+ * Format: uri
8850
+ * @description http(s) URL of the file.
8851
+ */
8852
+ link: string;
8853
+ }[];
8289
8854
  KycEntity: {
8290
8855
  /** Format: uuid */
8291
8856
  id?: string;
@@ -8325,48 +8890,134 @@ export interface components {
8325
8890
  gov_id_country?: string | null;
8326
8891
  gov_id_type?: string | null;
8327
8892
  gov_id_number?: string | null;
8328
- /** @description URL to selfie image */
8329
- selfie_url?: string | null;
8330
- /** @description URL to government ID front image */
8331
- gov_id_front_url?: string | null;
8332
- /** @description URL to government ID back image */
8333
- gov_id_back_url?: string | null;
8334
- /** @description URL to hand-held government ID image */
8335
- gov_id_hand_hold_url?: string | null;
8336
- /** @description URL to proof of address document */
8337
- proof_of_address_url?: string | null;
8893
+ /** @description Every KYC document of the entity and of its beneficial owners, oldest first. Several documents of one type may be on record; the current set of a type is its newest batch (files sent in one request share `batch_id`, ordered by `position`). The `*_url` fields below are deprecated copies of it. */
8894
+ documents?: {
8895
+ /** Format: uuid */
8896
+ id?: string;
8897
+ /**
8898
+ * @description Document type (see KycDocumentsInput for the list).
8899
+ * @example formation_doc
8900
+ */
8901
+ type?: string;
8902
+ /** Format: uri */
8903
+ link?: string;
8904
+ /**
8905
+ * Format: uuid
8906
+ * @description Beneficial owner the document belongs to; null for the entity itself.
8907
+ */
8908
+ ubo_id?: string | null;
8909
+ /**
8910
+ * @description Who filed the document: `admin_api` — this API, `panel` — an operator, `bff` — the client application, `kyc_provider` — received from the KYC provider, `backfill` — carried over from the former `*_url` fields.
8911
+ * @example admin_api
8912
+ * @enum {string}
8913
+ */
8914
+ source?: "admin_api" | "panel" | "bff" | "kyc_provider" | "backfill";
8915
+ /**
8916
+ * Format: uuid
8917
+ * @description Shared by the files sent in one request (one submission).
8918
+ */
8919
+ batch_id?: string;
8920
+ /** @description Order of the file within its batch, from 0. */
8921
+ position?: number;
8922
+ /** Format: date-time */
8923
+ created_at?: string;
8924
+ }[];
8925
+ /**
8926
+ * @deprecated
8927
+ * @description Deprecated — read `documents[]`. Link of the newest `selfie` document of the entity itself; null when there is none.
8928
+ */
8929
+ readonly selfie_url?: string | null;
8930
+ /**
8931
+ * @deprecated
8932
+ * @description Deprecated — read `documents[]`. Link of the newest `gov_id_front` document of the entity itself; null when there is none.
8933
+ */
8934
+ readonly gov_id_front_url?: string | null;
8935
+ /**
8936
+ * @deprecated
8937
+ * @description Deprecated — read `documents[]`. Link of the newest `gov_id_back` document of the entity itself; null when there is none.
8938
+ */
8939
+ readonly gov_id_back_url?: string | null;
8940
+ /**
8941
+ * @deprecated
8942
+ * @description Deprecated — read `documents[]`. Link of the newest `gov_id_hand_hold` document of the entity itself; null when there is none.
8943
+ */
8944
+ readonly gov_id_hand_hold_url?: string | null;
8945
+ /**
8946
+ * @deprecated
8947
+ * @description Deprecated — read `documents[]`. Link of the newest `proof_of_address` document of the entity itself; null when there is none.
8948
+ */
8949
+ readonly proof_of_address_url?: string | null;
8950
+ /**
8951
+ * @deprecated
8952
+ * @description Deprecated — read `documents[]`. Link of the newest `formation_doc` document of the entity itself; null when there is none.
8953
+ */
8954
+ readonly formation_doc_url?: string | null;
8955
+ /**
8956
+ * @deprecated
8957
+ * @description Deprecated — read `documents[]`. Link of the newest `proof_of_ownership` document of the entity itself; null when there is none.
8958
+ */
8959
+ readonly proof_of_ownership_url?: string | null;
8960
+ /**
8961
+ * @deprecated
8962
+ * @description Deprecated — read `documents[]`. Link of the newest `certificate_of_registration_doc` document of the entity itself; null when there is none.
8963
+ */
8964
+ readonly certificate_of_registration_doc_url?: string | null;
8965
+ /**
8966
+ * @deprecated
8967
+ * @description Deprecated — read `documents[]`. Link of the newest `business_registration_doc` document of the entity itself; null when there is none.
8968
+ */
8969
+ readonly business_registration_doc_url?: string | null;
8970
+ /**
8971
+ * @deprecated
8972
+ * @description Deprecated — read `documents[]`. Link of the newest `share_structure` document of the entity itself; null when there is none.
8973
+ */
8974
+ readonly share_structure_url?: string | null;
8975
+ /**
8976
+ * @deprecated
8977
+ * @description Deprecated — read `documents[]`. Link of the newest `constitution_or_annual_report` document of the entity itself; null when there is none.
8978
+ */
8979
+ readonly constitution_or_annual_report_url?: string | null;
8980
+ /**
8981
+ * @deprecated
8982
+ * @description Deprecated — read `documents[]`. Link of the newest `articles_of_association` document of the entity itself; null when there is none.
8983
+ */
8984
+ readonly articles_of_association_url?: string | null;
8985
+ /**
8986
+ * @deprecated
8987
+ * @description Deprecated — read `documents[]`. Link of the newest `ubo_declaration` document of the entity itself; null when there is none.
8988
+ */
8989
+ readonly ubo_declaration_url?: string | null;
8990
+ /**
8991
+ * @deprecated
8992
+ * @description Deprecated — read `documents[]`. Link of the newest `partnership_mins_of_meeting` document of the entity itself; null when there is none.
8993
+ */
8994
+ readonly partnership_mins_of_meeting_url?: string | null;
8995
+ /**
8996
+ * @deprecated
8997
+ * @description Deprecated — read `documents[]`. Link of the newest `partnership_deed` document of the entity itself; null when there is none.
8998
+ */
8999
+ readonly partnership_deed_url?: string | null;
9000
+ /**
9001
+ * @deprecated
9002
+ * @description Deprecated — read `documents[]`. Link of the newest `certificate_of_incumbency` document of the entity itself; null when there is none.
9003
+ */
9004
+ readonly certificate_of_incumbency_url?: string | null;
9005
+ /**
9006
+ * @deprecated
9007
+ * @description Deprecated — read `documents[]`. Link of the newest `regulatory_license` document of the entity itself; null when there is none.
9008
+ */
9009
+ readonly regulatory_license_url?: string | null;
9010
+ /**
9011
+ * @deprecated
9012
+ * @description Deprecated — read `documents[]`. Link of the newest `supplementary` document of the entity itself; null when there is none.
9013
+ */
9014
+ readonly supplementary_url?: string | null;
8338
9015
  /** @description Type of proof of address document */
8339
9016
  proof_of_address_type?: string | null;
8340
- /** @description URL to formation document (business) */
8341
- formation_doc_url?: string | null;
8342
- /** @description URL to proof of ownership document (business) */
8343
- proof_of_ownership_url?: string | null;
8344
9017
  /** @description Type of certificate of registration */
8345
9018
  certificate_of_registration_doc_type?: string | null;
8346
- /** @description URL to certificate of registration (business) */
8347
- certificate_of_registration_doc_url?: string | null;
8348
9019
  /** @description Certificate number (business) */
8349
9020
  certificate_number?: string | null;
8350
- /** @description URL to business registration document */
8351
- business_registration_doc_url?: string | null;
8352
- /** @description URL to share structure document (business) */
8353
- share_structure_url?: string | null;
8354
- /** @description URL to constitution or annual report (business) */
8355
- constitution_or_annual_report_url?: string | null;
8356
- /** @description URL to articles of association (business) */
8357
- articles_of_association_url?: string | null;
8358
- /** @description URL to UBO declaration (business) */
8359
- ubo_declaration_url?: string | null;
8360
- /** @description URL to partnership minutes of meeting (business) */
8361
- partnership_mins_of_meeting_url?: string | null;
8362
- /** @description URL to partnership deed (business) */
8363
- partnership_deed_url?: string | null;
8364
- /** @description URL to certificate of incumbency (business) */
8365
- certificate_of_incumbency_url?: string | null;
8366
- /** @description URL to regulatory license (business) */
8367
- regulatory_license_url?: string | null;
8368
- /** @description URL to supplementary document */
8369
- supplementary_url?: string | null;
8370
9021
  /** Format: uuid */
8371
9022
  kyc_address_id?: string | null;
8372
9023
  /** Format: uuid */
@@ -8666,7 +9317,7 @@ export interface components {
8666
9317
  note?: string;
8667
9318
  /**
8668
9319
  * Format: date-time
8669
- * @description Optional. Schedule the payment for a future time (min 1 hour, max 90 days ahead). No funds are reserved; after approval the order waits in EXPECTED status and executes automatically.
9320
+ * @description Optional. Schedule the payment for a future time (min 1 hour, max 90 days ahead). No funds are reserved; after approval the order waits in EXPECTED status and executes automatically, once: if the balance does not cover it then, it fails with `scheduled_failure.code` INSUFFICIENT_FUNDS and is not retried. Approve at least 1 hour before scheduled_at.
8670
9321
  */
8671
9322
  scheduled_at?: string;
8672
9323
  };
@@ -8695,7 +9346,7 @@ export interface components {
8695
9346
  note?: string;
8696
9347
  /**
8697
9348
  * Format: date-time
8698
- * @description Optional. Schedule the payment for a future time (min 1 hour, max 90 days ahead). No funds are reserved; after approval the order waits in EXPECTED status and executes automatically.
9349
+ * @description Optional. Schedule the payment for a future time (min 1 hour, max 90 days ahead). No funds are reserved; after approval the order waits in EXPECTED status and executes automatically, once: if the balance does not cover it then, it fails with `scheduled_failure.code` INSUFFICIENT_FUNDS and is not retried. Approve at least 1 hour before scheduled_at.
8699
9350
  */
8700
9351
  scheduled_at?: string;
8701
9352
  };
@@ -8752,6 +9403,16 @@ export interface components {
8752
9403
  * @description Requested execution time for scheduled payments (status EXPECTED); null for immediate orders
8753
9404
  */
8754
9405
  scheduled_at?: string | null;
9406
+ /** @description Why a scheduled payment failed — set on a scheduled order in `FAILED`, null on any other scheduled order, absent on an immediate one. A scheduled payment is attempted once and never retried: `INSUFFICIENT_FUNDS` means nothing was debited and the payment can be created again; `PROVIDER_ERROR` — the payment was debited and the provider side failed; `EXECUTION_ERROR` — any other reason. */
9407
+ scheduled_failure?: {
9408
+ /** @enum {string} */
9409
+ code: "INSUFFICIENT_FUNDS" | "PROVIDER_ERROR" | "EXECUTION_ERROR";
9410
+ /**
9411
+ * @description Customer-facing text of the code.
9412
+ * @example The balance was insufficient at the scheduled time.
9413
+ */
9414
+ message: string;
9415
+ } | null;
8755
9416
  /** Format: date-time */
8756
9417
  created_at?: string;
8757
9418
  /** Format: date-time */