squarefi-bff-api-module 1.36.31 → 1.36.33

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.
@@ -872,9 +872,21 @@ export interface paths {
872
872
  cookie?: never;
873
873
  };
874
874
  /**
875
- * Look up bank data by code
876
- * @description Resolves a bank identifier (IBAN, SWIFT/BIC, or US RTN) into normalised
877
- * bank/address data suitable for prefilling a counterparty form.
875
+ * Look up bank data by payment method and code
876
+ * @description Resolves a bank identifier into the bank name and registered address for
877
+ * prefilling counterparty bank details. `method` fixes the expected code
878
+ * format:
879
+ *
880
+ * | `method` | code |
881
+ * | --- | --- |
882
+ * | `ach`, `fedwire` | US routing number (ABA/RTN) |
883
+ * | `swift`, `sepa` | SWIFT/BIC |
884
+ * | `fps`, `chaps` | UK sort code (always resolves to an empty list today) |
885
+ *
886
+ * Matching is by full code — prefix search is not supported, so `data`
887
+ * carries at most one element today. A well-formed code that matches no
888
+ * bank is `200` with an empty `data`, not a 404. Banks that do not accept
889
+ * the selected method also resolve to an empty `data`.
878
890
  *
879
891
  * **Authentication**: Bearer token + x-tenant-id header
880
892
  *
@@ -882,8 +894,13 @@ export interface paths {
882
894
  get: {
883
895
  parameters: {
884
896
  query: {
885
- /** @description IBAN, SWIFT/BIC, or US routing number (optionally "routing:account") */
897
+ /** @description Full bank code in the format implied by `method`. For `ach`/`fedwire`
898
+ * the legacy `routing:account` form is tolerated — the account part is
899
+ * ignored.
900
+ * */
886
901
  code: string;
902
+ /** @description Payment method the bank details are collected for */
903
+ method: "ach" | "fedwire" | "swift" | "sepa" | "fps" | "chaps";
887
904
  };
888
905
  header?: never;
889
906
  path?: never;
@@ -891,9 +908,9 @@ export interface paths {
891
908
  };
892
909
  requestBody?: never;
893
910
  responses: {
894
- /** @description Bank data resolved. `data` is null ONLY when the bank-data lookup subsystem is
895
- * disabled on the environment; with lookups enabled a failed resolution is
896
- * reported as 400, never as a null `data`.
911
+ /** @description Matched banks (at most one today). An empty `data` means the code is
912
+ * well-formed but no bank was found for the requested method — clients
913
+ * fall back to manual entry.
897
914
  * */
898
915
  200: {
899
916
  headers: {
@@ -903,20 +920,24 @@ export interface paths {
903
920
  "application/json": {
904
921
  /** @example true */
905
922
  success: boolean;
906
- data: components["schemas"]["BankData"] | null;
923
+ data: components["schemas"]["BankDataItem"][];
924
+ /**
925
+ * @description Convenience length of `data`
926
+ * @example 1
927
+ */
928
+ count?: number;
907
929
  };
908
930
  };
909
931
  };
910
- /** @description Bad request — one of:
911
- * - `VALIDATION_ERROR` — query parameter `code` is missing/empty, or longer than 64 characters
912
- * - `UNSUPPORTED_BANK_CODE` `code` does not match any supported format (IBAN, SWIFT/BIC, US RTN)
913
- * - `BANK_DATA_LOOKUP_FAILED` — the code is well-formed but could not be resolved
914
- * (unknown code or a transient lookup failure); always reported as this single
915
- * 400, never as 404/502
916
- * - `EXTERNAL_SERVICE_ERROR` — the bank-data lookup is temporarily unavailable
932
+ /** @description Bad request — only for malformed input:
933
+ * - `VALIDATION_ERROR` — `code` is missing/empty or longer than 64
934
+ * characters, or `method` is missing/not one of the allowed values
935
+ * - `UNSUPPORTED_BANK_CODE` — `code` does not match the format required
936
+ * by `method` (e.g. a SWIFT/BIC passed with `method=ach`)
917
937
  *
918
- * The body also carries a top-level `correlationId` (added by the error handler to
919
- * every 4xx/5xx it formats).
938
+ * A resolvable-but-unknown code is NOT a 400 it answers `200` with an
939
+ * empty `data`. The body also carries a top-level `correlationId`
940
+ * (added by the error handler to every 4xx/5xx it formats).
920
941
  * */
921
942
  400: {
922
943
  headers: {
@@ -975,6 +996,25 @@ export interface paths {
975
996
  "application/json": components["schemas"]["ErrorResponse"];
976
997
  };
977
998
  };
999
+ /** @description Bank data lookup is temporarily unavailable — safe to retry later.
1000
+ * The body carries a `correlationId`.
1001
+ * */
1002
+ 503: {
1003
+ headers: {
1004
+ [name: string]: unknown;
1005
+ };
1006
+ content: {
1007
+ /** @example {
1008
+ * "success": false,
1009
+ * "error": {
1010
+ * "code": "BANK_DATA_LOOKUP_FAILED",
1011
+ * "message": "Bank data lookup failed"
1012
+ * },
1013
+ * "correlationId": "3f7f2f9a-8f0e-4a3b-9a3d-2f1c9d6a1b2c"
1014
+ * } */
1015
+ "application/json": components["schemas"]["ErrorResponse"];
1016
+ };
1017
+ };
978
1018
  };
979
1019
  };
980
1020
  put?: never;
@@ -2124,7 +2164,7 @@ export interface paths {
2124
2164
  * Format: uuid
2125
2165
  * @description Optional. Binds the card to a wallet member so a scoped `user` role can
2126
2166
  * access ONLY this card (view, sensitive data, transactions, freeze/unfreeze),
2127
- * and nothing else in the wallet (SFI-1382). Must be the `user_data.uuid` of an
2167
+ * and nothing else in the wallet. Must be the `user_data.uuid` of an
2128
2168
  * active member of the target wallet; resolved server-side to the card's owner.
2129
2169
  *
2130
2170
  * @example a1b2c3d4-e5f6-7890-abcd-ef1234567890
@@ -2818,11 +2858,13 @@ export interface paths {
2818
2858
  put?: never;
2819
2859
  /**
2820
2860
  * Deposit funds to card
2821
- * @description Deposits funds to a card from the associated wallet.
2822
- *
2823
- * **Authentication**: Bearer token with x-tenant-id header required
2861
+ * @description Thin wrapper over the sub-account deposit: the card's sub-account is
2862
+ * resolved from `card_id` and the request is processed by the same
2863
+ * implementation as POST /frontend/issuing/sub-accounts/{sub_account_id}/deposit
2864
+ * (same order types, validation and program routing).
2824
2865
  *
2825
- * **Access Control**: User must have access to the card
2866
+ * **Authentication**: Bearer token with x-tenant-id header required.
2867
+ * **Access Control**: wallet ADMIN role on the card's wallet.
2826
2868
  *
2827
2869
  */
2828
2870
  post: {
@@ -2840,85 +2882,53 @@ export interface paths {
2840
2882
  "application/json": {
2841
2883
  /**
2842
2884
  * Format: uuid
2843
- * @description Unique reference ID for idempotency (must be valid UUID)
2844
- * @example 550e8400-e29b-41d4-a716-446655440000
2885
+ * @description Unique reference ID for idempotency
2845
2886
  */
2846
2887
  reference_id: string;
2847
2888
  /**
2848
2889
  * Format: uuid
2849
- * @description UUID of the currency to deduct from wallet
2850
- * @example 509eca03-bc0d-4a38-b7dc-d136d2bdaa43
2890
+ * @description UUID of the currency to deduct from the wallet
2851
2891
  */
2852
2892
  from_currency_id: string;
2853
- /**
2854
- * @description Amount to deposit
2855
- * @example 100.5
2856
- */
2857
2893
  amount: number;
2858
- /**
2859
- * @description Optional description for the deposit
2860
- * @example Monthly card funding
2861
- */
2862
2894
  note?: string;
2863
2895
  };
2864
2896
  };
2865
2897
  };
2866
2898
  responses: {
2867
- /** @description Deposit successful */
2899
+ /** @description Deposit order created (COMPLETE, FAILED, or PROCESSING for workflow-routed programs) */
2868
2900
  200: {
2869
2901
  headers: {
2870
2902
  [name: string]: unknown;
2871
2903
  };
2872
- content: {
2873
- "application/json": {
2874
- /** @example true */
2875
- success?: boolean;
2876
- data?: {
2877
- /**
2878
- * Format: uuid
2879
- * @description Unique order identifier
2880
- */
2881
- order_uuid?: string;
2882
- /** @description Transaction ID for tracking */
2883
- transaction_id?: string;
2884
- /** @enum {string} */
2885
- status?: "PENDING" | "COMPLETE" | "FAILED";
2886
- amount_from?: number;
2887
- amount_to?: number;
2888
- /** Format: date-time */
2889
- created_at?: string;
2890
- };
2891
- };
2892
- };
2904
+ content?: never;
2893
2905
  };
2894
- /** @description Bad Request - One of the following:
2895
- * - Missing required fields
2896
- * - Invalid reference_id format
2897
- * - Invalid amount (must be positive number)
2898
- * */
2906
+ /** @description Validation error */
2899
2907
  400: {
2900
2908
  headers: {
2901
2909
  [name: string]: unknown;
2902
2910
  };
2903
- content?: never;
2911
+ content: {
2912
+ "application/json": components["schemas"]["ErrorResponse"];
2913
+ };
2904
2914
  };
2905
- /** @description Forbidden - One of the following:
2906
- * - Access denied to this card
2907
- * - Insufficient wallet balance
2908
- * - Topup not allowed (limits exceeded)
2909
- * */
2915
+ /** @description Access denied to this card */
2910
2916
  403: {
2911
2917
  headers: {
2912
2918
  [name: string]: unknown;
2913
2919
  };
2914
- content?: never;
2920
+ content: {
2921
+ "application/json": components["schemas"]["ErrorResponse"];
2922
+ };
2915
2923
  };
2916
- /** @description Card or wallet not found */
2924
+ /** @description Card or sub-account not found */
2917
2925
  404: {
2918
2926
  headers: {
2919
2927
  [name: string]: unknown;
2920
2928
  };
2921
- content?: never;
2929
+ content: {
2930
+ "application/json": components["schemas"]["ErrorResponse"];
2931
+ };
2922
2932
  };
2923
2933
  };
2924
2934
  };
@@ -2939,13 +2949,14 @@ export interface paths {
2939
2949
  put?: never;
2940
2950
  /**
2941
2951
  * Withdraw funds from card
2942
- * @description Withdraws funds from a card back to the associated wallet.
2943
- *
2944
- * **Authentication**: Bearer token with x-tenant-id header required
2945
- *
2946
- * **Access Control**: User must have access to the card
2952
+ * @description Thin wrapper over the sub-account withdraw: the card's sub-account is
2953
+ * resolved from `card_id` and the request is processed by the same
2954
+ * implementation as POST /frontend/issuing/sub-accounts/{sub_account_id}/withdraw
2955
+ * (same order types and validation; concurrent withdrawals on the same
2956
+ * sub-account are rejected with 409).
2947
2957
  *
2948
- * **Note**: This endpoint may not be implemented yet.
2958
+ * **Authentication**: Bearer token with x-tenant-id header required.
2959
+ * **Access Control**: wallet ADMIN role on the card's wallet.
2949
2960
  *
2950
2961
  */
2951
2962
  post: {
@@ -2961,60 +2972,54 @@ export interface paths {
2961
2972
  requestBody: {
2962
2973
  content: {
2963
2974
  "application/json": {
2964
- /**
2965
- * @description Amount to withdraw
2966
- * @example 50
2967
- */
2975
+ /** @description Amount to withdraw back to the wallet */
2968
2976
  amount: number;
2969
- /**
2970
- * @description Optional description for the withdrawal
2971
- * @example Refund to wallet
2972
- */
2973
- description?: string;
2974
2977
  };
2975
2978
  };
2976
2979
  };
2977
2980
  responses: {
2978
- /** @description Withdrawal successful */
2981
+ /** @description Withdrawal completed */
2979
2982
  200: {
2980
2983
  headers: {
2981
2984
  [name: string]: unknown;
2982
2985
  };
2983
- content: {
2984
- "application/json": {
2985
- /** @example true */
2986
- success?: boolean;
2987
- data?: {
2988
- /** Format: uuid */
2989
- transaction_id?: string;
2990
- amount?: number;
2991
- new_balance?: number;
2992
- /** @example completed */
2993
- status?: string;
2994
- };
2995
- };
2996
- };
2986
+ content?: never;
2997
2987
  };
2998
- /** @description Invalid amount or insufficient card balance */
2988
+ /** @description Validation error */
2999
2989
  400: {
3000
2990
  headers: {
3001
2991
  [name: string]: unknown;
3002
2992
  };
3003
- content?: never;
2993
+ content: {
2994
+ "application/json": components["schemas"]["ErrorResponse"];
2995
+ };
3004
2996
  };
3005
2997
  /** @description Access denied to this card */
3006
2998
  403: {
3007
2999
  headers: {
3008
3000
  [name: string]: unknown;
3009
3001
  };
3010
- content?: never;
3002
+ content: {
3003
+ "application/json": components["schemas"]["ErrorResponse"];
3004
+ };
3011
3005
  };
3012
- /** @description Not implemented */
3013
- 501: {
3006
+ /** @description Card or sub-account not found */
3007
+ 404: {
3014
3008
  headers: {
3015
3009
  [name: string]: unknown;
3016
3010
  };
3017
- content?: never;
3011
+ content: {
3012
+ "application/json": components["schemas"]["ErrorResponse"];
3013
+ };
3014
+ };
3015
+ /** @description Another withdrawal for this sub-account is in progress */
3016
+ 409: {
3017
+ headers: {
3018
+ [name: string]: unknown;
3019
+ };
3020
+ content: {
3021
+ "application/json": components["schemas"]["ErrorResponse"];
3022
+ };
3018
3023
  };
3019
3024
  };
3020
3025
  };
@@ -4914,89 +4919,117 @@ export interface paths {
4914
4919
  patch?: never;
4915
4920
  trace?: never;
4916
4921
  };
4917
- "/frontend/orders/deposit/ach": {
4922
+ "/frontend/mass-payouts/{wallet_id}": {
4918
4923
  parameters: {
4919
4924
  query?: never;
4920
4925
  header?: never;
4921
4926
  path?: never;
4922
4927
  cookie?: never;
4923
4928
  };
4924
- get?: never;
4925
- put?: never;
4926
- /**
4927
- * ACH (coming soon)
4928
- * @description ACH deposit is not yet implemented. Returns 501.
4929
- */
4930
- post: {
4929
+ /** List mass payouts of a wallet */
4930
+ get: {
4931
4931
  parameters: {
4932
- query?: never;
4932
+ query?: {
4933
+ status?: "DRAFT" | "PENDING_APPROVAL" | "PROCESSING" | "COMPLETED" | "FAILED" | "CANCELED";
4934
+ limit?: number;
4935
+ offset?: number;
4936
+ };
4933
4937
  header?: never;
4934
- path?: never;
4935
- cookie?: never;
4936
- };
4937
- requestBody: {
4938
- content: {
4939
- "application/json": {
4940
- /** Format: uuid */
4941
- wallet_id: string;
4942
- amount?: number;
4943
- request_id?: string;
4944
- };
4938
+ path: {
4939
+ /** @description Source wallet the batches belong to */
4940
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
4945
4941
  };
4942
+ cookie?: never;
4946
4943
  };
4944
+ requestBody?: never;
4947
4945
  responses: {
4948
- /** @description Not implemented */
4949
- 501: {
4946
+ /** @description Page of batches, newest first */
4947
+ 200: {
4950
4948
  headers: {
4951
4949
  [name: string]: unknown;
4952
4950
  };
4953
4951
  content: {
4954
- "application/json": components["schemas"]["ErrorResponse"];
4952
+ "application/json": {
4953
+ /** @example true */
4954
+ success?: boolean;
4955
+ data?: {
4956
+ items?: components["schemas"]["MassPayout"][];
4957
+ total?: number;
4958
+ limit?: number;
4959
+ offset?: number;
4960
+ };
4961
+ };
4955
4962
  };
4956
4963
  };
4957
4964
  };
4958
4965
  };
4959
- delete?: never;
4960
- options?: never;
4961
- head?: never;
4962
- patch?: never;
4963
- trace?: never;
4964
- };
4965
- "/frontend/orders/deposit/crypto": {
4966
- parameters: {
4967
- query?: never;
4968
- header?: never;
4969
- path?: never;
4970
- cookie?: never;
4971
- };
4972
- get?: never;
4973
4966
  put?: never;
4974
4967
  /**
4975
- * Crypto (coming soon)
4976
- * @description Crypto deposit is not yet implemented. Returns 501.
4968
+ * Create a mass payout draft
4969
+ * @description Creates a batch of payouts to existing counterparty destinations: one
4970
+ * source wallet, one currency, up to the tenant's batch-size limit of
4971
+ * recipients (default 100). The draft can be freely edited and
4972
+ * previewed; nothing moves until it is submitted and approved.
4973
+ * `virtual_account_id` is required only when the list contains banking
4974
+ * recipients. Requires an administrative role on the source wallet.
4975
+ *
4977
4976
  */
4978
4977
  post: {
4979
4978
  parameters: {
4980
4979
  query?: never;
4981
4980
  header?: never;
4982
- path?: never;
4981
+ path: {
4982
+ /** @description Source wallet the batches belong to */
4983
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
4984
+ };
4983
4985
  cookie?: never;
4984
4986
  };
4985
4987
  requestBody: {
4986
4988
  content: {
4987
4989
  "application/json": {
4988
4990
  /** Format: uuid */
4989
- wallet_id: string;
4990
- amount?: number;
4991
+ currency_id: string;
4991
4992
  /** Format: uuid */
4992
- currency_id?: string;
4993
- request_id?: string;
4993
+ virtual_account_id?: string;
4994
+ name: string;
4995
+ items: components["schemas"]["MassPayoutItemInput"][];
4994
4996
  };
4995
4997
  };
4996
4998
  };
4997
4999
  responses: {
4998
- /** @description Not implemented */
4999
- 501: {
5000
+ /** @description Draft created */
5001
+ 200: {
5002
+ headers: {
5003
+ [name: string]: unknown;
5004
+ };
5005
+ content: {
5006
+ "application/json": {
5007
+ /** @example true */
5008
+ success?: boolean;
5009
+ data?: components["schemas"]["MassPayout"];
5010
+ };
5011
+ };
5012
+ };
5013
+ /** @description Validation error (including the batch-size limit) */
5014
+ 400: {
5015
+ headers: {
5016
+ [name: string]: unknown;
5017
+ };
5018
+ content: {
5019
+ "application/json": components["schemas"]["ErrorResponse"];
5020
+ };
5021
+ };
5022
+ /** @description Caller lacks permission on the source wallet */
5023
+ 403: {
5024
+ headers: {
5025
+ [name: string]: unknown;
5026
+ };
5027
+ content: {
5028
+ "application/json": components["schemas"]["ErrorResponse"];
5029
+ };
5030
+ };
5031
+ /** @description Rate limit exceeded */
5032
+ 429: {
5000
5033
  headers: {
5001
5034
  [name: string]: unknown;
5002
5035
  };
@@ -5012,39 +5045,42 @@ export interface paths {
5012
5045
  patch?: never;
5013
5046
  trace?: never;
5014
5047
  };
5015
- "/frontend/orders/deposit/pix": {
5048
+ "/frontend/mass-payouts/{wallet_id}/{id}": {
5016
5049
  parameters: {
5017
5050
  query?: never;
5018
5051
  header?: never;
5019
5052
  path?: never;
5020
5053
  cookie?: never;
5021
5054
  };
5022
- get?: never;
5023
- put?: never;
5024
- /**
5025
- * PIX (coming soon)
5026
- * @description PIX deposit is not yet implemented. Returns 501.
5027
- */
5028
- post: {
5055
+ /** Get a mass payout */
5056
+ get: {
5029
5057
  parameters: {
5030
5058
  query?: never;
5031
5059
  header?: never;
5032
- path?: never;
5060
+ path: {
5061
+ /** @description Source wallet the batches belong to */
5062
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
5063
+ id: components["parameters"]["MassPayoutId"];
5064
+ };
5033
5065
  cookie?: never;
5034
5066
  };
5035
- requestBody: {
5036
- content: {
5037
- "application/json": {
5038
- /** Format: uuid */
5039
- wallet_id: string;
5040
- amount?: number;
5041
- request_id?: string;
5067
+ requestBody?: never;
5068
+ responses: {
5069
+ /** @description Batch details with progress counters and total amount */
5070
+ 200: {
5071
+ headers: {
5072
+ [name: string]: unknown;
5073
+ };
5074
+ content: {
5075
+ "application/json": {
5076
+ /** @example true */
5077
+ success?: boolean;
5078
+ data?: components["schemas"]["MassPayout"];
5079
+ };
5042
5080
  };
5043
5081
  };
5044
- };
5045
- responses: {
5046
- /** @description Not implemented */
5047
- 501: {
5082
+ /** @description Mass payout not found */
5083
+ 404: {
5048
5084
  headers: {
5049
5085
  [name: string]: unknown;
5050
5086
  };
@@ -5054,45 +5090,33 @@ export interface paths {
5054
5090
  };
5055
5091
  };
5056
5092
  };
5057
- delete?: never;
5058
- options?: never;
5059
- head?: never;
5060
- patch?: never;
5061
- trace?: never;
5062
- };
5063
- "/frontend/orders/deposit/card": {
5064
- parameters: {
5065
- query?: never;
5066
- header?: never;
5067
- path?: never;
5068
- cookie?: never;
5069
- };
5070
- get?: never;
5071
- put?: never;
5072
5093
  /**
5073
- * Card
5074
- * @description Returns funds from a card sub-account back to a wallet.
5094
+ * Edit a mass payout draft
5095
+ * @description Draft-only. `items` fully replaces the recipient list; `virtual_account_id: null` clears the source VA.
5075
5096
  */
5076
- post: {
5097
+ put: {
5077
5098
  parameters: {
5078
5099
  query?: never;
5079
5100
  header?: never;
5080
- path?: never;
5101
+ path: {
5102
+ /** @description Source wallet the batches belong to */
5103
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
5104
+ id: components["parameters"]["MassPayoutId"];
5105
+ };
5081
5106
  cookie?: never;
5082
5107
  };
5083
5108
  requestBody: {
5084
5109
  content: {
5085
5110
  "application/json": {
5111
+ name?: string;
5086
5112
  /** Format: uuid */
5087
- wallet_id: string;
5088
- amount: number;
5089
- /** Format: uuid */
5090
- sub_account_id: string;
5113
+ virtual_account_id?: string | null;
5114
+ items?: components["schemas"]["MassPayoutItemInput"][];
5091
5115
  };
5092
5116
  };
5093
5117
  };
5094
5118
  responses: {
5095
- /** @description Card return order created */
5119
+ /** @description Updated draft */
5096
5120
  200: {
5097
5121
  headers: {
5098
5122
  [name: string]: unknown;
@@ -5101,14 +5125,12 @@ export interface paths {
5101
5125
  "application/json": {
5102
5126
  /** @example true */
5103
5127
  success?: boolean;
5104
- data?: components["schemas"]["Order"];
5105
- /** @example Card return order created */
5106
- message?: string;
5128
+ data?: components["schemas"]["MassPayout"];
5107
5129
  };
5108
5130
  };
5109
5131
  };
5110
- /** @description Missing required fields or invalid amount */
5111
- 400: {
5132
+ /** @description Batch is not editable anymore (already submitted) */
5133
+ 409: {
5112
5134
  headers: {
5113
5135
  [name: string]: unknown;
5114
5136
  };
@@ -5116,42 +5138,156 @@ export interface paths {
5116
5138
  "application/json": components["schemas"]["ErrorResponse"];
5117
5139
  };
5118
5140
  };
5119
- /** @description Authentication required */
5120
- 401: {
5121
- headers: {
5122
- [name: string]: unknown;
5123
- };
5124
- content: {
5125
- "application/json": components["schemas"]["ErrorResponse"];
5126
- };
5141
+ };
5142
+ };
5143
+ post?: never;
5144
+ delete?: never;
5145
+ options?: never;
5146
+ head?: never;
5147
+ patch?: never;
5148
+ trace?: never;
5149
+ };
5150
+ "/frontend/mass-payouts/{wallet_id}/{id}/items": {
5151
+ parameters: {
5152
+ query?: never;
5153
+ header?: never;
5154
+ path?: never;
5155
+ cookie?: never;
5156
+ };
5157
+ /**
5158
+ * List items of a mass payout
5159
+ * @description Items in upload order, paginated with limit/offset like the batch list.
5160
+ */
5161
+ get: {
5162
+ parameters: {
5163
+ query?: {
5164
+ limit?: number;
5165
+ offset?: number;
5127
5166
  };
5128
- /** @description Caller is not an admin of the wallet */
5129
- 403: {
5167
+ header?: never;
5168
+ path: {
5169
+ /** @description Source wallet the batches belong to */
5170
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
5171
+ id: components["parameters"]["MassPayoutId"];
5172
+ };
5173
+ cookie?: never;
5174
+ };
5175
+ requestBody?: never;
5176
+ responses: {
5177
+ /** @description Page of items */
5178
+ 200: {
5130
5179
  headers: {
5131
5180
  [name: string]: unknown;
5132
5181
  };
5133
5182
  content: {
5134
- "application/json": components["schemas"]["ErrorResponse"];
5183
+ "application/json": {
5184
+ /** @example true */
5185
+ success?: boolean;
5186
+ data?: {
5187
+ items?: components["schemas"]["MassPayoutItem"][];
5188
+ total?: number;
5189
+ limit?: number;
5190
+ offset?: number;
5191
+ };
5192
+ };
5135
5193
  };
5136
5194
  };
5137
- /** @description Card return failed */
5138
- 500: {
5195
+ };
5196
+ };
5197
+ put?: never;
5198
+ post?: never;
5199
+ delete?: never;
5200
+ options?: never;
5201
+ head?: never;
5202
+ patch?: never;
5203
+ trace?: never;
5204
+ };
5205
+ "/frontend/mass-payouts/{wallet_id}/{id}/preview": {
5206
+ parameters: {
5207
+ query?: never;
5208
+ header?: never;
5209
+ path?: never;
5210
+ cookie?: never;
5211
+ };
5212
+ /**
5213
+ * Preview a mass payout
5214
+ * @description Dry-run before submitting: validates every recipient, estimates the fee
5215
+ * per item through the tenant's pricing, sums the total debit and checks
5216
+ * it against the wallet balance. Crypto payouts to on-platform addresses
5217
+ * may execute cheaper than estimated (they settle internally).
5218
+ *
5219
+ */
5220
+ get: {
5221
+ parameters: {
5222
+ query?: never;
5223
+ header?: never;
5224
+ path: {
5225
+ /** @description Source wallet the batches belong to */
5226
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
5227
+ id: components["parameters"]["MassPayoutId"];
5228
+ };
5229
+ cookie?: never;
5230
+ };
5231
+ requestBody?: never;
5232
+ responses: {
5233
+ /** @description Validation report, fee estimates and balance check */
5234
+ 200: {
5139
5235
  headers: {
5140
5236
  [name: string]: unknown;
5141
5237
  };
5142
5238
  content: {
5143
- "application/json": components["schemas"]["ErrorResponse"];
5239
+ "application/json": {
5240
+ /** @example true */
5241
+ success?: boolean;
5242
+ data?: {
5243
+ /** Format: uuid */
5244
+ id?: string;
5245
+ /** Format: uuid */
5246
+ currency_id?: string;
5247
+ total_items?: number;
5248
+ total_amount?: number;
5249
+ total_fees?: number;
5250
+ total_debit?: number;
5251
+ balance?: {
5252
+ available?: number;
5253
+ sufficient?: boolean;
5254
+ };
5255
+ valid_count?: number;
5256
+ invalid_count?: number;
5257
+ items?: {
5258
+ /** Format: uuid */
5259
+ item_id?: string;
5260
+ position?: number;
5261
+ /** Format: uuid */
5262
+ destination_id?: string;
5263
+ amount?: number;
5264
+ fee?: number;
5265
+ debit_amount?: number;
5266
+ result_amount?: number;
5267
+ }[];
5268
+ problems?: {
5269
+ /** Format: uuid */
5270
+ item_id?: string;
5271
+ position?: number;
5272
+ /** Format: uuid */
5273
+ destination_id?: string;
5274
+ error?: string;
5275
+ }[];
5276
+ };
5277
+ };
5144
5278
  };
5145
5279
  };
5146
5280
  };
5147
5281
  };
5282
+ put?: never;
5283
+ post?: never;
5148
5284
  delete?: never;
5149
5285
  options?: never;
5150
5286
  head?: never;
5151
5287
  patch?: never;
5152
5288
  trace?: never;
5153
5289
  };
5154
- "/frontend/orders/exchange": {
5290
+ "/frontend/mass-payouts/{wallet_id}/{id}/submit": {
5155
5291
  parameters: {
5156
5292
  query?: never;
5157
5293
  header?: never;
@@ -5161,35 +5297,25 @@ export interface paths {
5161
5297
  get?: never;
5162
5298
  put?: never;
5163
5299
  /**
5164
- * Exchange
5165
- * @description Currency exchange within a wallet a pure ledger swap for any enabled
5166
- * currency pair (crypto and fiat alike). Pair availability is governed by
5167
- * the exchange calculation config: a disabled pair is rejected at create.
5168
- *
5169
- * Two-phase, like the banking withdrawals: the order is created in status
5170
- * `NEW` without touching the balance. Call `POST /frontend/orders/{order_id}/approve`
5171
- * (OTP-gated, keyed on the order id) to check the balance, debit the
5172
- * source funds and execute the swap — the order lands in `COMPLETE`
5173
- * synchronously — or `POST /frontend/orders/{order_id}/cancel` to
5174
- * discard the order.
5175
- *
5176
- * Caller must be `admin` of the wallet.
5300
+ * Submit a mass payout for approval
5301
+ * @description DRAFT PENDING_APPROVAL. Refused while any recipient is invalid the
5302
+ * problems are returned in the error details so the rows can be fixed.
5177
5303
  *
5178
5304
  */
5179
5305
  post: {
5180
5306
  parameters: {
5181
5307
  query?: never;
5182
5308
  header?: never;
5183
- path?: never;
5184
- cookie?: never;
5185
- };
5186
- requestBody: {
5187
- content: {
5188
- "application/json": components["schemas"]["FrontendExchangeOrderRequest"];
5309
+ path: {
5310
+ /** @description Source wallet the batches belong to */
5311
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
5312
+ id: components["parameters"]["MassPayoutId"];
5189
5313
  };
5314
+ cookie?: never;
5190
5315
  };
5316
+ requestBody?: never;
5191
5317
  responses: {
5192
- /** @description Exchange order created (status NEW — approve to debit and execute) */
5318
+ /** @description Batch is awaiting approval */
5193
5319
  200: {
5194
5320
  headers: {
5195
5321
  [name: string]: unknown;
@@ -5198,11 +5324,11 @@ export interface paths {
5198
5324
  "application/json": {
5199
5325
  /** @example true */
5200
5326
  success?: boolean;
5201
- data?: components["schemas"]["Order"];
5327
+ data?: components["schemas"]["MassPayout"];
5202
5328
  };
5203
5329
  };
5204
5330
  };
5205
- /** @description Validation error (insufficient balance, virtual account missing, etc.) */
5331
+ /** @description Batch has invalid items (details carry the per-item problems) */
5206
5332
  400: {
5207
5333
  headers: {
5208
5334
  [name: string]: unknown;
@@ -5211,26 +5337,8 @@ export interface paths {
5211
5337
  "application/json": components["schemas"]["ErrorResponse"];
5212
5338
  };
5213
5339
  };
5214
- /** @description Authentication required */
5215
- 401: {
5216
- headers: {
5217
- [name: string]: unknown;
5218
- };
5219
- content: {
5220
- "application/json": components["schemas"]["ErrorResponse"];
5221
- };
5222
- };
5223
- /** @description Caller is not an admin of the wallet */
5224
- 403: {
5225
- headers: {
5226
- [name: string]: unknown;
5227
- };
5228
- content: {
5229
- "application/json": components["schemas"]["ErrorResponse"];
5230
- };
5231
- };
5232
- /** @description Rate limit exceeded */
5233
- 429: {
5340
+ /** @description Batch is not in DRAFT */
5341
+ 409: {
5234
5342
  headers: {
5235
5343
  [name: string]: unknown;
5236
5344
  };
@@ -5246,7 +5354,7 @@ export interface paths {
5246
5354
  patch?: never;
5247
5355
  trace?: never;
5248
5356
  };
5249
- "/frontend/orders/withdrawal/internal": {
5357
+ "/frontend/mass-payouts/{wallet_id}/{id}/approve": {
5250
5358
  parameters: {
5251
5359
  query?: never;
5252
5360
  header?: never;
@@ -5256,46 +5364,29 @@ export interface paths {
5256
5364
  get?: never;
5257
5365
  put?: never;
5258
5366
  /**
5259
- * Internal
5260
- * @description Transfers funds between two wallets within the platform. Two-phase:
5261
- * the order is created in `NEW` status without touching the balance;
5262
- * `POST /frontend/orders/{id}/approve` (OTP-gated, keyed on the order
5263
- * id) checks the balance, debits the sender and executes the transfer
5264
- * synchronously — receiver credited, order `COMPLETE`. A `NEW` order
5265
- * can simply be canceled (no funds are held).
5266
- * Caller must be `admin` of the source wallet.
5367
+ * Approve a mass payout
5368
+ * @description PENDING_APPROVAL PROCESSING and starts the asynchronous execution:
5369
+ * every item becomes a regular order (created and approved through the
5370
+ * standard order flow, funds are debited per order). Requires an
5371
+ * administrative wallet role and a recent second-factor verification a stale one is rejected
5372
+ * with `TWO_FACTOR_REVERIFICATION_REQUIRED`. Execution continues past
5373
+ * failed items; progress is visible through the batch counters.
5267
5374
  *
5268
5375
  */
5269
5376
  post: {
5270
5377
  parameters: {
5271
5378
  query?: never;
5272
5379
  header?: never;
5273
- path?: never;
5274
- cookie?: never;
5275
- };
5276
- requestBody: {
5277
- content: {
5278
- "application/json": {
5279
- /**
5280
- * Format: uuid
5281
- * @description Source wallet UUID
5282
- */
5283
- wallet_id: string;
5284
- /** Format: uuid */
5285
- from_currency_id: string;
5286
- /**
5287
- * Format: uuid
5288
- * @description Counterparty destination of type INTERNAL (points at the receiver wallet).
5289
- */
5290
- counterparty_destination_id: string;
5291
- amount: number;
5292
- /** @description Optional supporting documents persisted with the order. */
5293
- documents?: components["schemas"]["OrderDocumentInput"][];
5294
- };
5380
+ path: {
5381
+ /** @description Source wallet the batches belong to */
5382
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
5383
+ id: components["parameters"]["MassPayoutId"];
5295
5384
  };
5385
+ cookie?: never;
5296
5386
  };
5387
+ requestBody?: never;
5297
5388
  responses: {
5298
- /** @description Transfer created in NEW status (awaiting approve; no funds held) */
5389
+ /** @description Execution started */
5299
5390
  200: {
5300
5391
  headers: {
5301
5392
  [name: string]: unknown;
@@ -5304,29 +5395,11 @@ export interface paths {
5304
5395
  "application/json": {
5305
5396
  /** @example true */
5306
5397
  success?: boolean;
5307
- data?: components["schemas"]["Order"];
5398
+ data?: components["schemas"]["MassPayout"];
5308
5399
  };
5309
5400
  };
5310
5401
  };
5311
- /** @description Validation error */
5312
- 400: {
5313
- headers: {
5314
- [name: string]: unknown;
5315
- };
5316
- content: {
5317
- "application/json": components["schemas"]["ErrorResponse"];
5318
- };
5319
- };
5320
- /** @description Authentication required */
5321
- 401: {
5322
- headers: {
5323
- [name: string]: unknown;
5324
- };
5325
- content: {
5326
- "application/json": components["schemas"]["ErrorResponse"];
5327
- };
5328
- };
5329
- /** @description Caller is not an admin of the source wallet */
5402
+ /** @description Second-factor verification is stale or the caller lacks permission */
5330
5403
  403: {
5331
5404
  headers: {
5332
5405
  [name: string]: unknown;
@@ -5335,8 +5408,8 @@ export interface paths {
5335
5408
  "application/json": components["schemas"]["ErrorResponse"];
5336
5409
  };
5337
5410
  };
5338
- /** @description Rate limit exceeded */
5339
- 429: {
5411
+ /** @description Batch is not awaiting approval */
5412
+ 409: {
5340
5413
  headers: {
5341
5414
  [name: string]: unknown;
5342
5415
  };
@@ -5352,7 +5425,7 @@ export interface paths {
5352
5425
  patch?: never;
5353
5426
  trace?: never;
5354
5427
  };
5355
- "/frontend/orders/withdrawal/crypto": {
5428
+ "/frontend/mass-payouts/{wallet_id}/{id}/cancel": {
5356
5429
  parameters: {
5357
5430
  query?: never;
5358
5431
  header?: never;
@@ -5362,31 +5435,23 @@ export interface paths {
5362
5435
  get?: never;
5363
5436
  put?: never;
5364
5437
  /**
5365
- * Crypto
5366
- * @description Sends crypto from an omnibus wallet to an external address. Two-phase:
5367
- * the order is created in `NEW` status without touching the balance;
5368
- * `POST /frontend/orders/{id}/approve` (OTP-gated, keyed on the order
5369
- * id) checks the balance, debits the funds and dispatches the on-chain
5370
- * send. If the destination address belongs to a wallet in the same
5371
- * tenant, the order is created as `OMNIBUS_INTERNAL_TRANSFER` (no
5372
- * on-chain transaction) — still `NEW` at create, debited + settled
5373
- * synchronously to `COMPLETE` at approve.
5374
- *
5438
+ * Cancel a mass payout
5439
+ * @description Allowed from DRAFT and PENDING_APPROVAL. A PROCESSING batch cannot be canceled — payouts are already executing.
5375
5440
  */
5376
5441
  post: {
5377
5442
  parameters: {
5378
5443
  query?: never;
5379
5444
  header?: never;
5380
- path?: never;
5381
- cookie?: never;
5382
- };
5383
- requestBody: {
5384
- content: {
5385
- "application/json": components["schemas"]["FrontendCryptoTransferRequest"];
5445
+ path: {
5446
+ /** @description Source wallet the batches belong to */
5447
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
5448
+ id: components["parameters"]["MassPayoutId"];
5386
5449
  };
5450
+ cookie?: never;
5387
5451
  };
5452
+ requestBody?: never;
5388
5453
  responses: {
5389
- /** @description Crypto withdrawal created */
5454
+ /** @description Batch canceled */
5390
5455
  200: {
5391
5456
  headers: {
5392
5457
  [name: string]: unknown;
@@ -5395,12 +5460,12 @@ export interface paths {
5395
5460
  "application/json": {
5396
5461
  /** @example true */
5397
5462
  success?: boolean;
5398
- data?: components["schemas"]["Order"];
5463
+ data?: components["schemas"]["MassPayout"];
5399
5464
  };
5400
5465
  };
5401
5466
  };
5402
- /** @description Validation error */
5403
- 400: {
5467
+ /** @description Batch can no longer be canceled */
5468
+ 409: {
5404
5469
  headers: {
5405
5470
  [name: string]: unknown;
5406
5471
  };
@@ -5408,26 +5473,51 @@ export interface paths {
5408
5473
  "application/json": components["schemas"]["ErrorResponse"];
5409
5474
  };
5410
5475
  };
5411
- /** @description Authentication required */
5412
- 401: {
5413
- headers: {
5414
- [name: string]: unknown;
5415
- };
5416
- content: {
5417
- "application/json": components["schemas"]["ErrorResponse"];
5418
- };
5476
+ };
5477
+ };
5478
+ delete?: never;
5479
+ options?: never;
5480
+ head?: never;
5481
+ patch?: never;
5482
+ trace?: never;
5483
+ };
5484
+ "/frontend/mass-payouts/{wallet_id}/{id}/report.csv": {
5485
+ parameters: {
5486
+ query?: never;
5487
+ header?: never;
5488
+ path?: never;
5489
+ cookie?: never;
5490
+ };
5491
+ /**
5492
+ * Download the mass payout report (CSV)
5493
+ * @description Streaming CSV: recipient, amount, item status, the linked order and its
5494
+ * current status, and the failure reason for every unsuccessful payout.
5495
+ *
5496
+ */
5497
+ get: {
5498
+ parameters: {
5499
+ query?: never;
5500
+ header?: never;
5501
+ path: {
5502
+ /** @description Source wallet the batches belong to */
5503
+ wallet_id: components["parameters"]["MassPayoutWalletId"];
5504
+ id: components["parameters"]["MassPayoutId"];
5419
5505
  };
5420
- /** @description Caller is not an admin of the source wallet */
5421
- 403: {
5506
+ cookie?: never;
5507
+ };
5508
+ requestBody?: never;
5509
+ responses: {
5510
+ /** @description CSV file */
5511
+ 200: {
5422
5512
  headers: {
5423
5513
  [name: string]: unknown;
5424
5514
  };
5425
5515
  content: {
5426
- "application/json": components["schemas"]["ErrorResponse"];
5516
+ "text/csv": string;
5427
5517
  };
5428
5518
  };
5429
- /** @description Rate limit exceeded */
5430
- 429: {
5519
+ /** @description Mass payout not found */
5520
+ 404: {
5431
5521
  headers: {
5432
5522
  [name: string]: unknown;
5433
5523
  };
@@ -5437,13 +5527,15 @@ export interface paths {
5437
5527
  };
5438
5528
  };
5439
5529
  };
5530
+ put?: never;
5531
+ post?: never;
5440
5532
  delete?: never;
5441
5533
  options?: never;
5442
5534
  head?: never;
5443
5535
  patch?: never;
5444
5536
  trace?: never;
5445
5537
  };
5446
- "/frontend/orders/withdrawal/wire": {
5538
+ "/frontend/orders/deposit/ach": {
5447
5539
  parameters: {
5448
5540
  query?: never;
5449
5541
  header?: never;
@@ -5452,7 +5544,10 @@ export interface paths {
5452
5544
  };
5453
5545
  get?: never;
5454
5546
  put?: never;
5455
- /** Wire */
5547
+ /**
5548
+ * ACH (coming soon)
5549
+ * @description ACH deposit is not yet implemented. Returns 501.
5550
+ */
5456
5551
  post: {
5457
5552
  parameters: {
5458
5553
  query?: never;
@@ -5462,34 +5557,67 @@ export interface paths {
5462
5557
  };
5463
5558
  requestBody: {
5464
5559
  content: {
5465
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
5560
+ "application/json": {
5561
+ /** Format: uuid */
5562
+ wallet_id: string;
5563
+ amount?: number;
5564
+ request_id?: string;
5565
+ };
5466
5566
  };
5467
5567
  };
5468
5568
  responses: {
5469
- /** @description Wire withdrawal created */
5470
- 200: {
5569
+ /** @description Not implemented */
5570
+ 501: {
5471
5571
  headers: {
5472
5572
  [name: string]: unknown;
5473
5573
  };
5474
5574
  content: {
5475
- "application/json": {
5476
- /** @example true */
5477
- success?: boolean;
5478
- data?: components["schemas"]["Order"];
5479
- };
5575
+ "application/json": components["schemas"]["ErrorResponse"];
5480
5576
  };
5481
5577
  };
5482
- /** @description Validation error */
5483
- 400: {
5484
- headers: {
5485
- [name: string]: unknown;
5486
- };
5487
- content: {
5488
- "application/json": components["schemas"]["ErrorResponse"];
5578
+ };
5579
+ };
5580
+ delete?: never;
5581
+ options?: never;
5582
+ head?: never;
5583
+ patch?: never;
5584
+ trace?: never;
5585
+ };
5586
+ "/frontend/orders/deposit/crypto": {
5587
+ parameters: {
5588
+ query?: never;
5589
+ header?: never;
5590
+ path?: never;
5591
+ cookie?: never;
5592
+ };
5593
+ get?: never;
5594
+ put?: never;
5595
+ /**
5596
+ * Crypto (coming soon)
5597
+ * @description Crypto deposit is not yet implemented. Returns 501.
5598
+ */
5599
+ post: {
5600
+ parameters: {
5601
+ query?: never;
5602
+ header?: never;
5603
+ path?: never;
5604
+ cookie?: never;
5605
+ };
5606
+ requestBody: {
5607
+ content: {
5608
+ "application/json": {
5609
+ /** Format: uuid */
5610
+ wallet_id: string;
5611
+ amount?: number;
5612
+ /** Format: uuid */
5613
+ currency_id?: string;
5614
+ request_id?: string;
5489
5615
  };
5490
5616
  };
5491
- /** @description Authentication required */
5492
- 401: {
5617
+ };
5618
+ responses: {
5619
+ /** @description Not implemented */
5620
+ 501: {
5493
5621
  headers: {
5494
5622
  [name: string]: unknown;
5495
5623
  };
@@ -5497,17 +5625,47 @@ export interface paths {
5497
5625
  "application/json": components["schemas"]["ErrorResponse"];
5498
5626
  };
5499
5627
  };
5500
- /** @description Caller is not an admin of the source wallet */
5501
- 403: {
5502
- headers: {
5503
- [name: string]: unknown;
5504
- };
5505
- content: {
5506
- "application/json": components["schemas"]["ErrorResponse"];
5628
+ };
5629
+ };
5630
+ delete?: never;
5631
+ options?: never;
5632
+ head?: never;
5633
+ patch?: never;
5634
+ trace?: never;
5635
+ };
5636
+ "/frontend/orders/deposit/pix": {
5637
+ parameters: {
5638
+ query?: never;
5639
+ header?: never;
5640
+ path?: never;
5641
+ cookie?: never;
5642
+ };
5643
+ get?: never;
5644
+ put?: never;
5645
+ /**
5646
+ * PIX (coming soon)
5647
+ * @description PIX deposit is not yet implemented. Returns 501.
5648
+ */
5649
+ post: {
5650
+ parameters: {
5651
+ query?: never;
5652
+ header?: never;
5653
+ path?: never;
5654
+ cookie?: never;
5655
+ };
5656
+ requestBody: {
5657
+ content: {
5658
+ "application/json": {
5659
+ /** Format: uuid */
5660
+ wallet_id: string;
5661
+ amount?: number;
5662
+ request_id?: string;
5507
5663
  };
5508
5664
  };
5509
- /** @description Rate limit exceeded */
5510
- 429: {
5665
+ };
5666
+ responses: {
5667
+ /** @description Not implemented */
5668
+ 501: {
5511
5669
  headers: {
5512
5670
  [name: string]: unknown;
5513
5671
  };
@@ -5523,7 +5681,7 @@ export interface paths {
5523
5681
  patch?: never;
5524
5682
  trace?: never;
5525
5683
  };
5526
- "/frontend/orders/withdrawal/ach": {
5684
+ "/frontend/orders/exchange": {
5527
5685
  parameters: {
5528
5686
  query?: never;
5529
5687
  header?: never;
@@ -5532,7 +5690,22 @@ export interface paths {
5532
5690
  };
5533
5691
  get?: never;
5534
5692
  put?: never;
5535
- /** ACH */
5693
+ /**
5694
+ * Exchange
5695
+ * @description Currency exchange within a wallet — a pure ledger swap for any enabled
5696
+ * currency pair (crypto and fiat alike). Pair availability is governed by
5697
+ * the exchange calculation config: a disabled pair is rejected at create.
5698
+ *
5699
+ * Two-phase, like the banking withdrawals: the order is created in status
5700
+ * `NEW` without touching the balance. Call `POST /frontend/orders/{order_id}/approve`
5701
+ * (OTP-gated, keyed on the order id) to check the balance, debit the
5702
+ * source funds and execute the swap — the order lands in `COMPLETE`
5703
+ * synchronously — or `POST /frontend/orders/{order_id}/cancel` to
5704
+ * discard the order.
5705
+ *
5706
+ * Caller must be `admin` of the wallet.
5707
+ *
5708
+ */
5536
5709
  post: {
5537
5710
  parameters: {
5538
5711
  query?: never;
@@ -5542,11 +5715,11 @@ export interface paths {
5542
5715
  };
5543
5716
  requestBody: {
5544
5717
  content: {
5545
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
5718
+ "application/json": components["schemas"]["FrontendExchangeOrderRequest"];
5546
5719
  };
5547
5720
  };
5548
5721
  responses: {
5549
- /** @description ACH withdrawal created */
5722
+ /** @description Exchange order created (status NEW — approve to debit and execute) */
5550
5723
  200: {
5551
5724
  headers: {
5552
5725
  [name: string]: unknown;
@@ -5559,7 +5732,7 @@ export interface paths {
5559
5732
  };
5560
5733
  };
5561
5734
  };
5562
- /** @description Validation error */
5735
+ /** @description Validation error (insufficient balance, virtual account missing, etc.) */
5563
5736
  400: {
5564
5737
  headers: {
5565
5738
  [name: string]: unknown;
@@ -5577,7 +5750,7 @@ export interface paths {
5577
5750
  "application/json": components["schemas"]["ErrorResponse"];
5578
5751
  };
5579
5752
  };
5580
- /** @description Caller is not an admin of the source wallet */
5753
+ /** @description Caller is not an admin of the wallet */
5581
5754
  403: {
5582
5755
  headers: {
5583
5756
  [name: string]: unknown;
@@ -5603,7 +5776,7 @@ export interface paths {
5603
5776
  patch?: never;
5604
5777
  trace?: never;
5605
5778
  };
5606
- "/frontend/orders/withdrawal/sepa": {
5779
+ "/frontend/orders/withdrawal/internal": {
5607
5780
  parameters: {
5608
5781
  query?: never;
5609
5782
  header?: never;
@@ -5612,7 +5785,17 @@ export interface paths {
5612
5785
  };
5613
5786
  get?: never;
5614
5787
  put?: never;
5615
- /** SEPA */
5788
+ /**
5789
+ * Internal
5790
+ * @description Transfers funds between two wallets within the platform. Two-phase:
5791
+ * the order is created in `NEW` status without touching the balance;
5792
+ * `POST /frontend/orders/{id}/approve` (OTP-gated, keyed on the order
5793
+ * id) checks the balance, debits the sender and executes the transfer
5794
+ * synchronously — receiver credited, order `COMPLETE`. A `NEW` order
5795
+ * can simply be canceled (no funds are held).
5796
+ * Caller must be `admin` of the source wallet.
5797
+ *
5798
+ */
5616
5799
  post: {
5617
5800
  parameters: {
5618
5801
  query?: never;
@@ -5622,11 +5805,32 @@ export interface paths {
5622
5805
  };
5623
5806
  requestBody: {
5624
5807
  content: {
5625
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
5808
+ "application/json": {
5809
+ /**
5810
+ * Format: uuid
5811
+ * @description Source wallet UUID
5812
+ */
5813
+ wallet_id: string;
5814
+ /** Format: uuid */
5815
+ from_currency_id: string;
5816
+ /**
5817
+ * Format: uuid
5818
+ * @description Counterparty destination of type INTERNAL (points at the receiver wallet).
5819
+ */
5820
+ counterparty_destination_id: string;
5821
+ amount: number;
5822
+ /**
5823
+ * Format: date-time
5824
+ * @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.
5825
+ */
5826
+ scheduled_at?: string;
5827
+ /** @description Optional supporting documents persisted with the order. */
5828
+ documents?: components["schemas"]["OrderDocumentInput"][];
5829
+ };
5626
5830
  };
5627
5831
  };
5628
5832
  responses: {
5629
- /** @description SEPA withdrawal created */
5833
+ /** @description Transfer created in NEW status (awaiting approve; no funds held) */
5630
5834
  200: {
5631
5835
  headers: {
5632
5836
  [name: string]: unknown;
@@ -5683,7 +5887,7 @@ export interface paths {
5683
5887
  patch?: never;
5684
5888
  trace?: never;
5685
5889
  };
5686
- "/frontend/orders/withdrawal/swift": {
5890
+ "/frontend/orders/withdrawal/crypto": {
5687
5891
  parameters: {
5688
5892
  query?: never;
5689
5893
  header?: never;
@@ -5692,7 +5896,18 @@ export interface paths {
5692
5896
  };
5693
5897
  get?: never;
5694
5898
  put?: never;
5695
- /** SWIFT */
5899
+ /**
5900
+ * Crypto
5901
+ * @description Sends crypto from an omnibus wallet to an external address. Two-phase:
5902
+ * the order is created in `NEW` status without touching the balance;
5903
+ * `POST /frontend/orders/{id}/approve` (OTP-gated, keyed on the order
5904
+ * id) checks the balance, debits the funds and dispatches the on-chain
5905
+ * send. If the destination address belongs to a wallet in the same
5906
+ * tenant, the order is created as `OMNIBUS_INTERNAL_TRANSFER` (no
5907
+ * on-chain transaction) — still `NEW` at create, debited + settled
5908
+ * synchronously to `COMPLETE` at approve.
5909
+ *
5910
+ */
5696
5911
  post: {
5697
5912
  parameters: {
5698
5913
  query?: never;
@@ -5702,11 +5917,11 @@ export interface paths {
5702
5917
  };
5703
5918
  requestBody: {
5704
5919
  content: {
5705
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
5920
+ "application/json": components["schemas"]["FrontendCryptoTransferRequest"];
5706
5921
  };
5707
5922
  };
5708
5923
  responses: {
5709
- /** @description SWIFT withdrawal created */
5924
+ /** @description Crypto withdrawal created */
5710
5925
  200: {
5711
5926
  headers: {
5712
5927
  [name: string]: unknown;
@@ -5763,7 +5978,7 @@ export interface paths {
5763
5978
  patch?: never;
5764
5979
  trace?: never;
5765
5980
  };
5766
- "/frontend/orders/withdrawal/chaps": {
5981
+ "/frontend/orders/withdrawal/wire": {
5767
5982
  parameters: {
5768
5983
  query?: never;
5769
5984
  header?: never;
@@ -5772,7 +5987,7 @@ export interface paths {
5772
5987
  };
5773
5988
  get?: never;
5774
5989
  put?: never;
5775
- /** CHAPS */
5990
+ /** Wire */
5776
5991
  post: {
5777
5992
  parameters: {
5778
5993
  query?: never;
@@ -5786,7 +6001,7 @@ export interface paths {
5786
6001
  };
5787
6002
  };
5788
6003
  responses: {
5789
- /** @description CHAPS withdrawal created */
6004
+ /** @description Wire withdrawal created */
5790
6005
  200: {
5791
6006
  headers: {
5792
6007
  [name: string]: unknown;
@@ -5843,7 +6058,7 @@ export interface paths {
5843
6058
  patch?: never;
5844
6059
  trace?: never;
5845
6060
  };
5846
- "/frontend/orders/withdrawal/fps": {
6061
+ "/frontend/orders/withdrawal/ach": {
5847
6062
  parameters: {
5848
6063
  query?: never;
5849
6064
  header?: never;
@@ -5852,7 +6067,7 @@ export interface paths {
5852
6067
  };
5853
6068
  get?: never;
5854
6069
  put?: never;
5855
- /** FPS */
6070
+ /** ACH */
5856
6071
  post: {
5857
6072
  parameters: {
5858
6073
  query?: never;
@@ -5866,7 +6081,7 @@ export interface paths {
5866
6081
  };
5867
6082
  };
5868
6083
  responses: {
5869
- /** @description FPS withdrawal created */
6084
+ /** @description ACH withdrawal created */
5870
6085
  200: {
5871
6086
  headers: {
5872
6087
  [name: string]: unknown;
@@ -5923,7 +6138,7 @@ export interface paths {
5923
6138
  patch?: never;
5924
6139
  trace?: never;
5925
6140
  };
5926
- "/frontend/orders/withdrawal/card": {
6141
+ "/frontend/orders/withdrawal/sepa": {
5927
6142
  parameters: {
5928
6143
  query?: never;
5929
6144
  header?: never;
@@ -5932,10 +6147,7 @@ export interface paths {
5932
6147
  };
5933
6148
  get?: never;
5934
6149
  put?: never;
5935
- /**
5936
- * Card
5937
- * @description Funds a card sub-account from a wallet.
5938
- */
6150
+ /** SEPA */
5939
6151
  post: {
5940
6152
  parameters: {
5941
6153
  query?: never;
@@ -5945,32 +6157,11 @@ export interface paths {
5945
6157
  };
5946
6158
  requestBody: {
5947
6159
  content: {
5948
- "application/json": {
5949
- /** Format: uuid */
5950
- wallet_id: string;
5951
- amount: number;
5952
- /**
5953
- * Format: uuid
5954
- * @description Source currency UUID
5955
- */
5956
- from_uuid: string;
5957
- /** Format: uuid */
5958
- sub_account_id: string;
5959
- /**
5960
- * Format: uuid
5961
- * @description Optional specific card ID
5962
- */
5963
- card_id?: string;
5964
- /** @description Idempotency key */
5965
- reference_id?: string;
5966
- note?: string;
5967
- /** @description Optional supporting documents persisted with the order. */
5968
- documents?: components["schemas"]["OrderDocumentInput"][];
5969
- };
6160
+ "application/json": components["schemas"]["FrontendL2FOrderRequest"];
5970
6161
  };
5971
6162
  };
5972
6163
  responses: {
5973
- /** @description Card topup order created */
6164
+ /** @description SEPA withdrawal created */
5974
6165
  200: {
5975
6166
  headers: {
5976
6167
  [name: string]: unknown;
@@ -5980,12 +6171,10 @@ export interface paths {
5980
6171
  /** @example true */
5981
6172
  success?: boolean;
5982
6173
  data?: components["schemas"]["Order"];
5983
- /** @example Card topup order created */
5984
- message?: string;
5985
6174
  };
5986
6175
  };
5987
6176
  };
5988
- /** @description Missing required fields or invalid amount */
6177
+ /** @description Validation error */
5989
6178
  400: {
5990
6179
  headers: {
5991
6180
  [name: string]: unknown;
@@ -6012,8 +6201,8 @@ export interface paths {
6012
6201
  "application/json": components["schemas"]["ErrorResponse"];
6013
6202
  };
6014
6203
  };
6015
- /** @description Card topup failed */
6016
- 500: {
6204
+ /** @description Rate limit exceeded */
6205
+ 429: {
6017
6206
  headers: {
6018
6207
  [name: string]: unknown;
6019
6208
  };
@@ -6029,7 +6218,7 @@ export interface paths {
6029
6218
  patch?: never;
6030
6219
  trace?: never;
6031
6220
  };
6032
- "/frontend/orders/{order_id}/approve": {
6221
+ "/frontend/orders/withdrawal/swift": {
6033
6222
  parameters: {
6034
6223
  query?: never;
6035
6224
  header?: never;
@@ -6038,36 +6227,21 @@ export interface paths {
6038
6227
  };
6039
6228
  get?: never;
6040
6229
  put?: never;
6041
- /**
6042
- * Approve an order
6043
- * @description Moves a NEW order to PROCESSING: checks the balance, debits the funds
6044
- * (transaction written as `complete`) and triggers its workflow.
6045
- * Exchange orders (EXCHANGE_OMNI) and internal transfers
6046
- * (TRANSFER_INTERNAL / OMNIBUS_INTERNAL_TRANSFER) settle synchronously
6047
- * and land in COMPLETE. An insufficient balance fails the order
6048
- * (FAILED). OTP verification is mandatory and keyed on the order id
6049
- * (request the OTP for the order being approved).
6050
- *
6051
- */
6230
+ /** SWIFT */
6052
6231
  post: {
6053
6232
  parameters: {
6054
6233
  query?: never;
6055
6234
  header?: never;
6056
- path: {
6057
- order_id: string;
6058
- };
6235
+ path?: never;
6059
6236
  cookie?: never;
6060
6237
  };
6061
6238
  requestBody: {
6062
6239
  content: {
6063
- "application/json": {
6064
- /** Format: uuid */
6065
- wallet_id: string;
6066
- };
6240
+ "application/json": components["schemas"]["FrontendL2FOrderRequest"];
6067
6241
  };
6068
6242
  };
6069
6243
  responses: {
6070
- /** @description Order moved to PROCESSING */
6244
+ /** @description SWIFT withdrawal created */
6071
6245
  200: {
6072
6246
  headers: {
6073
6247
  [name: string]: unknown;
@@ -6080,8 +6254,35 @@ export interface paths {
6080
6254
  };
6081
6255
  };
6082
6256
  };
6083
- /** @description Order is not in an approvable state */
6084
- 409: {
6257
+ /** @description Validation error */
6258
+ 400: {
6259
+ headers: {
6260
+ [name: string]: unknown;
6261
+ };
6262
+ content: {
6263
+ "application/json": components["schemas"]["ErrorResponse"];
6264
+ };
6265
+ };
6266
+ /** @description Authentication required */
6267
+ 401: {
6268
+ headers: {
6269
+ [name: string]: unknown;
6270
+ };
6271
+ content: {
6272
+ "application/json": components["schemas"]["ErrorResponse"];
6273
+ };
6274
+ };
6275
+ /** @description Caller is not an admin of the source wallet */
6276
+ 403: {
6277
+ headers: {
6278
+ [name: string]: unknown;
6279
+ };
6280
+ content: {
6281
+ "application/json": components["schemas"]["ErrorResponse"];
6282
+ };
6283
+ };
6284
+ /** @description Rate limit exceeded */
6285
+ 429: {
6085
6286
  headers: {
6086
6287
  [name: string]: unknown;
6087
6288
  };
@@ -6097,7 +6298,7 @@ export interface paths {
6097
6298
  patch?: never;
6098
6299
  trace?: never;
6099
6300
  };
6100
- "/frontend/orders/{order_id}/cancel": {
6301
+ "/frontend/orders/withdrawal/chaps": {
6101
6302
  parameters: {
6102
6303
  query?: never;
6103
6304
  header?: never;
@@ -6106,30 +6307,21 @@ export interface paths {
6106
6307
  };
6107
6308
  get?: never;
6108
6309
  put?: never;
6109
- /**
6110
- * Cancel an order
6111
- * @description Cancels a NEW/FAILED order, cancels its workflow run, and refunds the debited funds (if the order was ever approved).
6112
- */
6310
+ /** CHAPS */
6113
6311
  post: {
6114
6312
  parameters: {
6115
6313
  query?: never;
6116
6314
  header?: never;
6117
- path: {
6118
- order_id: string;
6119
- };
6315
+ path?: never;
6120
6316
  cookie?: never;
6121
6317
  };
6122
6318
  requestBody: {
6123
6319
  content: {
6124
- "application/json": {
6125
- /** Format: uuid */
6126
- wallet_id: string;
6127
- reason?: string;
6128
- };
6320
+ "application/json": components["schemas"]["FrontendL2FOrderRequest"];
6129
6321
  };
6130
6322
  };
6131
6323
  responses: {
6132
- /** @description Order canceled (debited funds refunded when applicable) */
6324
+ /** @description CHAPS withdrawal created */
6133
6325
  200: {
6134
6326
  headers: {
6135
6327
  [name: string]: unknown;
@@ -6142,8 +6334,35 @@ export interface paths {
6142
6334
  };
6143
6335
  };
6144
6336
  };
6145
- /** @description Order is not in a cancelable state */
6146
- 409: {
6337
+ /** @description Validation error */
6338
+ 400: {
6339
+ headers: {
6340
+ [name: string]: unknown;
6341
+ };
6342
+ content: {
6343
+ "application/json": components["schemas"]["ErrorResponse"];
6344
+ };
6345
+ };
6346
+ /** @description Authentication required */
6347
+ 401: {
6348
+ headers: {
6349
+ [name: string]: unknown;
6350
+ };
6351
+ content: {
6352
+ "application/json": components["schemas"]["ErrorResponse"];
6353
+ };
6354
+ };
6355
+ /** @description Caller is not an admin of the source wallet */
6356
+ 403: {
6357
+ headers: {
6358
+ [name: string]: unknown;
6359
+ };
6360
+ content: {
6361
+ "application/json": components["schemas"]["ErrorResponse"];
6362
+ };
6363
+ };
6364
+ /** @description Rate limit exceeded */
6365
+ 429: {
6147
6366
  headers: {
6148
6367
  [name: string]: unknown;
6149
6368
  };
@@ -6159,7 +6378,7 @@ export interface paths {
6159
6378
  patch?: never;
6160
6379
  trace?: never;
6161
6380
  };
6162
- "/frontend/orders/{order_id}/comment": {
6381
+ "/frontend/orders/withdrawal/fps": {
6163
6382
  parameters: {
6164
6383
  query?: never;
6165
6384
  header?: never;
@@ -6167,39 +6386,22 @@ export interface paths {
6167
6386
  cookie?: never;
6168
6387
  };
6169
6388
  get?: never;
6170
- /**
6171
- * Set or clear an order's comment
6172
- * @description Saves (or edits) a single free-text comment attached to an order
6173
- * (incoming or outgoing). Useful for noting who an incoming crypto deposit
6174
- * came from. Send `comment: null` or an empty string to clear it.
6175
- *
6176
- * The response includes the saved `comment` plus audit metadata
6177
- * (`comment_updated_by` = editor's user_data uuid, `comment_updated_at`).
6178
- *
6179
- * **Access Control**: caller must be `admin` or `owner` of the order's wallet.
6180
- *
6181
- */
6182
- put: {
6389
+ put?: never;
6390
+ /** FPS */
6391
+ post: {
6183
6392
  parameters: {
6184
6393
  query?: never;
6185
6394
  header?: never;
6186
- path: {
6187
- order_id: string;
6188
- };
6395
+ path?: never;
6189
6396
  cookie?: never;
6190
6397
  };
6191
6398
  requestBody: {
6192
6399
  content: {
6193
- "application/json": {
6194
- /** Format: uuid */
6195
- wallet_id: string;
6196
- /** @description Comment text. `null` or empty clears the comment. */
6197
- comment?: string | null;
6198
- };
6400
+ "application/json": components["schemas"]["FrontendL2FOrderRequest"];
6199
6401
  };
6200
6402
  };
6201
6403
  responses: {
6202
- /** @description Comment saved */
6404
+ /** @description FPS withdrawal created */
6203
6405
  200: {
6204
6406
  headers: {
6205
6407
  [name: string]: unknown;
@@ -6212,7 +6414,7 @@ export interface paths {
6212
6414
  };
6213
6415
  };
6214
6416
  };
6215
- /** @description Validation error (e.g. comment too long) */
6417
+ /** @description Validation error */
6216
6418
  400: {
6217
6419
  headers: {
6218
6420
  [name: string]: unknown;
@@ -6221,7 +6423,16 @@ export interface paths {
6221
6423
  "application/json": components["schemas"]["ErrorResponse"];
6222
6424
  };
6223
6425
  };
6224
- /** @description Access denied (insufficient wallet role / wrong wallet) */
6426
+ /** @description Authentication required */
6427
+ 401: {
6428
+ headers: {
6429
+ [name: string]: unknown;
6430
+ };
6431
+ content: {
6432
+ "application/json": components["schemas"]["ErrorResponse"];
6433
+ };
6434
+ };
6435
+ /** @description Caller is not an admin of the source wallet */
6225
6436
  403: {
6226
6437
  headers: {
6227
6438
  [name: string]: unknown;
@@ -6230,8 +6441,8 @@ export interface paths {
6230
6441
  "application/json": components["schemas"]["ErrorResponse"];
6231
6442
  };
6232
6443
  };
6233
- /** @description Order not found */
6234
- 404: {
6444
+ /** @description Rate limit exceeded */
6445
+ 429: {
6235
6446
  headers: {
6236
6447
  [name: string]: unknown;
6237
6448
  };
@@ -6241,138 +6452,190 @@ export interface paths {
6241
6452
  };
6242
6453
  };
6243
6454
  };
6244
- post?: never;
6245
6455
  delete?: never;
6246
6456
  options?: never;
6247
6457
  head?: never;
6248
6458
  patch?: never;
6249
6459
  trace?: never;
6250
6460
  };
6251
- "/frontend/orders/types": {
6461
+ "/frontend/orders/{order_id}/approve": {
6252
6462
  parameters: {
6253
6463
  query?: never;
6254
6464
  header?: never;
6255
6465
  path?: never;
6256
6466
  cookie?: never;
6257
6467
  };
6468
+ get?: never;
6469
+ put?: never;
6258
6470
  /**
6259
- * List order types
6260
- * @description Retrieves a list of available order types for the tenant.
6261
- *
6262
- * **Authentication**: Bearer token with x-tenant-id header required
6471
+ * Approve an order
6472
+ * @description Moves a NEW order to PROCESSING: checks the balance, debits the funds
6473
+ * (transaction written as `complete`) and triggers its workflow.
6474
+ * Exchange orders (EXCHANGE_OMNI) and internal transfers
6475
+ * (TRANSFER_INTERNAL / OMNIBUS_INTERNAL_TRANSFER) settle synchronously
6476
+ * and land in COMPLETE. An insufficient balance fails the order
6477
+ * (FAILED). OTP verification is mandatory and keyed on the order id
6478
+ * (request the OTP for the order being approved). Orders created with
6479
+ * `scheduled_at` move to EXPECTED instead — no funds are debited until
6480
+ * execution at the requested time.
6263
6481
  *
6264
6482
  */
6265
- get: {
6483
+ post: {
6266
6484
  parameters: {
6267
6485
  query?: never;
6268
6486
  header?: never;
6269
- path?: never;
6487
+ path: {
6488
+ order_id: string;
6489
+ };
6270
6490
  cookie?: never;
6271
6491
  };
6272
- requestBody?: never;
6492
+ requestBody: {
6493
+ content: {
6494
+ "application/json": {
6495
+ /** Format: uuid */
6496
+ wallet_id: string;
6497
+ };
6498
+ };
6499
+ };
6273
6500
  responses: {
6274
- /** @description List of available order types */
6501
+ /** @description Order moved to PROCESSING */
6275
6502
  200: {
6276
6503
  headers: {
6277
6504
  [name: string]: unknown;
6278
6505
  };
6279
- content?: never;
6506
+ content: {
6507
+ "application/json": {
6508
+ /** @example true */
6509
+ success?: boolean;
6510
+ data?: components["schemas"]["Order"];
6511
+ };
6512
+ };
6513
+ };
6514
+ /** @description Order is not in an approvable state */
6515
+ 409: {
6516
+ headers: {
6517
+ [name: string]: unknown;
6518
+ };
6519
+ content: {
6520
+ "application/json": components["schemas"]["ErrorResponse"];
6521
+ };
6280
6522
  };
6281
6523
  };
6282
6524
  };
6283
- put?: never;
6284
- post?: never;
6285
6525
  delete?: never;
6286
6526
  options?: never;
6287
6527
  head?: never;
6288
6528
  patch?: never;
6289
6529
  trace?: never;
6290
6530
  };
6291
- "/frontend/orders/types/{id}": {
6531
+ "/frontend/orders/{order_id}/cancel": {
6292
6532
  parameters: {
6293
6533
  query?: never;
6294
6534
  header?: never;
6295
6535
  path?: never;
6296
6536
  cookie?: never;
6297
6537
  };
6538
+ get?: never;
6539
+ put?: never;
6298
6540
  /**
6299
- * Get order type
6300
- * @description Retrieves details of a specific order type by ID.
6301
- *
6302
- * **Authentication**: Bearer token with x-tenant-id header required
6541
+ * Cancel an order
6542
+ * @description Cancels a NEW or EXPECTED order and cancels its workflow run. Neither
6543
+ * status holds debited funds, so cancel never moves money.
6544
+ * BREAKING CHANGE (2026-07-26): FAILED is no longer cancelable and returns
6545
+ * 409. Paying back an order that was debited and then failed is now a
6546
+ * separate, admin-panel-only refund action.
6303
6547
  *
6304
6548
  */
6305
- get: {
6549
+ post: {
6306
6550
  parameters: {
6307
6551
  query?: never;
6308
6552
  header?: never;
6309
6553
  path: {
6310
- id: string;
6554
+ order_id: string;
6311
6555
  };
6312
6556
  cookie?: never;
6313
6557
  };
6314
- requestBody?: never;
6558
+ requestBody: {
6559
+ content: {
6560
+ "application/json": {
6561
+ /** Format: uuid */
6562
+ wallet_id: string;
6563
+ reason?: string;
6564
+ };
6565
+ };
6566
+ };
6315
6567
  responses: {
6316
- /** @description Order type details */
6568
+ /** @description Order canceled (no balance change) */
6317
6569
  200: {
6318
6570
  headers: {
6319
6571
  [name: string]: unknown;
6320
6572
  };
6321
- content?: never;
6573
+ content: {
6574
+ "application/json": {
6575
+ /** @example true */
6576
+ success?: boolean;
6577
+ data?: components["schemas"]["Order"];
6578
+ };
6579
+ };
6322
6580
  };
6323
- /** @description Order type not found */
6324
- 404: {
6581
+ /** @description Order is not in a cancelable state */
6582
+ 409: {
6325
6583
  headers: {
6326
6584
  [name: string]: unknown;
6327
6585
  };
6328
- content?: never;
6586
+ content: {
6587
+ "application/json": components["schemas"]["ErrorResponse"];
6588
+ };
6329
6589
  };
6330
6590
  };
6331
6591
  };
6332
- put?: never;
6333
- post?: never;
6334
6592
  delete?: never;
6335
6593
  options?: never;
6336
6594
  head?: never;
6337
6595
  patch?: never;
6338
6596
  trace?: never;
6339
6597
  };
6340
- "/frontend/orders/calc": {
6598
+ "/frontend/orders/{order_id}/comment": {
6341
6599
  parameters: {
6342
6600
  query?: never;
6343
6601
  header?: never;
6344
6602
  path?: never;
6345
6603
  cookie?: never;
6346
6604
  };
6605
+ get?: never;
6347
6606
  /**
6348
- * Calculate order
6349
- * @description Pre-calculates order amounts, fees and exchange rates without creating an order.
6607
+ * Set or clear an order's comment
6608
+ * @description Saves (or edits) a single free-text comment attached to an order
6609
+ * (incoming or outgoing). Useful for noting who an incoming crypto deposit
6610
+ * came from. Send `comment: null` or an empty string to clear it.
6350
6611
  *
6351
- * **Authentication**: Bearer token with x-tenant-id header required
6612
+ * The response includes the saved `comment` plus audit metadata
6613
+ * (`comment_updated_by` = editor's user_data uuid, `comment_updated_at`).
6614
+ *
6615
+ * **Access Control**: caller must be `admin` or `owner` of the order's wallet.
6352
6616
  *
6353
6617
  */
6354
- get: {
6618
+ put: {
6355
6619
  parameters: {
6356
- query: {
6357
- order_type: components["schemas"]["OrderTypeId"];
6358
- amount: number;
6359
- from_currency_id: string;
6360
- to_currency_id: string;
6361
- /** @description If `true`, calculates inputs needed to receive the given amount. */
6362
- is_reverse: boolean;
6363
- /** @description If `true`, the network fee is subtracted from `result_amount`. If `false`, the fee is added on top of `from_amount` and the recipient gets the full converted amount. Ignored for reverse calculations. Required so the client always states the fee-allocation mode explicitly — a change of the server-side fallback can never silently alter the calculation.
6364
- * */
6365
- is_subtract: boolean;
6366
- /** @description Destination address (for crypto withdrawals; affects network fee estimation). */
6367
- to_address?: string;
6368
- };
6620
+ query?: never;
6369
6621
  header?: never;
6370
- path?: never;
6622
+ path: {
6623
+ order_id: string;
6624
+ };
6371
6625
  cookie?: never;
6372
6626
  };
6373
- requestBody?: never;
6627
+ requestBody: {
6628
+ content: {
6629
+ "application/json": {
6630
+ /** Format: uuid */
6631
+ wallet_id: string;
6632
+ /** @description Comment text. `null` or empty clears the comment. */
6633
+ comment?: string | null;
6634
+ };
6635
+ };
6636
+ };
6374
6637
  responses: {
6375
- /** @description Calculated order details */
6638
+ /** @description Comment saved */
6376
6639
  200: {
6377
6640
  headers: {
6378
6641
  [name: string]: unknown;
@@ -6380,12 +6643,12 @@ export interface paths {
6380
6643
  content: {
6381
6644
  "application/json": {
6382
6645
  /** @example true */
6383
- success: boolean;
6384
- data: components["schemas"]["OrderCalculation"];
6646
+ success?: boolean;
6647
+ data?: components["schemas"]["Order"];
6385
6648
  };
6386
6649
  };
6387
6650
  };
6388
- /** @description Invalid request (e.g. unknown `order_type`, missing required parameter, exchange rate not found) */
6651
+ /** @description Validation error (e.g. comment too long) */
6389
6652
  400: {
6390
6653
  headers: {
6391
6654
  [name: string]: unknown;
@@ -6394,8 +6657,8 @@ export interface paths {
6394
6657
  "application/json": components["schemas"]["ErrorResponse"];
6395
6658
  };
6396
6659
  };
6397
- /** @description Calculation failed (e.g. network fee estimation error) */
6398
- 500: {
6660
+ /** @description Access denied (insufficient wallet role / wrong wallet) */
6661
+ 403: {
6399
6662
  headers: {
6400
6663
  [name: string]: unknown;
6401
6664
  };
@@ -6403,78 +6666,17 @@ export interface paths {
6403
6666
  "application/json": components["schemas"]["ErrorResponse"];
6404
6667
  };
6405
6668
  };
6406
- };
6407
- };
6408
- put?: never;
6409
- post?: never;
6410
- delete?: never;
6411
- options?: never;
6412
- head?: never;
6413
- patch?: never;
6414
- trace?: never;
6415
- };
6416
- "/frontend/orders/wallet/{wallet_uuid}": {
6417
- parameters: {
6418
- query?: never;
6419
- header?: never;
6420
- path?: never;
6421
- cookie?: never;
6422
- };
6423
- /**
6424
- * List orders
6425
- * @description Retrieves a paginated list of orders for a specific wallet.
6426
- *
6427
- * **Authentication**: Bearer token with x-tenant-id header required
6428
- *
6429
- * **Access Control**: User must have access to the wallet
6430
- *
6431
- */
6432
- get: {
6433
- parameters: {
6434
- query?: {
6435
- offset?: number;
6436
- limit?: number;
6437
- sort_by?: string;
6438
- sort_order?: "asc" | "desc";
6439
- /** @description JSON-encoded filters */
6440
- filters?: string;
6441
- date_from?: string;
6442
- date_to?: string;
6443
- /** @description If `true`, includes dust orders (amount below render threshold for either currency). Defaults to `false` — dust orders are hidden. */
6444
- show_low_balance?: "true" | "false";
6445
- };
6446
- header?: never;
6447
- path: {
6448
- wallet_uuid: string;
6449
- };
6450
- cookie?: never;
6451
- };
6452
- requestBody?: never;
6453
- responses: {
6454
- /** @description List of orders */
6455
- 200: {
6669
+ /** @description Order not found */
6670
+ 404: {
6456
6671
  headers: {
6457
6672
  [name: string]: unknown;
6458
6673
  };
6459
6674
  content: {
6460
- "application/json": {
6461
- /** @example true */
6462
- success: boolean;
6463
- data: components["schemas"]["Order"][];
6464
- pagination: components["schemas"]["PaginationResponse"];
6465
- };
6466
- };
6467
- };
6468
- /** @description Access denied to wallet */
6469
- 403: {
6470
- headers: {
6471
- [name: string]: unknown;
6675
+ "application/json": components["schemas"]["ErrorResponse"];
6472
6676
  };
6473
- content?: never;
6474
6677
  };
6475
6678
  };
6476
6679
  };
6477
- put?: never;
6478
6680
  post?: never;
6479
6681
  delete?: never;
6480
6682
  options?: never;
@@ -6482,7 +6684,7 @@ export interface paths {
6482
6684
  patch?: never;
6483
6685
  trace?: never;
6484
6686
  };
6485
- "/frontend/orders/wallet/{wallet_uuid}/csv": {
6687
+ "/frontend/orders/types": {
6486
6688
  parameters: {
6487
6689
  query?: never;
6488
6690
  header?: never;
@@ -6490,43 +6692,23 @@ export interface paths {
6490
6692
  cookie?: never;
6491
6693
  };
6492
6694
  /**
6493
- * Export orders
6494
- * @description Exports orders for a specific wallet as a CSV file.
6695
+ * List order types
6696
+ * @description Retrieves a list of available order types for the tenant.
6495
6697
  *
6496
6698
  * **Authentication**: Bearer token with x-tenant-id header required
6497
6699
  *
6498
- * **Access Control**: User must have access to the wallet
6499
- *
6500
6700
  */
6501
6701
  get: {
6502
6702
  parameters: {
6503
- query?: {
6504
- date_from?: string;
6505
- date_to?: string;
6506
- /** @description JSON-encoded filters */
6507
- filters?: string;
6508
- /** @description If `true`, includes dust orders (amount below render threshold for either currency). Defaults to `false` — dust orders are hidden. */
6509
- show_low_balance?: "true" | "false";
6510
- };
6703
+ query?: never;
6511
6704
  header?: never;
6512
- path: {
6513
- wallet_uuid: string;
6514
- };
6705
+ path?: never;
6515
6706
  cookie?: never;
6516
6707
  };
6517
6708
  requestBody?: never;
6518
6709
  responses: {
6519
- /** @description CSV file download */
6710
+ /** @description List of available order types */
6520
6711
  200: {
6521
- headers: {
6522
- [name: string]: unknown;
6523
- };
6524
- content: {
6525
- "text/csv": string;
6526
- };
6527
- };
6528
- /** @description Access denied to wallet */
6529
- 403: {
6530
6712
  headers: {
6531
6713
  [name: string]: unknown;
6532
6714
  };
@@ -6542,7 +6724,7 @@ export interface paths {
6542
6724
  patch?: never;
6543
6725
  trace?: never;
6544
6726
  };
6545
- "/frontend/orders/id/{order_id}": {
6727
+ "/frontend/orders/types/{id}": {
6546
6728
  parameters: {
6547
6729
  query?: never;
6548
6730
  header?: never;
@@ -6550,8 +6732,8 @@ export interface paths {
6550
6732
  cookie?: never;
6551
6733
  };
6552
6734
  /**
6553
- * Get order
6554
- * @description Retrieves a specific order by its numeric ID.
6735
+ * Get order type
6736
+ * @description Retrieves details of a specific order type by ID.
6555
6737
  *
6556
6738
  * **Authentication**: Bearer token with x-tenant-id header required
6557
6739
  *
@@ -6561,26 +6743,20 @@ export interface paths {
6561
6743
  query?: never;
6562
6744
  header?: never;
6563
6745
  path: {
6564
- order_id: number;
6746
+ id: string;
6565
6747
  };
6566
6748
  cookie?: never;
6567
6749
  };
6568
6750
  requestBody?: never;
6569
6751
  responses: {
6570
- /** @description Order details */
6752
+ /** @description Order type details */
6571
6753
  200: {
6572
6754
  headers: {
6573
6755
  [name: string]: unknown;
6574
6756
  };
6575
- content: {
6576
- "application/json": {
6577
- /** @example true */
6578
- success: boolean;
6579
- data: components["schemas"]["OrderDetail"];
6580
- };
6581
- };
6757
+ content?: never;
6582
6758
  };
6583
- /** @description Order not found */
6759
+ /** @description Order type not found */
6584
6760
  404: {
6585
6761
  headers: {
6586
6762
  [name: string]: unknown;
@@ -6597,7 +6773,7 @@ export interface paths {
6597
6773
  patch?: never;
6598
6774
  trace?: never;
6599
6775
  };
6600
- "/frontend/orders/uuid/{order_uuid}": {
6776
+ "/frontend/orders/calc": {
6601
6777
  parameters: {
6602
6778
  query?: never;
6603
6779
  header?: never;
@@ -6605,24 +6781,34 @@ export interface paths {
6605
6781
  cookie?: never;
6606
6782
  };
6607
6783
  /**
6608
- * Get order by UUID
6609
- * @description Retrieves a specific order by its UUID.
6784
+ * Calculate order
6785
+ * @description Pre-calculates order amounts, fees and exchange rates without creating an order.
6610
6786
  *
6611
6787
  * **Authentication**: Bearer token with x-tenant-id header required
6612
6788
  *
6613
6789
  */
6614
6790
  get: {
6615
6791
  parameters: {
6616
- query?: never;
6617
- header?: never;
6618
- path: {
6619
- order_uuid: string;
6792
+ query: {
6793
+ order_type: components["schemas"]["OrderTypeId"];
6794
+ amount: number;
6795
+ from_currency_id: string;
6796
+ to_currency_id: string;
6797
+ /** @description If `true`, calculates inputs needed to receive the given amount. */
6798
+ is_reverse: boolean;
6799
+ /** @description If `true`, the network fee is subtracted from `result_amount`. If `false`, the fee is added on top of `from_amount` and the recipient gets the full converted amount. Ignored for reverse calculations. Required so the client always states the fee-allocation mode explicitly — a change of the server-side fallback can never silently alter the calculation.
6800
+ * */
6801
+ is_subtract: boolean;
6802
+ /** @description Destination address (for crypto withdrawals; affects network fee estimation). */
6803
+ to_address?: string;
6620
6804
  };
6805
+ header?: never;
6806
+ path?: never;
6621
6807
  cookie?: never;
6622
6808
  };
6623
6809
  requestBody?: never;
6624
6810
  responses: {
6625
- /** @description Order details */
6811
+ /** @description Calculated order details */
6626
6812
  200: {
6627
6813
  headers: {
6628
6814
  [name: string]: unknown;
@@ -6631,16 +6817,27 @@ export interface paths {
6631
6817
  "application/json": {
6632
6818
  /** @example true */
6633
6819
  success: boolean;
6634
- data: components["schemas"]["OrderDetail"];
6820
+ data: components["schemas"]["OrderCalculation"];
6635
6821
  };
6636
6822
  };
6637
6823
  };
6638
- /** @description Order not found */
6639
- 404: {
6824
+ /** @description Invalid request (e.g. unknown `order_type`, missing required parameter, exchange rate not found) */
6825
+ 400: {
6640
6826
  headers: {
6641
6827
  [name: string]: unknown;
6642
6828
  };
6643
- content?: never;
6829
+ content: {
6830
+ "application/json": components["schemas"]["ErrorResponse"];
6831
+ };
6832
+ };
6833
+ /** @description Calculation failed (e.g. network fee estimation error) */
6834
+ 500: {
6835
+ headers: {
6836
+ [name: string]: unknown;
6837
+ };
6838
+ content: {
6839
+ "application/json": components["schemas"]["ErrorResponse"];
6840
+ };
6644
6841
  };
6645
6842
  };
6646
6843
  };
@@ -6652,103 +6849,60 @@ export interface paths {
6652
6849
  patch?: never;
6653
6850
  trace?: never;
6654
6851
  };
6655
- "/frontend/orders/TRANSFER_INTERNAL": {
6852
+ "/frontend/orders/wallet/{wallet_uuid}": {
6656
6853
  parameters: {
6657
6854
  query?: never;
6658
6855
  header?: never;
6659
6856
  path?: never;
6660
6857
  cookie?: never;
6661
6858
  };
6662
- get?: never;
6663
- put?: never;
6664
6859
  /**
6665
- * Create internal transfer
6666
- * @description Creates an internal transfer between wallets.
6860
+ * List orders
6861
+ * @description Retrieves a paginated list of orders for a specific wallet.
6667
6862
  *
6668
6863
  * **Authentication**: Bearer token with x-tenant-id header required
6669
6864
  *
6670
- * **Access Control**: User must be admin of the source wallet
6865
+ * **Access Control**: User must have access to the wallet
6671
6866
  *
6672
6867
  */
6673
- post: {
6868
+ get: {
6674
6869
  parameters: {
6675
- query?: never;
6870
+ query?: {
6871
+ offset?: number;
6872
+ limit?: number;
6873
+ sort_by?: string;
6874
+ sort_order?: "asc" | "desc";
6875
+ /** @description JSON-encoded filters */
6876
+ filters?: string;
6877
+ date_from?: string;
6878
+ date_to?: string;
6879
+ /** @description If `true`, includes dust orders (amount below render threshold for either currency). Defaults to `false` — dust orders are hidden. */
6880
+ show_low_balance?: "true" | "false";
6881
+ };
6676
6882
  header?: never;
6677
- path?: never;
6678
- cookie?: never;
6679
- };
6680
- requestBody: {
6681
- content: {
6682
- "application/json": {
6683
- /** Format: uuid */
6684
- wallet_id: string;
6685
- /** Format: uuid */
6686
- from_currency_id: string;
6687
- /**
6688
- * Format: uuid
6689
- * @description Receiver — a counterparty destination of type INTERNAL (points at the target wallet)
6690
- */
6691
- counterparty_destination_id: string;
6692
- amount: number;
6693
- request_id: string;
6694
- };
6883
+ path: {
6884
+ wallet_uuid: string;
6695
6885
  };
6886
+ cookie?: never;
6696
6887
  };
6888
+ requestBody?: never;
6697
6889
  responses: {
6698
- /** @description Order created */
6890
+ /** @description List of orders */
6699
6891
  200: {
6700
6892
  headers: {
6701
6893
  [name: string]: unknown;
6702
6894
  };
6703
- content?: never;
6704
- };
6705
- /** @description Access denied */
6706
- 403: {
6707
- headers: {
6708
- [name: string]: unknown;
6709
- };
6710
- content?: never;
6711
- };
6712
- /** @description Rate limit exceeded */
6713
- 429: {
6714
- headers: {
6715
- [name: string]: unknown;
6895
+ content: {
6896
+ "application/json": {
6897
+ /** @example true */
6898
+ success: boolean;
6899
+ data: components["schemas"]["Order"][];
6900
+ pagination: components["schemas"]["PaginationResponse"];
6901
+ };
6716
6902
  };
6717
- content?: never;
6718
- };
6719
- };
6720
- };
6721
- delete?: never;
6722
- options?: never;
6723
- head?: never;
6724
- patch?: never;
6725
- trace?: never;
6726
- };
6727
- "/frontend/orders/OMNIBUS_CRYPTO_TRANSFER": {
6728
- parameters: {
6729
- query?: never;
6730
- header?: never;
6731
- path?: never;
6732
- cookie?: never;
6733
- };
6734
- get?: never;
6735
- put?: never;
6736
- /** Create omnibus crypto transfer */
6737
- post: {
6738
- parameters: {
6739
- query?: never;
6740
- header?: never;
6741
- path?: never;
6742
- cookie?: never;
6743
- };
6744
- requestBody: {
6745
- content: {
6746
- "application/json": components["schemas"]["FrontendCryptoTransferRequest"];
6747
6903
  };
6748
- };
6749
- responses: {
6750
- /** @description Order created */
6751
- 200: {
6904
+ /** @description Access denied to wallet */
6905
+ 403: {
6752
6906
  headers: {
6753
6907
  [name: string]: unknown;
6754
6908
  };
@@ -6756,37 +6910,59 @@ export interface paths {
6756
6910
  };
6757
6911
  };
6758
6912
  };
6913
+ put?: never;
6914
+ post?: never;
6759
6915
  delete?: never;
6760
6916
  options?: never;
6761
6917
  head?: never;
6762
6918
  patch?: never;
6763
6919
  trace?: never;
6764
6920
  };
6765
- "/frontend/orders/SEGREGATED_CRYPTO_TRANSFER": {
6921
+ "/frontend/orders/wallet/{wallet_uuid}/csv": {
6766
6922
  parameters: {
6767
6923
  query?: never;
6768
6924
  header?: never;
6769
6925
  path?: never;
6770
6926
  cookie?: never;
6771
6927
  };
6772
- get?: never;
6773
- put?: never;
6774
- /** Create segregated crypto transfer */
6775
- post: {
6928
+ /**
6929
+ * Export orders
6930
+ * @description Exports orders for a specific wallet as a CSV file.
6931
+ *
6932
+ * **Authentication**: Bearer token with x-tenant-id header required
6933
+ *
6934
+ * **Access Control**: User must have access to the wallet
6935
+ *
6936
+ */
6937
+ get: {
6776
6938
  parameters: {
6777
- query?: never;
6939
+ query?: {
6940
+ date_from?: string;
6941
+ date_to?: string;
6942
+ /** @description JSON-encoded filters */
6943
+ filters?: string;
6944
+ /** @description If `true`, includes dust orders (amount below render threshold for either currency). Defaults to `false` — dust orders are hidden. */
6945
+ show_low_balance?: "true" | "false";
6946
+ };
6778
6947
  header?: never;
6779
- path?: never;
6780
- cookie?: never;
6781
- };
6782
- requestBody: {
6783
- content: {
6784
- "application/json": components["schemas"]["FrontendCryptoTransferRequest"];
6948
+ path: {
6949
+ wallet_uuid: string;
6785
6950
  };
6951
+ cookie?: never;
6786
6952
  };
6953
+ requestBody?: never;
6787
6954
  responses: {
6788
- /** @description Order created */
6955
+ /** @description CSV file download */
6789
6956
  200: {
6957
+ headers: {
6958
+ [name: string]: unknown;
6959
+ };
6960
+ content: {
6961
+ "text/csv": string;
6962
+ };
6963
+ };
6964
+ /** @description Access denied to wallet */
6965
+ 403: {
6790
6966
  headers: {
6791
6967
  [name: string]: unknown;
6792
6968
  };
@@ -6794,37 +6970,54 @@ export interface paths {
6794
6970
  };
6795
6971
  };
6796
6972
  };
6973
+ put?: never;
6974
+ post?: never;
6797
6975
  delete?: never;
6798
6976
  options?: never;
6799
6977
  head?: never;
6800
6978
  patch?: never;
6801
6979
  trace?: never;
6802
6980
  };
6803
- "/frontend/orders/L2F_WIRE_OFFRAMP": {
6981
+ "/frontend/orders/id/{order_id}": {
6804
6982
  parameters: {
6805
6983
  query?: never;
6806
6984
  header?: never;
6807
6985
  path?: never;
6808
6986
  cookie?: never;
6809
6987
  };
6810
- get?: never;
6811
- put?: never;
6812
- /** Create wire offramp */
6813
- post: {
6988
+ /**
6989
+ * Get order
6990
+ * @description Retrieves a specific order by its numeric ID.
6991
+ *
6992
+ * **Authentication**: Bearer token with x-tenant-id header required
6993
+ *
6994
+ */
6995
+ get: {
6814
6996
  parameters: {
6815
6997
  query?: never;
6816
6998
  header?: never;
6817
- path?: never;
6818
- cookie?: never;
6819
- };
6820
- requestBody: {
6821
- content: {
6822
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
6999
+ path: {
7000
+ order_id: number;
6823
7001
  };
7002
+ cookie?: never;
6824
7003
  };
7004
+ requestBody?: never;
6825
7005
  responses: {
6826
- /** @description Order created */
7006
+ /** @description Order details */
6827
7007
  200: {
7008
+ headers: {
7009
+ [name: string]: unknown;
7010
+ };
7011
+ content: {
7012
+ "application/json": {
7013
+ /** @example true */
7014
+ success: boolean;
7015
+ data: components["schemas"]["OrderDetail"];
7016
+ };
7017
+ };
7018
+ };
7019
+ /** @description Order not found */
7020
+ 404: {
6828
7021
  headers: {
6829
7022
  [name: string]: unknown;
6830
7023
  };
@@ -6832,37 +7025,54 @@ export interface paths {
6832
7025
  };
6833
7026
  };
6834
7027
  };
7028
+ put?: never;
7029
+ post?: never;
6835
7030
  delete?: never;
6836
7031
  options?: never;
6837
7032
  head?: never;
6838
7033
  patch?: never;
6839
7034
  trace?: never;
6840
7035
  };
6841
- "/frontend/orders/L2F_ACH_OFFRAMP": {
7036
+ "/frontend/orders/uuid/{order_uuid}": {
6842
7037
  parameters: {
6843
7038
  query?: never;
6844
7039
  header?: never;
6845
7040
  path?: never;
6846
7041
  cookie?: never;
6847
7042
  };
6848
- get?: never;
6849
- put?: never;
6850
- /** Create ACH offramp */
6851
- post: {
7043
+ /**
7044
+ * Get order by UUID
7045
+ * @description Retrieves a specific order by its UUID.
7046
+ *
7047
+ * **Authentication**: Bearer token with x-tenant-id header required
7048
+ *
7049
+ */
7050
+ get: {
6852
7051
  parameters: {
6853
7052
  query?: never;
6854
7053
  header?: never;
6855
- path?: never;
6856
- cookie?: never;
6857
- };
6858
- requestBody: {
6859
- content: {
6860
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
7054
+ path: {
7055
+ order_uuid: string;
6861
7056
  };
7057
+ cookie?: never;
6862
7058
  };
7059
+ requestBody?: never;
6863
7060
  responses: {
6864
- /** @description Order created */
7061
+ /** @description Order details */
6865
7062
  200: {
7063
+ headers: {
7064
+ [name: string]: unknown;
7065
+ };
7066
+ content: {
7067
+ "application/json": {
7068
+ /** @example true */
7069
+ success: boolean;
7070
+ data: components["schemas"]["OrderDetail"];
7071
+ };
7072
+ };
7073
+ };
7074
+ /** @description Order not found */
7075
+ 404: {
6866
7076
  headers: {
6867
7077
  [name: string]: unknown;
6868
7078
  };
@@ -6870,13 +7080,15 @@ export interface paths {
6870
7080
  };
6871
7081
  };
6872
7082
  };
7083
+ put?: never;
7084
+ post?: never;
6873
7085
  delete?: never;
6874
7086
  options?: never;
6875
7087
  head?: never;
6876
7088
  patch?: never;
6877
7089
  trace?: never;
6878
7090
  };
6879
- "/frontend/orders/L2F_SEPA_OFFRAMP": {
7091
+ "/frontend/orders/TRANSFER_INTERNAL": {
6880
7092
  parameters: {
6881
7093
  query?: never;
6882
7094
  header?: never;
@@ -6885,7 +7097,15 @@ export interface paths {
6885
7097
  };
6886
7098
  get?: never;
6887
7099
  put?: never;
6888
- /** Create SEPA offramp */
7100
+ /**
7101
+ * Create internal transfer
7102
+ * @description Creates an internal transfer between wallets.
7103
+ *
7104
+ * **Authentication**: Bearer token with x-tenant-id header required
7105
+ *
7106
+ * **Access Control**: User must be admin of the source wallet
7107
+ *
7108
+ */
6889
7109
  post: {
6890
7110
  parameters: {
6891
7111
  query?: never;
@@ -6895,7 +7115,19 @@ export interface paths {
6895
7115
  };
6896
7116
  requestBody: {
6897
7117
  content: {
6898
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
7118
+ "application/json": {
7119
+ /** Format: uuid */
7120
+ wallet_id: string;
7121
+ /** Format: uuid */
7122
+ from_currency_id: string;
7123
+ /**
7124
+ * Format: uuid
7125
+ * @description Receiver — a counterparty destination of type INTERNAL (points at the target wallet)
7126
+ */
7127
+ counterparty_destination_id: string;
7128
+ amount: number;
7129
+ request_id: string;
7130
+ };
6899
7131
  };
6900
7132
  };
6901
7133
  responses: {
@@ -6906,39 +7138,15 @@ export interface paths {
6906
7138
  };
6907
7139
  content?: never;
6908
7140
  };
6909
- };
6910
- };
6911
- delete?: never;
6912
- options?: never;
6913
- head?: never;
6914
- patch?: never;
6915
- trace?: never;
6916
- };
6917
- "/frontend/orders/L2F_SWIFT_OFFRAMP": {
6918
- parameters: {
6919
- query?: never;
6920
- header?: never;
6921
- path?: never;
6922
- cookie?: never;
6923
- };
6924
- get?: never;
6925
- put?: never;
6926
- /** Create SWIFT offramp */
6927
- post: {
6928
- parameters: {
6929
- query?: never;
6930
- header?: never;
6931
- path?: never;
6932
- cookie?: never;
6933
- };
6934
- requestBody: {
6935
- content: {
6936
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
7141
+ /** @description Access denied */
7142
+ 403: {
7143
+ headers: {
7144
+ [name: string]: unknown;
7145
+ };
7146
+ content?: never;
6937
7147
  };
6938
- };
6939
- responses: {
6940
- /** @description Order created */
6941
- 200: {
7148
+ /** @description Rate limit exceeded */
7149
+ 429: {
6942
7150
  headers: {
6943
7151
  [name: string]: unknown;
6944
7152
  };
@@ -6952,7 +7160,7 @@ export interface paths {
6952
7160
  patch?: never;
6953
7161
  trace?: never;
6954
7162
  };
6955
- "/frontend/orders/L2F_CHAPS_OFFRAMP": {
7163
+ "/frontend/orders/OMNIBUS_CRYPTO_TRANSFER": {
6956
7164
  parameters: {
6957
7165
  query?: never;
6958
7166
  header?: never;
@@ -6961,7 +7169,7 @@ export interface paths {
6961
7169
  };
6962
7170
  get?: never;
6963
7171
  put?: never;
6964
- /** Create CHAPS offramp */
7172
+ /** Create omnibus crypto transfer */
6965
7173
  post: {
6966
7174
  parameters: {
6967
7175
  query?: never;
@@ -6971,7 +7179,7 @@ export interface paths {
6971
7179
  };
6972
7180
  requestBody: {
6973
7181
  content: {
6974
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
7182
+ "application/json": components["schemas"]["FrontendCryptoTransferRequest"];
6975
7183
  };
6976
7184
  };
6977
7185
  responses: {
@@ -6990,7 +7198,7 @@ export interface paths {
6990
7198
  patch?: never;
6991
7199
  trace?: never;
6992
7200
  };
6993
- "/frontend/orders/L2F_FPS_OFFRAMP": {
7201
+ "/frontend/orders/SEGREGATED_CRYPTO_TRANSFER": {
6994
7202
  parameters: {
6995
7203
  query?: never;
6996
7204
  header?: never;
@@ -6999,7 +7207,7 @@ export interface paths {
6999
7207
  };
7000
7208
  get?: never;
7001
7209
  put?: never;
7002
- /** Create FPS offramp */
7210
+ /** Create segregated crypto transfer */
7003
7211
  post: {
7004
7212
  parameters: {
7005
7213
  query?: never;
@@ -7009,7 +7217,7 @@ export interface paths {
7009
7217
  };
7010
7218
  requestBody: {
7011
7219
  content: {
7012
- "application/json": components["schemas"]["FrontendL2FOrderRequest"];
7220
+ "application/json": components["schemas"]["FrontendCryptoTransferRequest"];
7013
7221
  };
7014
7222
  };
7015
7223
  responses: {
@@ -10435,7 +10643,7 @@ export interface components {
10435
10643
  * @example EXCHANGE_OMNI
10436
10644
  * @enum {string}
10437
10645
  */
10438
- 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" | "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";
10646
+ 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" | "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";
10439
10647
  OrderCalculation: {
10440
10648
  /**
10441
10649
  * Format: uuid
@@ -10629,11 +10837,11 @@ export interface components {
10629
10837
  */
10630
10838
  target_wallet_id: string | null;
10631
10839
  };
10632
- /** @description Bank postal address resolved from the bank identifier. Intentionally mirrors the CounterpartyBankingAddress shape so the payload can prefill a counterparty form as-is. */
10840
+ /** @description Registered bank address. `country_id`/`state_id` reference the `countries`/`states` dictionaries served by this API, so the payload can prefill a counterparty form as-is. */
10633
10841
  BankDataAddress: {
10634
10842
  /** @description Resolved `countries.id` of the bank’s country; null when it could not be resolved */
10635
10843
  country_id: number | null;
10636
- /** @description Always null today (reserved for future enrichment) */
10844
+ /** @description Resolved `states.id`; populated for US banks when available, null otherwise */
10637
10845
  state_id: number | null;
10638
10846
  city: string | null;
10639
10847
  postcode: string | null;
@@ -10641,46 +10849,28 @@ export interface components {
10641
10849
  street1: string | null;
10642
10850
  /** @description Always null today (reserved) */
10643
10851
  street2: string | null;
10644
- /** @description Always null today (reserved) */
10645
- description: string | null;
10646
10852
  };
10647
10853
  /**
10648
- * @description Normalised bank data resolved from a bank identifier. Which identifier fields are populated depends on the looked-up code type: IBAN `iban` + `swift_bic` (plus `account_number`/`sort_code` for GB IBANs), SWIFT/BIC `swift_bic`, US RTN → `routing_number`; identifier fields not applicable to the code type are null. `bank_name` and `address` are populated for every code type whenever they are available.
10854
+ * @description A bank matched by the looked-up code. The list holds at most one element today (full-code match; prefix search is not supported).
10649
10855
  * @example {
10650
- * "account_number": "31926819",
10651
- * "bank_name": "NATIONAL WESTMINSTER BANK PLC",
10652
- * "note": null,
10653
- * "routing_number": null,
10654
- * "swift_bic": "NWBKGB2LXXX",
10655
- * "iban": "GB29NWBK60161331926819",
10656
- * "sort_code": "601613",
10856
+ * "bank_name": "JPMORGAN CHASE BANK, NA",
10857
+ * "code": "021000021",
10657
10858
  * "address": {
10658
- * "country_id": 230,
10659
- * "state_id": null,
10660
- * "city": "London",
10859
+ * "country_id": 233,
10860
+ * "state_id": 1452,
10861
+ * "city": "NEW YORK",
10661
10862
  * "postcode": null,
10662
10863
  * "street1": null,
10663
- * "street2": null,
10664
- * "description": null
10864
+ * "street2": null
10665
10865
  * }
10666
10866
  * }
10667
10867
  */
10668
- BankData: {
10669
- /** @description Populated only for GB IBANs (22 chars): the embedded 8-digit account number (IBAN positions 14-22); null otherwise */
10670
- account_number: string | null;
10868
+ BankDataItem: {
10671
10869
  /** @description Registered bank name; null when unavailable */
10672
10870
  bank_name: string | null;
10673
- /** @description Always null today (reserved) */
10674
- note: string | null;
10675
- /** @description Populated only when the looked-up code is a US routing number (echoes the RTN); null otherwise */
10676
- routing_number: string | null;
10677
- /** @description SWIFT/BIC (ISO 9362); populated for SWIFT lookups and for IBAN lookups when the IBAN resolves to a BIC */
10678
- swift_bic: string | null;
10679
- /** @description Populated only for IBAN lookups (the normalised IBAN itself) */
10680
- iban: string | null;
10681
- /** @description Populated only for GB IBANs: the embedded 6-digit sort code (IBAN positions 8-14); null otherwise */
10682
- sort_code: string | null;
10683
- /** @description Bank postal address (always present) */
10871
+ /** @description Normalised code the bank was matched by (echoes the query `code`) */
10872
+ code: string;
10873
+ /** @description Registered bank address (always present) */
10684
10874
  address: components["schemas"]["BankDataAddress"];
10685
10875
  };
10686
10876
  /** @description Bank / rail account coordinates for a sub-account. Rail-dependent — some rails return only a subset of these. */
@@ -11166,11 +11356,33 @@ export interface components {
11166
11356
  amount_to?: number | null;
11167
11357
  order_type?: string;
11168
11358
  /** @enum {string} */
11169
- status?: "NEW" | "PROCESSING" | "COMPLETE" | "FAILED" | "CANCELED";
11359
+ status?: "NEW" | "PENDING" | "EXPECTED" | "PROCESSING" | "COMPLETE" | "FAILED" | "CANCELED" | "REFUNDED";
11360
+ /**
11361
+ * @description Compliance (transaction monitoring) state. Orthogonal to `status`: a `held` order is still PENDING and nothing has been credited — it resolves to COMPLETE or FAILED once the review finishes. `null` means the order was never subject to a compliance hold.
11362
+ * @enum {string|null}
11363
+ */
11364
+ compliance_state?: "held" | "released" | "rejected" | null;
11365
+ /** @description Why the order is (or was) held. */
11366
+ compliance_reason?: string | null;
11367
+ /**
11368
+ * Format: date-time
11369
+ * @description When the hold started.
11370
+ */
11371
+ compliance_held_at?: string | null;
11372
+ /**
11373
+ * Format: date-time
11374
+ * @description When the hold was released or rejected.
11375
+ */
11376
+ compliance_resolved_at?: string | null;
11170
11377
  /** Format: uuid */
11171
11378
  sub_account_id?: string | null;
11172
11379
  info?: string | null;
11173
11380
  meta?: components["schemas"]["OrderMeta"];
11381
+ /**
11382
+ * Format: date-time
11383
+ * @description Requested execution time for scheduled payments (status EXPECTED); null for immediate orders
11384
+ */
11385
+ scheduled_at?: string | null;
11174
11386
  /** Format: date-time */
11175
11387
  created_at?: string;
11176
11388
  /** Format: date-time */
@@ -11215,6 +11427,11 @@ export interface components {
11215
11427
  wallet_account_id?: string;
11216
11428
  reference?: string;
11217
11429
  note?: string;
11430
+ /**
11431
+ * Format: date-time
11432
+ * @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.
11433
+ */
11434
+ scheduled_at?: string;
11218
11435
  /** @description Optional supporting documents persisted with the order. */
11219
11436
  documents?: components["schemas"]["OrderDocumentInput"][];
11220
11437
  };
@@ -11235,6 +11452,11 @@ export interface components {
11235
11452
  counterparty_destination_id: string;
11236
11453
  reference?: string;
11237
11454
  note?: string;
11455
+ /**
11456
+ * Format: date-time
11457
+ * @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.
11458
+ */
11459
+ scheduled_at?: string;
11238
11460
  /** @description Optional supporting documents persisted with the order. */
11239
11461
  documents?: components["schemas"]["OrderDocumentInput"][];
11240
11462
  };
@@ -11365,6 +11587,66 @@ export interface components {
11365
11587
  /** Format: uuid */
11366
11588
  wallet_id?: string;
11367
11589
  };
11590
+ MassPayout: {
11591
+ /** Format: uuid */
11592
+ id?: string;
11593
+ /** Format: uuid */
11594
+ wallet_id?: string;
11595
+ /** Format: uuid */
11596
+ currency_id?: string;
11597
+ /**
11598
+ * Format: uuid
11599
+ * @description Source virtual account for banking payouts (required only when the batch contains banking recipients)
11600
+ */
11601
+ virtual_account_id?: string | null;
11602
+ name?: string;
11603
+ /** @enum {string} */
11604
+ status?: "DRAFT" | "PENDING_APPROVAL" | "PROCESSING" | "COMPLETED" | "FAILED" | "CANCELED";
11605
+ total_items?: number;
11606
+ total_amount?: number;
11607
+ completed_count?: number;
11608
+ failed_count?: number;
11609
+ /**
11610
+ * Format: uuid
11611
+ * @description User id of the wallet member who approved the batch; null until approved
11612
+ */
11613
+ approved_by?: string | null;
11614
+ /** Format: date-time */
11615
+ approved_at?: string | null;
11616
+ error_message?: string | null;
11617
+ /** Format: date-time */
11618
+ created_at?: string;
11619
+ /** Format: date-time */
11620
+ finished_at?: string | null;
11621
+ };
11622
+ MassPayoutItem: {
11623
+ /** Format: uuid */
11624
+ id?: string;
11625
+ /** Format: uuid */
11626
+ destination_id?: string;
11627
+ amount?: number;
11628
+ /** @enum {string} */
11629
+ status?: "PENDING" | "PROCESSING" | "COMPLETED" | "FAILED";
11630
+ /**
11631
+ * Format: uuid
11632
+ * @description The regular order created for this item at execution
11633
+ */
11634
+ order_id?: string | null;
11635
+ error_message?: string | null;
11636
+ position?: number;
11637
+ /** Format: date-time */
11638
+ created_at?: string;
11639
+ /** Format: date-time */
11640
+ processed_at?: string | null;
11641
+ };
11642
+ MassPayoutItemInput: {
11643
+ /**
11644
+ * Format: uuid
11645
+ * @description Existing counterparty destination of the source wallet
11646
+ */
11647
+ destination_id: string;
11648
+ amount: number;
11649
+ };
11368
11650
  };
11369
11651
  responses: {
11370
11652
  /** @description Authentication credentials are missing or invalid */
@@ -11422,6 +11704,9 @@ export interface components {
11422
11704
  * @example e04c0c85-b031-47d7-8541-207b4e83d91a
11423
11705
  */
11424
11706
  TenantId: string;
11707
+ /** @description Source wallet the batches belong to */
11708
+ MassPayoutWalletId: string;
11709
+ MassPayoutId: string;
11425
11710
  };
11426
11711
  requestBodies: never;
11427
11712
  headers: never;