@firela/api-types 0.0.0-canary.2fbeefe9 → 0.0.0-canary.3550df41

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.
@@ -6,9 +6,9 @@ export type CreateAccountDto = {
6
6
  */
7
7
  path: string;
8
8
  /**
9
- * Account open date
9
+ * Account open date (server defaults to today)
10
10
  */
11
- openDate: string;
11
+ openDate?: string;
12
12
  /**
13
13
  * Allowed currencies (null = no restriction)
14
14
  */
@@ -37,9 +37,9 @@ export type CreateAccountDto = {
37
37
  */
38
38
  icon?: string;
39
39
  /**
40
- * Additional metadata
40
+ * Open directive metadata (NOT an opening-balance amount — use the opening-balance endpoint)
41
41
  */
42
- openMeta?: {
42
+ openDirectiveMeta?: {
43
43
  [key: string]: unknown;
44
44
  };
45
45
  /**
@@ -73,6 +73,43 @@ export type AccountResponseDto = {
73
73
  * Account type (root segment)
74
74
  */
75
75
  type: 'Assets' | 'Liabilities' | 'Income' | 'Expenses' | 'Equity';
76
+ /**
77
+ * Account-level asset sub-class (product type, e.g. STOCK/DEPOSIT/CREDIT_CARD/PERSONAL_LOAN). Computed from the account path via the asset-classifier (ADR-0077). Null for non-asset accounts (Income/Expenses/Equity) or unmatched paths.
78
+ */
79
+ assetSubClass?:
80
+ | 'DEPOSIT'
81
+ | 'CASH'
82
+ | 'MONEY_MARKET_FUND'
83
+ | 'STOCK'
84
+ | 'ETF'
85
+ | 'MUTUAL_FUND'
86
+ | 'EQUITY_COMPENSATION'
87
+ | 'GOVERNMENT_BOND'
88
+ | 'CORPORATE_BOND'
89
+ | 'BOND_FUND'
90
+ | 'PRIMARY_RESIDENCE'
91
+ | 'INVESTMENT_PROPERTY'
92
+ | 'REIT'
93
+ | 'GOLD'
94
+ | 'SILVER'
95
+ | 'PRECIOUS_METAL'
96
+ | 'PRECIOUS_METAL_FUND'
97
+ | 'COMMODITY'
98
+ | 'COMMODITY_FUND'
99
+ | 'CRYPTOCURRENCY'
100
+ | 'RETIREMENT_ACCOUNT'
101
+ | 'HEALTH_ACCOUNT'
102
+ | 'EDUCATION_ACCOUNT'
103
+ | 'INSURANCE'
104
+ | 'PRIVATE_EQUITY'
105
+ | 'HEDGE_FUND'
106
+ | 'COLLECTIBLES'
107
+ | 'MORTGAGE'
108
+ | 'STUDENT_LOAN'
109
+ | 'CREDIT_CARD'
110
+ | 'PERSONAL_LOAN'
111
+ | 'OTHER'
112
+ | null;
76
113
  /**
77
114
  * Account status
78
115
  */
@@ -117,9 +154,9 @@ export type AccountResponseDto = {
117
154
  */
118
155
  icon?: string;
119
156
  /**
120
- * Account metadata
157
+ * Open directive metadata (ADR-0115 Decision 9)
121
158
  */
122
- openMeta?: {
159
+ openDirectiveMeta?: {
123
160
  [key: string]: unknown;
124
161
  };
125
162
  /**
@@ -149,6 +186,43 @@ export type AccountResponseDto = {
149
186
  */
150
187
  export type type = 'Assets' | 'Liabilities' | 'Income' | 'Expenses' | 'Equity';
151
188
 
189
+ /**
190
+ * Account-level asset sub-class (product type, e.g. STOCK/DEPOSIT/CREDIT_CARD/PERSONAL_LOAN). Computed from the account path via the asset-classifier (ADR-0077). Null for non-asset accounts (Income/Expenses/Equity) or unmatched paths.
191
+ */
192
+ export type assetSubClass =
193
+ | 'DEPOSIT'
194
+ | 'CASH'
195
+ | 'MONEY_MARKET_FUND'
196
+ | 'STOCK'
197
+ | 'ETF'
198
+ | 'MUTUAL_FUND'
199
+ | 'EQUITY_COMPENSATION'
200
+ | 'GOVERNMENT_BOND'
201
+ | 'CORPORATE_BOND'
202
+ | 'BOND_FUND'
203
+ | 'PRIMARY_RESIDENCE'
204
+ | 'INVESTMENT_PROPERTY'
205
+ | 'REIT'
206
+ | 'GOLD'
207
+ | 'SILVER'
208
+ | 'PRECIOUS_METAL'
209
+ | 'PRECIOUS_METAL_FUND'
210
+ | 'COMMODITY'
211
+ | 'COMMODITY_FUND'
212
+ | 'CRYPTOCURRENCY'
213
+ | 'RETIREMENT_ACCOUNT'
214
+ | 'HEALTH_ACCOUNT'
215
+ | 'EDUCATION_ACCOUNT'
216
+ | 'INSURANCE'
217
+ | 'PRIVATE_EQUITY'
218
+ | 'HEDGE_FUND'
219
+ | 'COLLECTIBLES'
220
+ | 'MORTGAGE'
221
+ | 'STUDENT_LOAN'
222
+ | 'CREDIT_CARD'
223
+ | 'PERSONAL_LOAN'
224
+ | 'OTHER';
225
+
152
226
  /**
153
227
  * Account status
154
228
  */
@@ -186,9 +260,9 @@ export type UpdateAccountDto = {
186
260
  */
187
261
  icon?: string;
188
262
  /**
189
- * Additional metadata (merged with existing)
263
+ * Open directive metadata (merged with existing; NOT an opening-balance amount)
190
264
  */
191
- openMeta?: {
265
+ openDirectiveMeta?: {
192
266
  [key: string]: unknown;
193
267
  };
194
268
  /**
@@ -217,6 +291,28 @@ export type ReopenAccountDto = {
217
291
  reopenDate?: string;
218
292
  };
219
293
 
294
+ export type CreateOpeningBalanceDto = {
295
+ /**
296
+ * Opening balance amount (non-negative)
297
+ */
298
+ amount: number;
299
+ /**
300
+ * Currency code
301
+ */
302
+ currency: string;
303
+ /**
304
+ * Opening-balance date (defaults to now)
305
+ */
306
+ date?: string;
307
+ };
308
+
309
+ export type OpeningBalanceResultDto = {
310
+ /**
311
+ * Created opening-balance transaction id.
312
+ */
313
+ transactionId: string;
314
+ };
315
+
220
316
  export type AccountStandardResponseDto = {
221
317
  /**
222
318
  * Account path (hierarchical, colon-separated)
@@ -2679,374 +2775,213 @@ export type ForecastResponseDto = {
2679
2775
  periodEnd: string;
2680
2776
  };
2681
2777
 
2682
- export type CreateTransactionRuleDto = {
2683
- name: string;
2684
- description?: string;
2685
- narrationKeywords?: Array<unknown[]>;
2686
- payeeKeywords?: Array<unknown[]>;
2687
- categoryKeywords?: Array<unknown[]>;
2778
+ export type CurrencyBalanceDto = {
2688
2779
  /**
2689
- * Payment method keywords (e.g., HuaBei, YuEBao)
2780
+ * ISO 4217 currency code
2690
2781
  */
2691
- methodKeywords?: Array<unknown[]>;
2782
+ currency: string;
2692
2783
  /**
2693
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2784
+ * Balance amount
2694
2785
  */
2695
- categoryAccount?: string;
2696
- matchLogic: 'OR' | 'AND';
2786
+ balance: string;
2787
+ };
2788
+
2789
+ export type TimeSeriesPointDto = {
2697
2790
  /**
2698
- * Minimum transaction amount (inclusive)
2791
+ * Date in YYYY-MM-DD format
2699
2792
  */
2700
- amountMin?: number;
2793
+ date: string;
2701
2794
  /**
2702
- * Maximum transaction amount (inclusive)
2795
+ * Value at this date (in base currency)
2703
2796
  */
2704
- amountMax?: number;
2705
- priority: number;
2706
- additionalTags?: Array<unknown[]>;
2707
- additionalMetadata?: {
2797
+ value: string;
2798
+ /**
2799
+ * Change from previous point
2800
+ */
2801
+ change?: {
2708
2802
  [key: string]: unknown;
2709
2803
  };
2710
2804
  /**
2711
- * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
2805
+ * Total assets at this date (in base currency)
2712
2806
  */
2713
- upsertByPayee?: boolean;
2714
- };
2715
-
2716
- export type matchLogic = 'OR' | 'AND';
2717
-
2718
- export type AmountRangeDto = {
2807
+ assets?: string;
2719
2808
  /**
2720
- * Minimum amount
2809
+ * Total liabilities at this date (in base currency)
2721
2810
  */
2722
- min?: number;
2811
+ liabilities?: string;
2723
2812
  /**
2724
- * Maximum amount
2813
+ * Multi-currency breakdown for this point
2725
2814
  */
2726
- max?: number;
2815
+ byCurrency?: Array<CurrencyBalanceDto>;
2727
2816
  };
2728
2817
 
2729
- export type TransactionRuleResponseDto = {
2818
+ export type TrendSummaryDto = {
2730
2819
  /**
2731
- * Rule ID
2820
+ * Value at start of period
2732
2821
  */
2733
- id: string;
2822
+ startValue: string;
2734
2823
  /**
2735
- * Rule name
2824
+ * Value at end of period
2736
2825
  */
2737
- name: string;
2826
+ endValue: string;
2738
2827
  /**
2739
- * Rule description
2828
+ * Total change over period
2740
2829
  */
2741
- description?: string;
2830
+ totalChange: string;
2742
2831
  /**
2743
- * Keywords to match in transaction narration
2832
+ * Total change percentage
2744
2833
  */
2745
- narrationKeywords: Array<string>;
2834
+ totalChangePercentage: string;
2835
+ };
2836
+
2837
+ export type MultiCurrencyPointDto = {
2746
2838
  /**
2747
- * Keywords to match in payee name
2839
+ * Date in YYYY-MM-DD format
2748
2840
  */
2749
- payeeKeywords: Array<string>;
2841
+ date: string;
2750
2842
  /**
2751
- * Keywords to match in category
2843
+ * Balances by currency
2752
2844
  */
2753
- categoryKeywords: Array<string>;
2845
+ byCurrency: Array<CurrencyBalanceDto>;
2846
+ };
2847
+
2848
+ export type PortfolioTrendsResponseDto = {
2754
2849
  /**
2755
- * Keywords to match in payment method
2850
+ * Time series data points
2756
2851
  */
2757
- methodKeywords: Array<string>;
2852
+ series: Array<TimeSeriesPointDto>;
2758
2853
  /**
2759
- * Destination account for categorization
2854
+ * Period summary
2760
2855
  */
2761
- categoryAccount?: string;
2856
+ summary: TrendSummaryDto;
2762
2857
  /**
2763
- * Keyword matching logic
2858
+ * Period requested
2764
2859
  */
2765
- matchLogic: 'OR' | 'AND';
2860
+ period: string;
2766
2861
  /**
2767
- * Amount range for matching
2862
+ * Data granularity
2768
2863
  */
2769
- amountRange?: AmountRangeDto;
2864
+ granularity: string;
2770
2865
  /**
2771
- * Rule priority (0-1000, higher = first match)
2866
+ * Base currency for converted values
2772
2867
  */
2773
- priority: number;
2868
+ currency: string;
2774
2869
  /**
2775
- * Whether the rule is enabled
2870
+ * Multi-currency time series (each point has currency breakdown)
2776
2871
  */
2777
- enabled: boolean;
2872
+ byCurrency?: Array<MultiCurrencyPointDto>;
2778
2873
  /**
2779
- * Learning source: NLP, REVIEW_CENTER, or null for manual
2874
+ * Exchange rate warnings
2780
2875
  */
2781
- learningSource?: 'NLP' | 'REVIEW_CENTER' | null;
2876
+ warnings?: Array<ExchangeRateWarningDto>;
2877
+ };
2878
+
2879
+ export type CashFlowPointDto = {
2782
2880
  /**
2783
- * Whether auto-apply is enabled for this rule
2881
+ * Month key (YYYY-MM)
2784
2882
  */
2785
- autoApplyEnabled: boolean;
2883
+ month: string;
2786
2884
  /**
2787
- * Number of confirmations for NLP-learned rules
2885
+ * Income in base currency (absolute, converted)
2788
2886
  */
2789
- confirmationCount: number;
2887
+ income: string;
2790
2888
  /**
2791
- * Additional tags
2889
+ * Expense in base currency (absolute, converted)
2792
2890
  */
2793
- additionalTags: Array<string>;
2891
+ expense: string;
2794
2892
  /**
2795
- * Additional metadata
2893
+ * netSavings = income − expense (savings positive)
2796
2894
  */
2797
- additionalMetadata?: {
2798
- [key: string]: string;
2799
- };
2895
+ netSavings: string;
2896
+ };
2897
+
2898
+ export type CashFlowTrendSummaryDto = {
2800
2899
  /**
2801
- * Created timestamp
2900
+ * Total income across the period
2802
2901
  */
2803
- createdAt: string;
2902
+ totalIncome: string;
2804
2903
  /**
2805
- * Updated timestamp
2904
+ * Total expense across the period
2806
2905
  */
2807
- updatedAt: string;
2906
+ totalExpense: string;
2907
+ /**
2908
+ * income − expense across the period
2909
+ */
2910
+ totalNetSavings: string;
2911
+ /**
2912
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
2913
+ */
2914
+ averageMonthlyNetSavings: string;
2808
2915
  };
2809
2916
 
2810
- /**
2811
- * Learning source: NLP, REVIEW_CENTER, or null for manual
2812
- */
2813
- export type learningSource = 'NLP' | 'REVIEW_CENTER';
2814
-
2815
- export type TransactionRuleListResponseDto = {
2816
- data: Array<TransactionRuleResponseDto>;
2917
+ export type CashFlowTrendsResponseDto = {
2817
2918
  /**
2818
- * Total count of rules
2919
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
2819
2920
  */
2820
- total: number;
2921
+ series: Array<CashFlowPointDto>;
2821
2922
  /**
2822
- * Results per page
2923
+ * Period totals
2823
2924
  */
2824
- limit: number;
2925
+ summary: CashFlowTrendSummaryDto;
2825
2926
  /**
2826
- * Pagination offset
2927
+ * Period requested
2827
2928
  */
2828
- offset: number;
2829
- };
2830
-
2831
- export type ValidateRuleDto = {
2832
- name: string;
2833
- description?: string;
2834
- narrationKeywords?: Array<unknown[]>;
2835
- payeeKeywords?: Array<unknown[]>;
2836
- categoryKeywords?: Array<unknown[]>;
2929
+ period: string;
2837
2930
  /**
2838
- * Payment method keywords (e.g., HuaBei, YuEBao)
2931
+ * Data granularity (v1 returns month buckets)
2839
2932
  */
2840
- methodKeywords?: Array<unknown[]>;
2933
+ granularity: string;
2841
2934
  /**
2842
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2935
+ * Base currency for converted values
2843
2936
  */
2844
- categoryAccount?: string;
2845
- matchLogic: 'OR' | 'AND';
2937
+ currency: string;
2846
2938
  /**
2847
- * Minimum transaction amount (inclusive)
2939
+ * Exchange rate warnings (e.g. missing rate for a currency)
2848
2940
  */
2849
- amountMin?: number;
2941
+ warnings?: Array<ExchangeRateWarningDto>;
2942
+ };
2943
+
2944
+ export type GenerateSnapshotBody = unknown;
2945
+
2946
+ export type GenerateSnapshotResponse = unknown;
2947
+
2948
+ export type BackfillSnapshotsBody = unknown;
2949
+
2950
+ export type BackfillSnapshotsResponse = unknown;
2951
+
2952
+ export type DeleteOwnUserDto = {
2850
2953
  /**
2851
- * Maximum transaction amount (inclusive)
2954
+ * Access token for user verification
2852
2955
  */
2853
- amountMax?: number;
2854
- priority: number;
2855
- additionalTags?: Array<unknown[]>;
2856
- additionalMetadata?: {
2857
- [key: string]: unknown;
2858
- };
2956
+ accessToken: string;
2957
+ };
2958
+
2959
+ export type SignupDto = {
2859
2960
  /**
2860
- * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
2961
+ * Cloudflare Turnstile verification token (optional when Turnstile disabled)
2861
2962
  */
2862
- upsertByPayee?: boolean;
2963
+ turnstileToken?: string;
2863
2964
  };
2864
2965
 
2865
- export type ValidateRuleResponseDto = {
2966
+ export type SignupResponseDto = {
2866
2967
  /**
2867
- * Whether the rule configuration is valid
2968
+ * JWT auth token
2868
2969
  */
2869
- valid: boolean;
2970
+ authToken: string;
2870
2971
  /**
2871
- * List of validation errors (empty if valid)
2972
+ * Auto-generated access token
2872
2973
  */
2873
- errors: Array<unknown[]>;
2974
+ accessToken: string;
2874
2975
  /**
2875
- * List of validation warnings (non-blocking issues)
2976
+ * Assigned user role
2876
2977
  */
2877
- warnings: Array<unknown[]>;
2878
- };
2879
-
2880
- export type BulkCreateRulesDto = {
2881
- /**
2882
- * Array of rules to import
2883
- */
2884
- rules: Array<unknown[]>;
2885
- /**
2886
- * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
2887
- */
2888
- conflictStrategy: 'replace' | 'skip';
2889
- };
2890
-
2891
- /**
2892
- * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
2893
- */
2894
- export type conflictStrategy = 'replace' | 'skip';
2895
-
2896
- export type BulkCreateRulesResponseDto = {
2897
- /**
2898
- * Number of successfully created rules
2899
- */
2900
- successCount: number;
2901
- /**
2902
- * Number of failed rules
2903
- */
2904
- failureCount: number;
2905
- /**
2906
- * Error details for failed rules
2907
- */
2908
- errors: Array<{
2909
- index?: number;
2910
- message?: string;
2911
- }>;
2912
- /**
2913
- * IDs of successfully created rules
2914
- */
2915
- createdRuleIds: Array<string>;
2916
- };
2917
-
2918
- export type ExportRulesResponseDto = {
2919
- /**
2920
- * Export timestamp
2921
- */
2922
- exportedAt: string;
2923
- /**
2924
- * User ID
2925
- */
2926
- userId: string;
2927
- /**
2928
- * Number of exported rules
2929
- */
2930
- ruleCount: number;
2931
- /**
2932
- * Exported rules
2933
- */
2934
- rules: unknown[];
2935
- };
2936
-
2937
- export type RuleStatisticsResponseDto = {
2938
- /**
2939
- * Statistics time period
2940
- */
2941
- period: '7d' | '30d' | '90d';
2942
- /**
2943
- * Total number of rules
2944
- */
2945
- totalRules: number;
2946
- /**
2947
- * Number of rules with at least one match
2948
- */
2949
- rulesWithMatches: number;
2950
- /**
2951
- * Total number of matches across all rules
2952
- */
2953
- totalMatches: number;
2954
- /**
2955
- * Average confidence score across all matches
2956
- */
2957
- averageConfidence: number;
2958
- /**
2959
- * Per-rule statistics
2960
- */
2961
- ruleStats: Array<{
2962
- ruleId?: string;
2963
- ruleName?: string;
2964
- matchCount?: number;
2965
- averageConfidence?: number;
2966
- }>;
2978
+ role: 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2967
2979
  };
2968
2980
 
2969
2981
  /**
2970
- * Statistics time period
2982
+ * Assigned user role
2971
2983
  */
2972
- export type period = '7d' | '30d' | '90d';
2973
-
2974
- export type UpdateTransactionRuleDto = {
2975
- name?: string;
2976
- description?: string;
2977
- narrationKeywords?: Array<unknown[]>;
2978
- payeeKeywords?: Array<unknown[]>;
2979
- categoryKeywords?: Array<unknown[]>;
2980
- /**
2981
- * Payment method keywords (e.g., HuaBei, YuEBao)
2982
- */
2983
- methodKeywords?: Array<unknown[]>;
2984
- /**
2985
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2986
- */
2987
- categoryAccount?: string;
2988
- matchLogic?: 'OR' | 'AND';
2989
- /**
2990
- * Minimum transaction amount (inclusive)
2991
- */
2992
- amountMin?: number;
2993
- /**
2994
- * Maximum transaction amount (inclusive)
2995
- */
2996
- amountMax?: number;
2997
- priority?: number;
2998
- /**
2999
- * Enable or disable the rule
3000
- */
3001
- enabled?: boolean;
3002
- additionalTags?: Array<unknown[]>;
3003
- additionalMetadata?: {
3004
- [key: string]: unknown;
3005
- };
3006
- };
3007
-
3008
- export type TestRuleDto = {
3009
- narration: string;
3010
- payee?: string;
3011
- categoryAccount?: string;
3012
- amount?: number;
3013
- currency?: string;
3014
- };
3015
-
3016
- export type TestRuleResponseDto = {
3017
- /**
3018
- * Rule ID that was tested
3019
- */
3020
- ruleId: string;
3021
- /**
3022
- * Whether the rule matched the test data
3023
- */
3024
- matches: boolean;
3025
- /**
3026
- * Match confidence score (0-1)
3027
- */
3028
- confidence: number;
3029
- /**
3030
- * Details of which fields matched
3031
- */
3032
- matchDetails: {
3033
- [key: string]: unknown;
3034
- };
3035
- };
3036
-
3037
- export type DeleteOwnUserDto = {
3038
- /**
3039
- * Access token for user verification
3040
- */
3041
- accessToken: string;
3042
- };
3043
-
3044
- export type SignupDto = {
3045
- /**
3046
- * Cloudflare Turnstile verification token (optional when Turnstile disabled)
3047
- */
3048
- turnstileToken?: string;
3049
- };
2984
+ export type role = 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
3050
2985
 
3051
2986
  export type UpdateUserSettingDto = {
3052
2987
  /**
@@ -3152,78 +3087,433 @@ export type UpdatePropertyDto = {
3152
3087
  value: string;
3153
3088
  };
3154
3089
 
3155
- export type CreateBeanEventDto = {
3090
+ export type CreateTransactionRuleDto = {
3091
+ name: string;
3092
+ description?: string;
3093
+ narrationKeywords?: Array<unknown[]>;
3094
+ payeeKeywords?: Array<unknown[]>;
3095
+ categoryKeywords?: Array<unknown[]>;
3156
3096
  /**
3157
- * Life event date (ISO 8601)
3097
+ * Payment method keywords (e.g., HuaBei, YuEBao)
3158
3098
  */
3159
- date: string;
3099
+ methodKeywords?: Array<unknown[]>;
3160
3100
  /**
3161
- * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3101
+ * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
3162
3102
  */
3163
- type: string;
3103
+ categoryAccount?: string;
3104
+ matchLogic: 'OR' | 'AND';
3164
3105
  /**
3165
- * Life event description. Empty string is a VALID value (distinct from absence).
3106
+ * Minimum transaction amount (inclusive)
3166
3107
  */
3167
- description: string;
3108
+ amountMin?: number;
3168
3109
  /**
3169
- * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3110
+ * Maximum transaction amount (inclusive)
3170
3111
  */
3171
- meta?: {
3112
+ amountMax?: number;
3113
+ priority: number;
3114
+ additionalTags?: Array<unknown[]>;
3115
+ additionalMetadata?: {
3172
3116
  [key: string]: unknown;
3173
3117
  };
3118
+ /**
3119
+ * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
3120
+ */
3121
+ upsertByPayee?: boolean;
3174
3122
  };
3175
3123
 
3176
- export type EventResponseDto = {
3124
+ export type matchLogic = 'OR' | 'AND';
3125
+
3126
+ export type AmountRangeDto = {
3177
3127
  /**
3178
- * Unique identifier
3128
+ * Minimum amount
3179
3129
  */
3180
- id: string;
3130
+ min?: number;
3181
3131
  /**
3182
- * User ID (owner of the life event)
3132
+ * Maximum amount
3183
3133
  */
3184
- userId: string;
3134
+ max?: number;
3135
+ };
3136
+
3137
+ export type TransactionRuleResponseDto = {
3185
3138
  /**
3186
- * Life event date (ISO 8601 format)
3139
+ * Rule ID
3187
3140
  */
3188
- date: string;
3141
+ id: string;
3189
3142
  /**
3190
- * Life event type (user-defined, e.g., "employer", "location")
3143
+ * Rule name
3191
3144
  */
3192
- type: string;
3145
+ name: string;
3193
3146
  /**
3194
- * Life event description. May be an empty string (a valid value distinct from absence).
3147
+ * Rule description
3195
3148
  */
3196
- description: string;
3149
+ description?: string;
3197
3150
  /**
3198
- * Product-side metadata (free-form JSON)
3151
+ * Keywords to match in transaction narration
3199
3152
  */
3200
- meta: {
3201
- [key: string]: unknown;
3202
- };
3153
+ narrationKeywords: Array<string>;
3203
3154
  /**
3204
- * Creation timestamp
3155
+ * Keywords to match in payee name
3205
3156
  */
3206
- createdAt: string;
3157
+ payeeKeywords: Array<string>;
3207
3158
  /**
3208
- * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3159
+ * Keywords to match in category
3209
3160
  */
3210
- updatedAt: string;
3211
- };
3212
-
3213
- export type EventListResponseDto = {
3161
+ categoryKeywords: Array<string>;
3214
3162
  /**
3215
- * List of life events
3163
+ * Keywords to match in payment method
3216
3164
  */
3217
- items: Array<EventResponseDto>;
3165
+ methodKeywords: Array<string>;
3218
3166
  /**
3219
- * Total number of life events matching the query
3167
+ * Destination account for categorization
3220
3168
  */
3221
- total: number;
3222
- };
3223
-
3224
- export type UpdateBeanEventDto = {
3169
+ categoryAccount?: string;
3225
3170
  /**
3226
- * Life event date (ISO 8601)
3171
+ * Keyword matching logic
3172
+ */
3173
+ matchLogic: 'OR' | 'AND';
3174
+ /**
3175
+ * Amount range for matching
3176
+ */
3177
+ amountRange?: AmountRangeDto;
3178
+ /**
3179
+ * Rule priority (0-1000, higher = first match)
3180
+ */
3181
+ priority: number;
3182
+ /**
3183
+ * Whether the rule is enabled
3184
+ */
3185
+ enabled: boolean;
3186
+ /**
3187
+ * Learning source: NLP, REVIEW_CENTER, or null for manual
3188
+ */
3189
+ learningSource?: 'NLP' | 'REVIEW_CENTER' | null;
3190
+ /**
3191
+ * Whether auto-apply is enabled for this rule
3192
+ */
3193
+ autoApplyEnabled: boolean;
3194
+ /**
3195
+ * Number of confirmations for NLP-learned rules
3196
+ */
3197
+ confirmationCount: number;
3198
+ /**
3199
+ * Additional tags
3200
+ */
3201
+ additionalTags: Array<string>;
3202
+ /**
3203
+ * Additional metadata
3204
+ */
3205
+ additionalMetadata?: {
3206
+ [key: string]: string;
3207
+ };
3208
+ /**
3209
+ * Created timestamp
3210
+ */
3211
+ createdAt: string;
3212
+ /**
3213
+ * Updated timestamp
3214
+ */
3215
+ updatedAt: string;
3216
+ };
3217
+
3218
+ /**
3219
+ * Learning source: NLP, REVIEW_CENTER, or null for manual
3220
+ */
3221
+ export type learningSource = 'NLP' | 'REVIEW_CENTER';
3222
+
3223
+ export type TransactionRuleListResponseDto = {
3224
+ data: Array<TransactionRuleResponseDto>;
3225
+ /**
3226
+ * Total count of rules
3227
+ */
3228
+ total: number;
3229
+ /**
3230
+ * Results per page
3231
+ */
3232
+ limit: number;
3233
+ /**
3234
+ * Pagination offset
3235
+ */
3236
+ offset: number;
3237
+ };
3238
+
3239
+ export type ValidateRuleDto = {
3240
+ name: string;
3241
+ description?: string;
3242
+ narrationKeywords?: Array<unknown[]>;
3243
+ payeeKeywords?: Array<unknown[]>;
3244
+ categoryKeywords?: Array<unknown[]>;
3245
+ /**
3246
+ * Payment method keywords (e.g., HuaBei, YuEBao)
3247
+ */
3248
+ methodKeywords?: Array<unknown[]>;
3249
+ /**
3250
+ * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
3251
+ */
3252
+ categoryAccount?: string;
3253
+ matchLogic: 'OR' | 'AND';
3254
+ /**
3255
+ * Minimum transaction amount (inclusive)
3256
+ */
3257
+ amountMin?: number;
3258
+ /**
3259
+ * Maximum transaction amount (inclusive)
3260
+ */
3261
+ amountMax?: number;
3262
+ priority: number;
3263
+ additionalTags?: Array<unknown[]>;
3264
+ additionalMetadata?: {
3265
+ [key: string]: unknown;
3266
+ };
3267
+ /**
3268
+ * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
3269
+ */
3270
+ upsertByPayee?: boolean;
3271
+ };
3272
+
3273
+ export type ValidateRuleResponseDto = {
3274
+ /**
3275
+ * Whether the rule configuration is valid
3276
+ */
3277
+ valid: boolean;
3278
+ /**
3279
+ * List of validation errors (empty if valid)
3280
+ */
3281
+ errors: Array<unknown[]>;
3282
+ /**
3283
+ * List of validation warnings (non-blocking issues)
3284
+ */
3285
+ warnings: Array<unknown[]>;
3286
+ };
3287
+
3288
+ export type BulkCreateRulesDto = {
3289
+ /**
3290
+ * Array of rules to import
3291
+ */
3292
+ rules: Array<unknown[]>;
3293
+ /**
3294
+ * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
3295
+ */
3296
+ conflictStrategy: 'replace' | 'skip';
3297
+ };
3298
+
3299
+ /**
3300
+ * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
3301
+ */
3302
+ export type conflictStrategy = 'replace' | 'skip';
3303
+
3304
+ export type BulkCreateRulesResponseDto = {
3305
+ /**
3306
+ * Number of successfully created rules
3307
+ */
3308
+ successCount: number;
3309
+ /**
3310
+ * Number of failed rules
3311
+ */
3312
+ failureCount: number;
3313
+ /**
3314
+ * Error details for failed rules
3315
+ */
3316
+ errors: Array<{
3317
+ index?: number;
3318
+ message?: string;
3319
+ }>;
3320
+ /**
3321
+ * IDs of successfully created rules
3322
+ */
3323
+ createdRuleIds: Array<string>;
3324
+ };
3325
+
3326
+ export type ExportRulesResponseDto = {
3327
+ /**
3328
+ * Export timestamp
3329
+ */
3330
+ exportedAt: string;
3331
+ /**
3332
+ * User ID
3333
+ */
3334
+ userId: string;
3335
+ /**
3336
+ * Number of exported rules
3337
+ */
3338
+ ruleCount: number;
3339
+ /**
3340
+ * Exported rules
3341
+ */
3342
+ rules: unknown[];
3343
+ };
3344
+
3345
+ export type RuleStatisticsResponseDto = {
3346
+ /**
3347
+ * Statistics time period
3348
+ */
3349
+ period: '7d' | '30d' | '90d';
3350
+ /**
3351
+ * Total number of rules
3352
+ */
3353
+ totalRules: number;
3354
+ /**
3355
+ * Number of rules with at least one match
3356
+ */
3357
+ rulesWithMatches: number;
3358
+ /**
3359
+ * Total number of matches across all rules
3360
+ */
3361
+ totalMatches: number;
3362
+ /**
3363
+ * Average confidence score across all matches
3364
+ */
3365
+ averageConfidence: number;
3366
+ /**
3367
+ * Per-rule statistics
3368
+ */
3369
+ ruleStats: Array<{
3370
+ ruleId?: string;
3371
+ ruleName?: string;
3372
+ matchCount?: number;
3373
+ averageConfidence?: number;
3374
+ }>;
3375
+ };
3376
+
3377
+ /**
3378
+ * Statistics time period
3379
+ */
3380
+ export type period = '7d' | '30d' | '90d';
3381
+
3382
+ export type UpdateTransactionRuleDto = {
3383
+ name?: string;
3384
+ description?: string;
3385
+ narrationKeywords?: Array<unknown[]>;
3386
+ payeeKeywords?: Array<unknown[]>;
3387
+ categoryKeywords?: Array<unknown[]>;
3388
+ /**
3389
+ * Payment method keywords (e.g., HuaBei, YuEBao)
3390
+ */
3391
+ methodKeywords?: Array<unknown[]>;
3392
+ /**
3393
+ * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
3394
+ */
3395
+ categoryAccount?: string;
3396
+ matchLogic?: 'OR' | 'AND';
3397
+ /**
3398
+ * Minimum transaction amount (inclusive)
3399
+ */
3400
+ amountMin?: number;
3401
+ /**
3402
+ * Maximum transaction amount (inclusive)
3403
+ */
3404
+ amountMax?: number;
3405
+ priority?: number;
3406
+ /**
3407
+ * Enable or disable the rule
3408
+ */
3409
+ enabled?: boolean;
3410
+ additionalTags?: Array<unknown[]>;
3411
+ additionalMetadata?: {
3412
+ [key: string]: unknown;
3413
+ };
3414
+ };
3415
+
3416
+ export type TestRuleDto = {
3417
+ narration: string;
3418
+ payee?: string;
3419
+ categoryAccount?: string;
3420
+ amount?: number;
3421
+ currency?: string;
3422
+ };
3423
+
3424
+ export type TestRuleResponseDto = {
3425
+ /**
3426
+ * Rule ID that was tested
3427
+ */
3428
+ ruleId: string;
3429
+ /**
3430
+ * Whether the rule matched the test data
3431
+ */
3432
+ matches: boolean;
3433
+ /**
3434
+ * Match confidence score (0-1)
3435
+ */
3436
+ confidence: number;
3437
+ /**
3438
+ * Details of which fields matched
3439
+ */
3440
+ matchDetails: {
3441
+ [key: string]: unknown;
3442
+ };
3443
+ };
3444
+
3445
+ export type CreateBeanEventDto = {
3446
+ /**
3447
+ * Life event date (ISO 8601)
3448
+ */
3449
+ date: string;
3450
+ /**
3451
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3452
+ */
3453
+ type: string;
3454
+ /**
3455
+ * Life event description. Empty string is a VALID value (distinct from absence).
3456
+ */
3457
+ description: string;
3458
+ /**
3459
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3460
+ */
3461
+ meta?: {
3462
+ [key: string]: unknown;
3463
+ };
3464
+ };
3465
+
3466
+ export type EventResponseDto = {
3467
+ /**
3468
+ * Unique identifier
3469
+ */
3470
+ id: string;
3471
+ /**
3472
+ * User ID (owner of the life event)
3473
+ */
3474
+ userId: string;
3475
+ /**
3476
+ * Life event date (ISO 8601 format)
3477
+ */
3478
+ date: string;
3479
+ /**
3480
+ * Life event type (user-defined, e.g., "employer", "location")
3481
+ */
3482
+ type: string;
3483
+ /**
3484
+ * Life event description. May be an empty string (a valid value distinct from absence).
3485
+ */
3486
+ description: string;
3487
+ /**
3488
+ * Product-side metadata (free-form JSON)
3489
+ */
3490
+ meta: {
3491
+ [key: string]: unknown;
3492
+ };
3493
+ /**
3494
+ * Creation timestamp
3495
+ */
3496
+ createdAt: string;
3497
+ /**
3498
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3499
+ */
3500
+ updatedAt: string;
3501
+ };
3502
+
3503
+ export type EventListResponseDto = {
3504
+ /**
3505
+ * List of life events
3506
+ */
3507
+ items: Array<EventResponseDto>;
3508
+ /**
3509
+ * Total number of life events matching the query
3510
+ */
3511
+ total: number;
3512
+ };
3513
+
3514
+ export type UpdateBeanEventDto = {
3515
+ /**
3516
+ * Life event date (ISO 8601)
3227
3517
  */
3228
3518
  date?: string;
3229
3519
  /**
@@ -3848,6 +4138,14 @@ export type ProcessNlpDto = {
3848
4138
  parsedData?: {
3849
4139
  [key: string]: unknown;
3850
4140
  };
4141
+ /**
4142
+ * confirm_rule echo-back: rule id selected from the prior confirm_rule response (matchedRule.id or alternatives[i].ruleId). Applied directly when the session is confirming_rule — no NL re-parse.
4143
+ */
4144
+ selectedRuleId?: string;
4145
+ /**
4146
+ * confirm_account echo-back: account path selected from the prior confirm_account response (suggestedAccount, similarAccounts[i], or a typed path). Applied directly when the session is confirming_account — no NL re-parse.
4147
+ */
4148
+ selectedAccount?: string;
3851
4149
  };
3852
4150
 
3853
4151
  export type NlpTransactionInfoDto = {
@@ -4091,9 +4389,9 @@ export type NlpAccountConfirmationDataDto = {
4091
4389
  */
4092
4390
  invalidAccount: string;
4093
4391
  /**
4094
- * Suggested replacement account
4392
+ * Suggested replacement account (omitted when no clear candidate)
4095
4393
  */
4096
- suggestedAccount: string;
4394
+ suggestedAccount?: string;
4097
4395
  /**
4098
4396
  * Similar accounts for user selection
4099
4397
  */
@@ -4221,7 +4519,7 @@ export type NlpSuggestedAccountDto = {
4221
4519
  */
4222
4520
  account: string;
4223
4521
  /**
4224
- * Confidence score for this suggestion (0-1)
4522
+ * Confidence score for this suggestion (0-1). Present = predicted (confirm/confirm_rule/confirm_account); omitted = actual persisted account (created). (#586)
4225
4523
  */
4226
4524
  confidence?: number;
4227
4525
  };
@@ -4239,21 +4537,21 @@ export type NlpSuggestedAccountsDto = {
4239
4537
 
4240
4538
  export type NlpDefaultAccountsDto = {
4241
4539
  /**
4242
- * Default asset account
4540
+ * Default OPEN asset account (MRU when multiple), or null when none/ambiguous
4243
4541
  */
4244
- asset: string;
4542
+ asset: string | null;
4245
4543
  /**
4246
- * Default expense account
4544
+ * Default OPEN expense account (MRU when multiple), or null when none/ambiguous
4247
4545
  */
4248
- expense: string;
4546
+ expense: string | null;
4249
4547
  /**
4250
- * Default income account
4548
+ * Default OPEN income account (MRU when multiple), or null when none/ambiguous
4251
4549
  */
4252
- income: string;
4550
+ income: string | null;
4253
4551
  /**
4254
- * Default liability account
4552
+ * Default OPEN liability account (MRU when multiple), or null when none/ambiguous
4255
4553
  */
4256
- liability: string;
4554
+ liability: string | null;
4257
4555
  };
4258
4556
 
4259
4557
  export type NlpResponseDto = {
@@ -4272,7 +4570,8 @@ export type NlpResponseDto = {
4272
4570
  | 'confirm_rule'
4273
4571
  | 'confirm_account'
4274
4572
  | 'confirm_payee'
4275
- | 'cancel';
4573
+ | 'cancel'
4574
+ | 'aborted';
4276
4575
  /**
4277
4576
  * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4278
4577
  */
@@ -4333,80 +4632,202 @@ export type NlpResponseDto = {
4333
4632
  */
4334
4633
  duplicateData?: NlpDuplicateConfirmationDataDto;
4335
4634
  /**
4336
- * Rule match data (when action is "confirm_rule"). Contains information about medium-confidence rule match for user confirmation.
4635
+ * Rule match data (when action is "confirm_rule"). Contains information about medium-confidence rule match for user confirmation.
4636
+ */
4637
+ ruleData?: NlpRuleConfirmationDataDto;
4638
+ /**
4639
+ * Account validation data (when action is "confirm_account"). Contains information about invalid account for user correction.
4640
+ */
4641
+ accountData?: NlpAccountConfirmationDataDto;
4642
+ /**
4643
+ * Payee confirmation data (when action is "confirm_payee"). Contains information about medium/low confidence payee match for user confirmation.
4644
+ */
4645
+ payeeData?: NlpPayeeConfirmationDataDto;
4646
+ /**
4647
+ * Overall confidence score (0-1)
4648
+ */
4649
+ confidence?: number;
4650
+ /**
4651
+ * Confidence threshold for automatic creation (default: 0.75). When confidence < threshold, action will be "confirm" requiring user verification.
4652
+ */
4653
+ confidenceThreshold?: number;
4654
+ /**
4655
+ * Recurring transaction match info (when action is "created"). Contains match details when transaction matches a pending expected transaction.
4656
+ */
4657
+ recurringMatch?: RecurringMatchInfoDto;
4658
+ /**
4659
+ * Recurring rule creation suggestion (when action is "created"). Contains suggestion to create a recurring rule based on detected patterns. Only present when no existing rule matched and similar historical transactions were found.
4660
+ */
4661
+ recurringSuggestion?: RecurringSuggestionDto;
4662
+ /**
4663
+ * Suggested accounts for this transaction (#586). confirm/confirm_rule/confirm_account: predicted (source/destination carry confidence); created: actual persisted accounts (confidence omitted). confirm_account destination is the suggested replacement, never the invalid account.
4664
+ */
4665
+ suggestedAccounts?: NlpSuggestedAccountsDto;
4666
+ /**
4667
+ * Default fallback accounts for the user/region (#586). v1 returns universal constants; per-user personalization is planned.
4668
+ */
4669
+ defaultAccounts?: NlpDefaultAccountsDto;
4670
+ };
4671
+
4672
+ /**
4673
+ * Response status
4674
+ */
4675
+ export type status4 = 'success' | 'pending' | 'error';
4676
+
4677
+ /**
4678
+ * Action taken or requested
4679
+ */
4680
+ export type action2 =
4681
+ | 'created'
4682
+ | 'ask'
4683
+ | 'confirm'
4684
+ | 'confirm_duplicate'
4685
+ | 'confirm_rule'
4686
+ | 'confirm_account'
4687
+ | 'confirm_payee'
4688
+ | 'cancel'
4689
+ | 'aborted';
4690
+
4691
+ /**
4692
+ * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4693
+ */
4694
+ export type intent = 'expense' | 'asset' | 'income' | 'liability' | 'equity';
4695
+
4696
+ /**
4697
+ * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4698
+ */
4699
+ export type assetSubType = 'transfer' | 'banking' | 'investment';
4700
+
4701
+ /**
4702
+ * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
4703
+ */
4704
+ export type liabilitySubType = 'borrow' | 'repay';
4705
+
4706
+ /**
4707
+ * Equity sub-type (only present when intent is "equity"). opening: account opening balance (Equity → Assets), adjustment: balance correction.
4708
+ */
4709
+ export type equitySubType = 'opening' | 'adjustment';
4710
+
4711
+ export type PlatformListItemDto = {
4712
+ /**
4713
+ * Global platform ID
4714
+ */
4715
+ id: string;
4716
+ /**
4717
+ * Platform name
4718
+ */
4719
+ name: string;
4720
+ /**
4721
+ * Platform URL
4722
+ */
4723
+ url: string;
4724
+ /**
4725
+ * Platform type
4726
+ */
4727
+ type:
4728
+ | 'BANK'
4729
+ | 'BROKERAGE'
4730
+ | 'CRYPTO_EXCHANGE'
4731
+ | 'PAYMENT'
4732
+ | 'INVESTMENT'
4733
+ | 'INSURANCE'
4734
+ | 'OTHER';
4735
+ /**
4736
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
4737
+ */
4738
+ canonical: string;
4739
+ /**
4740
+ * Suggested path segment — canonical with first char uppercased (ACC_COMP_NAME_RE)
4741
+ */
4742
+ suggestedSegment: string;
4743
+ /**
4744
+ * Logo URL
4337
4745
  */
4338
- ruleData?: NlpRuleConfirmationDataDto;
4746
+ logoUrl: string | null;
4339
4747
  /**
4340
- * Account validation data (when action is "confirm_account"). Contains information about invalid account for user correction.
4748
+ * Whether user has accounts using this platform
4341
4749
  */
4342
- accountData?: NlpAccountConfirmationDataDto;
4750
+ isBound: boolean;
4751
+ };
4752
+
4753
+ /**
4754
+ * Platform type
4755
+ */
4756
+ export type type3 =
4757
+ | 'BANK'
4758
+ | 'BROKERAGE'
4759
+ | 'CRYPTO_EXCHANGE'
4760
+ | 'PAYMENT'
4761
+ | 'INVESTMENT'
4762
+ | 'INSURANCE'
4763
+ | 'OTHER';
4764
+
4765
+ export type PlatformMatchResultDto = {
4343
4766
  /**
4344
- * Payee confirmation data (when action is "confirm_payee"). Contains information about medium/low confidence payee match for user confirmation.
4767
+ * Global platform ID
4345
4768
  */
4346
- payeeData?: NlpPayeeConfirmationDataDto;
4769
+ id: string;
4347
4770
  /**
4348
- * Overall confidence score (0-1)
4771
+ * Platform name (e.g., "ICBC")
4349
4772
  */
4350
- confidence?: number;
4773
+ name: string;
4351
4774
  /**
4352
- * Confidence threshold for automatic creation (default: 0.75). When confidence < threshold, action will be "confirm" requiring user verification.
4775
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
4353
4776
  */
4354
- confidenceThreshold?: number;
4777
+ canonical: string;
4355
4778
  /**
4356
- * Recurring transaction match info (when action is "created"). Contains match details when transaction matches a pending expected transaction.
4779
+ * Platform type
4357
4780
  */
4358
- recurringMatch?: RecurringMatchInfoDto;
4781
+ type:
4782
+ | 'BANK'
4783
+ | 'BROKERAGE'
4784
+ | 'CRYPTO_EXCHANGE'
4785
+ | 'PAYMENT'
4786
+ | 'INVESTMENT'
4787
+ | 'INSURANCE'
4788
+ | 'OTHER';
4359
4789
  /**
4360
- * Recurring rule creation suggestion (when action is "created"). Contains suggestion to create a recurring rule based on detected patterns. Only present when no existing rule matched and similar historical transactions were found.
4790
+ * Suggested path segment canonical, already in ACCOUNT_RE format
4361
4791
  */
4362
- recurringSuggestion?: RecurringSuggestionDto;
4792
+ suggestedSegment: string;
4363
4793
  /**
4364
- * Suggested accounts for this transaction. Contains recommended source and destination accounts based on the detected intent and rules.
4794
+ * Logo URL
4365
4795
  */
4366
- suggestedAccounts?: NlpSuggestedAccountsDto;
4796
+ logoUrl: string | null;
4367
4797
  /**
4368
- * Default accounts for the user/region. These are fallback accounts used when no specific suggestion is available.
4798
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4369
4799
  */
4370
- defaultAccounts?: NlpDefaultAccountsDto;
4800
+ matchType: 'exact' | 'prefix' | 'substring';
4371
4801
  };
4372
4802
 
4373
4803
  /**
4374
- * Response status
4375
- */
4376
- export type status4 = 'success' | 'pending' | 'error';
4377
-
4378
- /**
4379
- * Action taken or requested
4380
- */
4381
- export type action2 =
4382
- | 'created'
4383
- | 'ask'
4384
- | 'confirm'
4385
- | 'confirm_duplicate'
4386
- | 'confirm_rule'
4387
- | 'confirm_account'
4388
- | 'confirm_payee'
4389
- | 'cancel';
4390
-
4391
- /**
4392
- * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4393
- */
4394
- export type intent = 'expense' | 'asset' | 'income' | 'liability' | 'equity';
4395
-
4396
- /**
4397
- * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4804
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4398
4805
  */
4399
- export type assetSubType = 'transfer' | 'banking' | 'investment';
4806
+ export type matchType = 'exact' | 'prefix' | 'substring';
4400
4807
 
4401
- /**
4402
- * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
4403
- */
4404
- export type liabilitySubType = 'borrow' | 'repay';
4808
+ export type PlatformMatchResponseDto = {
4809
+ /**
4810
+ * Ranked matches, best tier first (at most 10 rows)
4811
+ */
4812
+ platforms: Array<PlatformMatchResultDto>;
4813
+ /**
4814
+ * Overall match quality — top row's tier, or 'none' when no hits
4815
+ */
4816
+ matchType: 'none' | 'exact' | 'prefix' | 'substring';
4817
+ /**
4818
+ * Total matches before LIMIT (truncation transparency)
4819
+ */
4820
+ total: number;
4821
+ /**
4822
+ * true when total > platforms.length (more matches exist)
4823
+ */
4824
+ hasMore: boolean;
4825
+ };
4405
4826
 
4406
4827
  /**
4407
- * Equity sub-type (only present when intent is "equity"). opening: account opening balance (Equity → Assets), adjustment: balance correction.
4828
+ * Overall match quality top row's tier, or 'none' when no hits
4408
4829
  */
4409
- export type equitySubType = 'opening' | 'adjustment';
4830
+ export type matchType2 = 'none' | 'exact' | 'prefix' | 'substring';
4410
4831
 
4411
4832
  export type CreatePlatformDto = {
4412
4833
  /**
@@ -4446,18 +4867,6 @@ export type CreatePlatformDto = {
4446
4867
  isActive?: boolean;
4447
4868
  };
4448
4869
 
4449
- /**
4450
- * Platform type
4451
- */
4452
- export type type3 =
4453
- | 'BANK'
4454
- | 'BROKERAGE'
4455
- | 'CRYPTO_EXCHANGE'
4456
- | 'PAYMENT'
4457
- | 'INVESTMENT'
4458
- | 'INSURANCE'
4459
- | 'OTHER';
4460
-
4461
4870
  export type UpdatePlatformDto = {
4462
4871
  /**
4463
4872
  * Platform name
@@ -5209,185 +5618,146 @@ export type HoldingPnlResponseDto = {
5209
5618
  */
5210
5619
  export type method = 'average' | 'FIFO';
5211
5620
 
5212
- export type CurrencyBalanceDto = {
5213
- /**
5214
- * ISO 4217 currency code
5215
- */
5216
- currency: string;
5217
- /**
5218
- * Balance amount
5219
- */
5220
- balance: string;
5221
- };
5222
-
5223
- export type TimeSeriesPointDto = {
5224
- /**
5225
- * Date in YYYY-MM-DD format
5226
- */
5227
- date: string;
5228
- /**
5229
- * Value at this date (in base currency)
5230
- */
5231
- value: string;
5232
- /**
5233
- * Change from previous point
5234
- */
5235
- change?: {
5236
- [key: string]: unknown;
5237
- };
5238
- /**
5239
- * Total assets at this date (in base currency)
5240
- */
5241
- assets?: string;
5242
- /**
5243
- * Total liabilities at this date (in base currency)
5244
- */
5245
- liabilities?: string;
5246
- /**
5247
- * Multi-currency breakdown for this point
5248
- */
5249
- byCurrency?: Array<CurrencyBalanceDto>;
5250
- };
5251
-
5252
- export type TrendSummaryDto = {
5253
- /**
5254
- * Value at start of period
5255
- */
5256
- startValue: string;
5257
- /**
5258
- * Value at end of period
5259
- */
5260
- endValue: string;
5261
- /**
5262
- * Total change over period
5263
- */
5264
- totalChange: string;
5621
+ export type AnonymousLoginDto = {
5265
5622
  /**
5266
- * Total change percentage
5623
+ * Access token for anonymous login
5267
5624
  */
5268
- totalChangePercentage: string;
5625
+ accessToken: string;
5269
5626
  };
5270
5627
 
5271
- export type MultiCurrencyPointDto = {
5272
- /**
5273
- * Date in YYYY-MM-DD format
5274
- */
5275
- date: string;
5628
+ export type AnonymousLoginResponseDto = {
5276
5629
  /**
5277
- * Balances by currency
5630
+ * JWT auth token
5278
5631
  */
5279
- byCurrency: Array<CurrencyBalanceDto>;
5632
+ authToken: string;
5280
5633
  };
5281
5634
 
5282
- export type PortfolioTrendsResponseDto = {
5283
- /**
5284
- * Time series data points
5285
- */
5286
- series: Array<TimeSeriesPointDto>;
5287
- /**
5288
- * Period summary
5289
- */
5290
- summary: TrendSummaryDto;
5291
- /**
5292
- * Period requested
5293
- */
5294
- period: string;
5635
+ export type SymbolSearchResultDto = {
5636
+ symbol: string;
5637
+ name?: {
5638
+ [key: string]: unknown;
5639
+ } | null;
5640
+ exchange?: {
5641
+ [key: string]: unknown;
5642
+ } | null;
5295
5643
  /**
5296
- * Data granularity
5644
+ * OpenBB asset_type (e.g. stock, etf)
5297
5645
  */
5298
- granularity: string;
5646
+ assetType?: {
5647
+ [key: string]: unknown;
5648
+ } | null;
5299
5649
  /**
5300
- * Base currency for converted values
5650
+ * IGN asset class (region.types.ts ASSET_CLASSES)
5301
5651
  */
5302
- currency: string;
5652
+ assetClass?: {
5653
+ [key: string]: unknown;
5654
+ } | null;
5303
5655
  /**
5304
- * Multi-currency time series (each point has currency breakdown)
5656
+ * IGN asset sub-class (region.types.ts ASSET_SUB_CLASSES)
5305
5657
  */
5306
- byCurrency?: Array<MultiCurrencyPointDto>;
5658
+ assetSubClass?: {
5659
+ [key: string]: unknown;
5660
+ } | null;
5307
5661
  /**
5308
- * Exchange rate warnings
5662
+ * Trading currency (extra_data or inferred from exchange)
5309
5663
  */
5310
- warnings?: Array<ExchangeRateWarningDto>;
5664
+ currency?: {
5665
+ [key: string]: unknown;
5666
+ } | null;
5311
5667
  };
5312
5668
 
5313
- export type CashFlowPointDto = {
5314
- /**
5315
- * Month key (YYYY-MM)
5316
- */
5317
- month: string;
5669
+ export type SymbolQuoteDto = {
5670
+ symbol?: string;
5671
+ name?: {
5672
+ [key: string]: unknown;
5673
+ } | null;
5674
+ exchange?: {
5675
+ [key: string]: unknown;
5676
+ } | null;
5318
5677
  /**
5319
- * Income in base currency (absolute, converted)
5678
+ * OpenBB asset_type
5320
5679
  */
5321
- income: string;
5680
+ assetType?: {
5681
+ [key: string]: unknown;
5682
+ } | null;
5322
5683
  /**
5323
- * Expense in base currency (absolute, converted)
5684
+ * IGN asset class
5324
5685
  */
5325
- expense: string;
5686
+ assetClass?: {
5687
+ [key: string]: unknown;
5688
+ } | null;
5326
5689
  /**
5327
- * netSavings = income − expense (savings positive)
5690
+ * IGN asset sub-class
5328
5691
  */
5329
- netSavings: string;
5330
- };
5331
-
5332
- export type CashFlowTrendSummaryDto = {
5692
+ assetSubClass?: {
5693
+ [key: string]: unknown;
5694
+ } | null;
5333
5695
  /**
5334
- * Total income across the period
5696
+ * Trading currency (extra_data or inferred from exchange)
5335
5697
  */
5336
- totalIncome: string;
5698
+ currency?: {
5699
+ [key: string]: unknown;
5700
+ } | null;
5337
5701
  /**
5338
- * Total expense across the period
5702
+ * Latest price (Decimal string)
5339
5703
  */
5340
- totalExpense: string;
5704
+ price?: {
5705
+ [key: string]: unknown;
5706
+ } | null;
5341
5707
  /**
5342
- * income expense across the period
5708
+ * Date the price was observed (ISO yyyy-MM-dd)
5343
5709
  */
5344
- totalNetSavings: string;
5710
+ priceDate?: {
5711
+ [key: string]: unknown;
5712
+ } | null;
5345
5713
  /**
5346
- * totalNetSavings divided by the window length (N months, incl. zero-filled)
5714
+ * Change vs previous close, in percentage points (1.7 == 1.7%). openbb stores change_percent as a normalized decimal; this exposes percentage points for frontend convenience.
5347
5715
  */
5348
- averageMonthlyNetSavings: string;
5349
- };
5350
-
5351
- export type CashFlowTrendsResponseDto = {
5716
+ changePercent?: {
5717
+ [key: string]: unknown;
5718
+ } | null;
5352
5719
  /**
5353
- * Monthly cash-flow series (fixed N-month window, zero-filled)
5720
+ * Previous close (Decimal string)
5354
5721
  */
5355
- series: Array<CashFlowPointDto>;
5722
+ prevClose?: {
5723
+ [key: string]: unknown;
5724
+ } | null;
5356
5725
  /**
5357
- * Period totals
5726
+ * Day open (Decimal string)
5358
5727
  */
5359
- summary: CashFlowTrendSummaryDto;
5728
+ open?: {
5729
+ [key: string]: unknown;
5730
+ } | null;
5360
5731
  /**
5361
- * Period requested
5732
+ * Day high (Decimal string)
5362
5733
  */
5363
- period: string;
5734
+ high?: {
5735
+ [key: string]: unknown;
5736
+ } | null;
5364
5737
  /**
5365
- * Data granularity (v1 returns month buckets)
5738
+ * Day low (Decimal string)
5366
5739
  */
5367
- granularity: string;
5740
+ low?: {
5741
+ [key: string]: unknown;
5742
+ } | null;
5368
5743
  /**
5369
- * Base currency for converted values
5744
+ * Day volume (Decimal string)
5370
5745
  */
5371
- currency: string;
5746
+ volume?: {
5747
+ [key: string]: unknown;
5748
+ } | null;
5372
5749
  /**
5373
- * Exchange rate warnings (e.g. missing rate for a currency)
5750
+ * 52-week high (Decimal string)
5374
5751
  */
5375
- warnings?: Array<ExchangeRateWarningDto>;
5376
- };
5377
-
5378
- export type GenerateSnapshotBody = unknown;
5379
-
5380
- export type GenerateSnapshotResponse = unknown;
5381
-
5382
- export type BackfillSnapshotsBody = unknown;
5383
-
5384
- export type BackfillSnapshotsResponse = unknown;
5385
-
5386
- export type AnonymousLoginDto = {
5752
+ yearHigh?: {
5753
+ [key: string]: unknown;
5754
+ } | null;
5387
5755
  /**
5388
- * Access token for anonymous login
5756
+ * 52-week low (Decimal string)
5389
5757
  */
5390
- accessToken: string;
5758
+ yearLow?: {
5759
+ [key: string]: unknown;
5760
+ } | null;
5391
5761
  };
5392
5762
 
5393
5763
  export type AccountControllerCreateData = {
@@ -5501,6 +5871,21 @@ export type AccountControllerReopenData = {
5501
5871
 
5502
5872
  export type AccountControllerReopenResponse = AccountResponseDto;
5503
5873
 
5874
+ export type AccountControllerAddOpeningBalanceData = {
5875
+ /**
5876
+ * Account UUID
5877
+ */
5878
+ id: string;
5879
+ /**
5880
+ * Region code for tenant context
5881
+ */
5882
+ region: 'cn' | 'us' | 'de' | 'gb';
5883
+ requestBody: CreateOpeningBalanceDto;
5884
+ };
5885
+
5886
+ export type AccountControllerAddOpeningBalanceResponse =
5887
+ OpeningBalanceResultDto;
5888
+
5504
5889
  export type AccountStandardsControllerGetTemplatesData = {
5505
5890
  /**
5506
5891
  * Region code (cn, us, de)
@@ -6421,237 +6806,298 @@ export type ForecastControllerGetForecastData = {
6421
6806
 
6422
6807
  export type ForecastControllerGetForecastResponse = ForecastResponseDto;
6423
6808
 
6424
- export type TransactionRuleControllerCreateData = {
6809
+ export type ReportingControllerGetPortfolioTrendsData = {
6810
+ /**
6811
+ * Data granularity
6812
+ */
6813
+ granularity?: 'day' | 'week' | 'month';
6814
+ /**
6815
+ * Time period
6816
+ */
6817
+ period?: '1m' | '3m' | '6m' | '1y';
6425
6818
  /**
6426
6819
  * Region code for tenant context
6427
6820
  */
6428
6821
  region: 'cn' | 'us' | 'de' | 'gb';
6429
- requestBody: CreateTransactionRuleDto;
6430
6822
  };
6431
6823
 
6432
- export type TransactionRuleControllerCreateResponse =
6433
- TransactionRuleResponseDto;
6824
+ export type ReportingControllerGetPortfolioTrendsResponse =
6825
+ PortfolioTrendsResponseDto;
6434
6826
 
6435
- export type TransactionRuleControllerListData = {
6436
- /**
6437
- * Filter by auto-apply status
6438
- */
6439
- autoApplyEnabled?: boolean;
6440
- /**
6441
- * Filter by enabled status
6442
- */
6443
- enabled?: boolean;
6444
- /**
6445
- * Filter by learning source. Omit this parameter or pass empty string to get manually created rules (learningSource is null in database).
6446
- */
6447
- learningSource?: 'NLP' | 'REVIEW_CENTER';
6827
+ export type ReportingControllerGetCashFlowTrendsData = {
6448
6828
  /**
6449
- * Max results per page (default: 20, max: 100)
6829
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6450
6830
  */
6451
- limit?: number;
6831
+ granularity?: 'day' | 'week' | 'month';
6452
6832
  /**
6453
- * Pagination offset (default: 0)
6833
+ * Time period
6454
6834
  */
6455
- offset?: number;
6835
+ period?: '1m' | '3m' | '6m' | '1y';
6456
6836
  /**
6457
6837
  * Region code for tenant context
6458
6838
  */
6459
6839
  region: 'cn' | 'us' | 'de' | 'gb';
6460
6840
  };
6461
6841
 
6462
- export type TransactionRuleControllerListResponse =
6463
- TransactionRuleListResponseDto;
6842
+ export type ReportingControllerGetCashFlowTrendsResponse =
6843
+ CashFlowTrendsResponseDto;
6464
6844
 
6465
- export type TransactionRuleControllerValidateData = {
6845
+ export type ReportingControllerGenerateSnapshotData = {
6466
6846
  /**
6467
6847
  * Region code for tenant context
6468
6848
  */
6469
6849
  region: 'cn' | 'us' | 'de' | 'gb';
6470
- requestBody: ValidateRuleDto;
6850
+ /**
6851
+ * Optional date (defaults to today)
6852
+ */
6853
+ requestBody: GenerateSnapshotBody;
6471
6854
  };
6472
6855
 
6473
- export type TransactionRuleControllerValidateResponse = ValidateRuleResponseDto;
6856
+ export type ReportingControllerGenerateSnapshotResponse =
6857
+ GenerateSnapshotResponse;
6474
6858
 
6475
- export type TransactionRuleControllerBulkCreateData = {
6859
+ export type ReportingControllerBackfillSnapshotsData = {
6476
6860
  /**
6477
6861
  * Region code for tenant context
6478
6862
  */
6479
6863
  region: 'cn' | 'us' | 'de' | 'gb';
6480
- requestBody: BulkCreateRulesDto;
6864
+ requestBody: BackfillSnapshotsBody;
6481
6865
  };
6482
6866
 
6483
- export type TransactionRuleControllerBulkCreateResponse =
6484
- BulkCreateRulesResponseDto;
6867
+ export type ReportingControllerBackfillSnapshotsResponse =
6868
+ BackfillSnapshotsResponse;
6485
6869
 
6486
- export type TransactionRuleControllerExportData = {
6870
+ export type UserControllerDeleteOwnUserData = {
6871
+ requestBody: DeleteOwnUserDto;
6872
+ };
6873
+
6874
+ export type UserControllerDeleteOwnUserResponse = void;
6875
+
6876
+ export type UserControllerGetUserData = {
6877
+ acceptLanguage: string;
6878
+ };
6879
+
6880
+ export type UserControllerGetUserResponse = unknown;
6881
+
6882
+ export type UserControllerSignupUserData = {
6883
+ requestBody: SignupDto;
6884
+ };
6885
+
6886
+ export type UserControllerSignupUserResponse = SignupResponseDto;
6887
+
6888
+ export type UserControllerDeleteUserData = {
6487
6889
  /**
6488
- * Export format (currently only JSON supported)
6890
+ * User ID to delete
6489
6891
  */
6490
- format: 'json';
6892
+ id: string;
6893
+ };
6894
+
6895
+ export type UserControllerDeleteUserResponse = void;
6896
+
6897
+ export type UserControllerGetUserInfoData = {
6491
6898
  /**
6492
- * Region code for tenant context
6899
+ * User ID
6493
6900
  */
6494
- region: 'cn' | 'us' | 'de' | 'gb';
6901
+ id: string;
6495
6902
  };
6496
6903
 
6497
- export type TransactionRuleControllerExportResponse = ExportRulesResponseDto;
6904
+ export type UserControllerGetUserInfoResponse = unknown;
6498
6905
 
6499
- export type TransactionRuleControllerGetStatisticsData = {
6906
+ export type UserControllerUpdateUserSettingData = {
6907
+ requestBody: UpdateUserSettingDto;
6908
+ };
6909
+
6910
+ export type UserControllerUpdateUserSettingResponse = unknown;
6911
+
6912
+ export type UserControllerGetAllUserSettingsByPageData = {
6500
6913
  /**
6501
- * Statistics time period
6914
+ * Page number
6502
6915
  */
6503
- period: '7d' | '30d' | '90d';
6916
+ pageNo: number;
6504
6917
  /**
6505
- * Region code for tenant context
6918
+ * Page size
6506
6919
  */
6507
- region: 'cn' | 'us' | 'de' | 'gb';
6920
+ pageSize: number;
6508
6921
  };
6509
6922
 
6510
- export type TransactionRuleControllerGetStatisticsResponse =
6511
- RuleStatisticsResponseDto;
6923
+ export type UserControllerGetAllUserSettingsByPageResponse = unknown;
6512
6924
 
6513
- export type TransactionRuleControllerGetDetailData = {
6514
- /**
6515
- * Region code for tenant context
6516
- */
6517
- region: 'cn' | 'us' | 'de' | 'gb';
6925
+ export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
6926
+
6927
+ export type PropertyControllerGetAllResponse = unknown;
6928
+
6929
+ export type PropertyControllerGetByKeyData = {
6518
6930
  /**
6519
- * Rule ID
6931
+ * Property key
6520
6932
  */
6521
- ruleId: string;
6933
+ key: string;
6522
6934
  };
6523
6935
 
6524
- export type TransactionRuleControllerGetDetailResponse =
6525
- TransactionRuleResponseDto;
6936
+ export type PropertyControllerGetByKeyResponse = unknown;
6526
6937
 
6527
- export type TransactionRuleControllerUpdateData = {
6938
+ export type PropertyControllerUpdateData = {
6528
6939
  /**
6529
- * Region code for tenant context
6940
+ * Property key
6530
6941
  */
6531
- region: 'cn' | 'us' | 'de' | 'gb';
6532
- requestBody: UpdateTransactionRuleDto;
6942
+ key: string;
6943
+ requestBody: UpdatePropertyDto;
6944
+ };
6945
+
6946
+ export type PropertyControllerUpdateResponse = unknown;
6947
+
6948
+ export type PropertyControllerDeleteData = {
6533
6949
  /**
6534
- * Rule ID to update
6950
+ * Property key
6535
6951
  */
6536
- ruleId: string;
6952
+ key: string;
6537
6953
  };
6538
6954
 
6539
- export type TransactionRuleControllerUpdateResponse =
6540
- TransactionRuleResponseDto;
6955
+ export type PropertyControllerDeleteResponse = void;
6541
6956
 
6542
- export type TransactionRuleControllerDeleteData = {
6957
+ export type TransactionRuleControllerCreateData = {
6543
6958
  /**
6544
6959
  * Region code for tenant context
6545
6960
  */
6546
6961
  region: 'cn' | 'us' | 'de' | 'gb';
6547
- /**
6548
- * Rule ID to delete
6549
- */
6550
- ruleId: string;
6962
+ requestBody: CreateTransactionRuleDto;
6551
6963
  };
6552
6964
 
6553
- export type TransactionRuleControllerDeleteResponse = void;
6965
+ export type TransactionRuleControllerCreateResponse =
6966
+ TransactionRuleResponseDto;
6554
6967
 
6555
- export type TransactionRuleControllerTestData = {
6968
+ export type TransactionRuleControllerListData = {
6556
6969
  /**
6557
- * Region code for tenant context
6970
+ * Filter by auto-apply status
6558
6971
  */
6559
- region: 'cn' | 'us' | 'de' | 'gb';
6560
- requestBody: TestRuleDto;
6972
+ autoApplyEnabled?: boolean;
6561
6973
  /**
6562
- * Rule ID to test
6974
+ * Filter by enabled status
6563
6975
  */
6564
- ruleId: string;
6565
- };
6566
-
6567
- export type TransactionRuleControllerTestResponse = TestRuleResponseDto;
6568
-
6569
- export type UserControllerDeleteOwnUserData = {
6570
- requestBody: DeleteOwnUserDto;
6976
+ enabled?: boolean;
6977
+ /**
6978
+ * Filter by learning source. Omit this parameter or pass empty string to get manually created rules (learningSource is null in database).
6979
+ */
6980
+ learningSource?: 'NLP' | 'REVIEW_CENTER';
6981
+ /**
6982
+ * Max results per page (default: 20, max: 100)
6983
+ */
6984
+ limit?: number;
6985
+ /**
6986
+ * Pagination offset (default: 0)
6987
+ */
6988
+ offset?: number;
6989
+ /**
6990
+ * Region code for tenant context
6991
+ */
6992
+ region: 'cn' | 'us' | 'de' | 'gb';
6571
6993
  };
6572
6994
 
6573
- export type UserControllerDeleteOwnUserResponse = void;
6995
+ export type TransactionRuleControllerListResponse =
6996
+ TransactionRuleListResponseDto;
6574
6997
 
6575
- export type UserControllerGetUserData = {
6576
- acceptLanguage: string;
6998
+ export type TransactionRuleControllerValidateData = {
6999
+ /**
7000
+ * Region code for tenant context
7001
+ */
7002
+ region: 'cn' | 'us' | 'de' | 'gb';
7003
+ requestBody: ValidateRuleDto;
6577
7004
  };
6578
7005
 
6579
- export type UserControllerGetUserResponse = unknown;
7006
+ export type TransactionRuleControllerValidateResponse = ValidateRuleResponseDto;
6580
7007
 
6581
- export type UserControllerSignupUserData = {
6582
- requestBody: SignupDto;
7008
+ export type TransactionRuleControllerBulkCreateData = {
7009
+ /**
7010
+ * Region code for tenant context
7011
+ */
7012
+ region: 'cn' | 'us' | 'de' | 'gb';
7013
+ requestBody: BulkCreateRulesDto;
6583
7014
  };
6584
7015
 
6585
- export type UserControllerSignupUserResponse = unknown;
7016
+ export type TransactionRuleControllerBulkCreateResponse =
7017
+ BulkCreateRulesResponseDto;
6586
7018
 
6587
- export type UserControllerDeleteUserData = {
7019
+ export type TransactionRuleControllerExportData = {
7020
+ /**
7021
+ * Export format (currently only JSON supported)
7022
+ */
7023
+ format: 'json';
6588
7024
  /**
6589
- * User ID to delete
7025
+ * Region code for tenant context
6590
7026
  */
6591
- id: string;
7027
+ region: 'cn' | 'us' | 'de' | 'gb';
6592
7028
  };
6593
7029
 
6594
- export type UserControllerDeleteUserResponse = void;
7030
+ export type TransactionRuleControllerExportResponse = ExportRulesResponseDto;
6595
7031
 
6596
- export type UserControllerGetUserInfoData = {
7032
+ export type TransactionRuleControllerGetStatisticsData = {
6597
7033
  /**
6598
- * User ID
7034
+ * Statistics time period
6599
7035
  */
6600
- id: string;
6601
- };
6602
-
6603
- export type UserControllerGetUserInfoResponse = unknown;
6604
-
6605
- export type UserControllerUpdateUserSettingData = {
6606
- requestBody: UpdateUserSettingDto;
7036
+ period: '7d' | '30d' | '90d';
7037
+ /**
7038
+ * Region code for tenant context
7039
+ */
7040
+ region: 'cn' | 'us' | 'de' | 'gb';
6607
7041
  };
6608
7042
 
6609
- export type UserControllerUpdateUserSettingResponse = unknown;
7043
+ export type TransactionRuleControllerGetStatisticsResponse =
7044
+ RuleStatisticsResponseDto;
6610
7045
 
6611
- export type UserControllerGetAllUserSettingsByPageData = {
7046
+ export type TransactionRuleControllerGetDetailData = {
6612
7047
  /**
6613
- * Page number
7048
+ * Region code for tenant context
6614
7049
  */
6615
- pageNo: number;
7050
+ region: 'cn' | 'us' | 'de' | 'gb';
6616
7051
  /**
6617
- * Page size
7052
+ * Rule ID
6618
7053
  */
6619
- pageSize: number;
7054
+ ruleId: string;
6620
7055
  };
6621
7056
 
6622
- export type UserControllerGetAllUserSettingsByPageResponse = unknown;
6623
-
6624
- export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
6625
-
6626
- export type PropertyControllerGetAllResponse = unknown;
7057
+ export type TransactionRuleControllerGetDetailResponse =
7058
+ TransactionRuleResponseDto;
6627
7059
 
6628
- export type PropertyControllerGetByKeyData = {
7060
+ export type TransactionRuleControllerUpdateData = {
6629
7061
  /**
6630
- * Property key
7062
+ * Region code for tenant context
6631
7063
  */
6632
- key: string;
7064
+ region: 'cn' | 'us' | 'de' | 'gb';
7065
+ requestBody: UpdateTransactionRuleDto;
7066
+ /**
7067
+ * Rule ID to update
7068
+ */
7069
+ ruleId: string;
6633
7070
  };
6634
7071
 
6635
- export type PropertyControllerGetByKeyResponse = unknown;
7072
+ export type TransactionRuleControllerUpdateResponse =
7073
+ TransactionRuleResponseDto;
6636
7074
 
6637
- export type PropertyControllerUpdateData = {
7075
+ export type TransactionRuleControllerDeleteData = {
6638
7076
  /**
6639
- * Property key
7077
+ * Region code for tenant context
6640
7078
  */
6641
- key: string;
6642
- requestBody: UpdatePropertyDto;
7079
+ region: 'cn' | 'us' | 'de' | 'gb';
7080
+ /**
7081
+ * Rule ID to delete
7082
+ */
7083
+ ruleId: string;
6643
7084
  };
6644
7085
 
6645
- export type PropertyControllerUpdateResponse = unknown;
7086
+ export type TransactionRuleControllerDeleteResponse = void;
6646
7087
 
6647
- export type PropertyControllerDeleteData = {
7088
+ export type TransactionRuleControllerTestData = {
6648
7089
  /**
6649
- * Property key
7090
+ * Region code for tenant context
6650
7091
  */
6651
- key: string;
7092
+ region: 'cn' | 'us' | 'de' | 'gb';
7093
+ requestBody: TestRuleDto;
7094
+ /**
7095
+ * Rule ID to test
7096
+ */
7097
+ ruleId: string;
6652
7098
  };
6653
7099
 
6654
- export type PropertyControllerDeleteResponse = void;
7100
+ export type TransactionRuleControllerTestResponse = TestRuleResponseDto;
6655
7101
 
6656
7102
  export type EventControllerCreateData = {
6657
7103
  /**
@@ -7066,7 +7512,8 @@ export type PlatformControllerCreateData = {
7066
7512
 
7067
7513
  export type PlatformControllerCreateResponse = unknown;
7068
7514
 
7069
- export type PlatformControllerGetPlatformListResponse = unknown;
7515
+ export type PlatformControllerGetPlatformListResponse =
7516
+ Array<PlatformListItemDto>;
7070
7517
 
7071
7518
  export type PlatformControllerMatchPlatformsData = {
7072
7519
  /**
@@ -7079,7 +7526,7 @@ export type PlatformControllerMatchPlatformsData = {
7079
7526
  region?: string;
7080
7527
  };
7081
7528
 
7082
- export type PlatformControllerMatchPlatformsResponse = unknown;
7529
+ export type PlatformControllerMatchPlatformsResponse = PlatformMatchResponseDto;
7083
7530
 
7084
7531
  export type PlatformControllerUpdateData = {
7085
7532
  /**
@@ -7197,74 +7644,13 @@ export type HoldingPnlControllerGetHoldingPnlData = {
7197
7644
 
7198
7645
  export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
7199
7646
 
7200
- export type ReportingControllerGetPortfolioTrendsData = {
7201
- /**
7202
- * Data granularity
7203
- */
7204
- granularity?: 'day' | 'week' | 'month';
7205
- /**
7206
- * Time period
7207
- */
7208
- period?: '1m' | '3m' | '6m' | '1y';
7209
- /**
7210
- * Region code for tenant context
7211
- */
7212
- region: 'cn' | 'us' | 'de' | 'gb';
7213
- };
7214
-
7215
- export type ReportingControllerGetPortfolioTrendsResponse =
7216
- PortfolioTrendsResponseDto;
7217
-
7218
- export type ReportingControllerGetCashFlowTrendsData = {
7219
- /**
7220
- * Data granularity (accepted for API symmetry; v1 returns month buckets)
7221
- */
7222
- granularity?: 'day' | 'week' | 'month';
7223
- /**
7224
- * Time period
7225
- */
7226
- period?: '1m' | '3m' | '6m' | '1y';
7227
- /**
7228
- * Region code for tenant context
7229
- */
7230
- region: 'cn' | 'us' | 'de' | 'gb';
7231
- };
7232
-
7233
- export type ReportingControllerGetCashFlowTrendsResponse =
7234
- CashFlowTrendsResponseDto;
7235
-
7236
- export type ReportingControllerGenerateSnapshotData = {
7237
- /**
7238
- * Region code for tenant context
7239
- */
7240
- region: 'cn' | 'us' | 'de' | 'gb';
7241
- /**
7242
- * Optional date (defaults to today)
7243
- */
7244
- requestBody: GenerateSnapshotBody;
7245
- };
7246
-
7247
- export type ReportingControllerGenerateSnapshotResponse =
7248
- GenerateSnapshotResponse;
7249
-
7250
- export type ReportingControllerBackfillSnapshotsData = {
7251
- /**
7252
- * Region code for tenant context
7253
- */
7254
- region: 'cn' | 'us' | 'de' | 'gb';
7255
- requestBody: BackfillSnapshotsBody;
7256
- };
7257
-
7258
- export type ReportingControllerBackfillSnapshotsResponse =
7259
- BackfillSnapshotsResponse;
7260
-
7261
7647
  export type ApiKeysControllerCreateApiKeyResponse = unknown;
7262
7648
 
7263
7649
  export type AuthControllerAccessTokenLoginData = {
7264
7650
  requestBody: AnonymousLoginDto;
7265
7651
  };
7266
7652
 
7267
- export type AuthControllerAccessTokenLoginResponse = unknown;
7653
+ export type AuthControllerAccessTokenLoginResponse = AnonymousLoginResponseDto;
7268
7654
 
7269
7655
  export type CacheControllerFlushCacheResponse = unknown;
7270
7656
 
@@ -7304,6 +7690,33 @@ export type HealthControllerGetMetricsResponse = unknown;
7304
7690
 
7305
7691
  export type InfoControllerGetInfoResponse = unknown;
7306
7692
 
7693
+ export type SymbolControllerSearchData = {
7694
+ /**
7695
+ * Filter by OpenBB asset_type (e.g. stock, etf)
7696
+ */
7697
+ assetType?: string;
7698
+ /**
7699
+ * Filter by exchange code (e.g. US, HK, SS, SZ)
7700
+ */
7701
+ exchange?: string;
7702
+ /**
7703
+ * Maximum number of results (clamped 1..50)
7704
+ */
7705
+ limit?: number;
7706
+ /**
7707
+ * Search term — matched against symbol and instrument name. Empty string returns [].
7708
+ */
7709
+ q: string;
7710
+ };
7711
+
7712
+ export type SymbolControllerSearchResponse = Array<SymbolSearchResultDto>;
7713
+
7714
+ export type SymbolControllerGetQuoteData = {
7715
+ symbol: string;
7716
+ };
7717
+
7718
+ export type SymbolControllerGetQuoteResponse = SymbolQuoteDto;
7719
+
7307
7720
  export type $OpenApiTs = {
7308
7721
  '/api/v1/{region}/bean/accounts': {
7309
7722
  post: {
@@ -7368,7 +7781,7 @@ export type $OpenApiTs = {
7368
7781
  */
7369
7782
  404: unknown;
7370
7783
  /**
7371
- * Account has transactions and cannot be deleted
7784
+ * Account has active transactions and cannot be deleted
7372
7785
  */
7373
7786
  409: unknown;
7374
7787
  };
@@ -7412,6 +7825,25 @@ export type $OpenApiTs = {
7412
7825
  };
7413
7826
  };
7414
7827
  };
7828
+ '/api/v1/{region}/bean/accounts/{id}/opening-balance': {
7829
+ post: {
7830
+ req: AccountControllerAddOpeningBalanceData;
7831
+ res: {
7832
+ /**
7833
+ * Opening-balance transaction created
7834
+ */
7835
+ 201: OpeningBalanceResultDto;
7836
+ /**
7837
+ * Account not found
7838
+ */
7839
+ 404: unknown;
7840
+ /**
7841
+ * An opening balance already exists for this account
7842
+ */
7843
+ 409: unknown;
7844
+ };
7845
+ };
7846
+ };
7415
7847
  '/api/v1/{region}/bean/account-standards': {
7416
7848
  get: {
7417
7849
  req: AccountStandardsControllerGetTemplatesData;
@@ -8326,425 +8758,497 @@ export type $OpenApiTs = {
8326
8758
  };
8327
8759
  '/api/v1/{region}/bean/expected-transactions/{id}/enter': {
8328
8760
  post: {
8329
- req: ExpectedTransactionControllerEnterNowData;
8761
+ req: ExpectedTransactionControllerEnterNowData;
8762
+ res: {
8763
+ /**
8764
+ * Transaction created successfully
8765
+ */
8766
+ 201: unknown;
8767
+ /**
8768
+ * Cannot enter - not in PENDING status or missing accounts
8769
+ */
8770
+ 400: unknown;
8771
+ /**
8772
+ * Expected transaction or accounts not found
8773
+ */
8774
+ 404: unknown;
8775
+ };
8776
+ };
8777
+ };
8778
+ '/api/v1/{region}/bean/recurring/forecast': {
8779
+ get: {
8780
+ req: ForecastControllerGetForecastData;
8781
+ res: {
8782
+ /**
8783
+ * Forecast retrieved successfully
8784
+ */
8785
+ 200: ForecastResponseDto;
8786
+ };
8787
+ };
8788
+ };
8789
+ '/api/v1/{region}/reporting/portfolio/trends': {
8790
+ get: {
8791
+ req: ReportingControllerGetPortfolioTrendsData;
8792
+ res: {
8793
+ /**
8794
+ * Trends retrieved successfully
8795
+ */
8796
+ 200: PortfolioTrendsResponseDto;
8797
+ /**
8798
+ * User not authenticated
8799
+ */
8800
+ 401: unknown;
8801
+ };
8802
+ };
8803
+ };
8804
+ '/api/v1/{region}/reporting/cash-flow/trends': {
8805
+ get: {
8806
+ req: ReportingControllerGetCashFlowTrendsData;
8807
+ res: {
8808
+ /**
8809
+ * Cash-flow trends retrieved successfully
8810
+ */
8811
+ 200: CashFlowTrendsResponseDto;
8812
+ /**
8813
+ * User not authenticated
8814
+ */
8815
+ 401: unknown;
8816
+ };
8817
+ };
8818
+ };
8819
+ '/api/v1/{region}/reporting/snapshots/generate': {
8820
+ post: {
8821
+ req: ReportingControllerGenerateSnapshotData;
8822
+ res: {
8823
+ /**
8824
+ * Snapshot generated successfully
8825
+ */
8826
+ 200: GenerateSnapshotResponse;
8827
+ /**
8828
+ * Invalid date format
8829
+ */
8830
+ 400: unknown;
8831
+ /**
8832
+ * User not authenticated
8833
+ */
8834
+ 401: unknown;
8835
+ };
8836
+ };
8837
+ };
8838
+ '/api/v1/{region}/reporting/snapshots/backfill': {
8839
+ post: {
8840
+ req: ReportingControllerBackfillSnapshotsData;
8330
8841
  res: {
8331
8842
  /**
8332
- * Transaction created successfully
8843
+ * Backfill completed successfully
8333
8844
  */
8334
- 201: unknown;
8845
+ 200: BackfillSnapshotsResponse;
8335
8846
  /**
8336
- * Cannot enter - not in PENDING status or missing accounts
8847
+ * Invalid date format or range
8337
8848
  */
8338
8849
  400: unknown;
8339
8850
  /**
8340
- * Expected transaction or accounts not found
8851
+ * User not authenticated
8341
8852
  */
8342
- 404: unknown;
8343
- };
8344
- };
8345
- };
8346
- '/api/v1/{region}/bean/recurring/forecast': {
8347
- get: {
8348
- req: ForecastControllerGetForecastData;
8349
- res: {
8853
+ 401: unknown;
8350
8854
  /**
8351
- * Forecast retrieved successfully
8855
+ * Backfill already in progress for this user
8352
8856
  */
8353
- 200: ForecastResponseDto;
8857
+ 409: unknown;
8354
8858
  };
8355
8859
  };
8356
8860
  };
8357
- '/api/v1/{region}/bean/transaction-rules': {
8358
- post: {
8359
- req: TransactionRuleControllerCreateData;
8861
+ '/api/v1/users': {
8862
+ delete: {
8863
+ req: UserControllerDeleteOwnUserData;
8360
8864
  res: {
8361
8865
  /**
8362
- * Rule updated successfully (upsert mode)
8363
- */
8364
- 200: TransactionRuleResponseDto;
8365
- /**
8366
- * Validation failed
8367
- */
8368
- 400: ApiProblemResponseDto;
8369
- /**
8370
- * Unauthorized
8866
+ * User deleted successfully
8371
8867
  */
8372
- 401: ApiProblemResponseDto;
8868
+ 204: void;
8373
8869
  /**
8374
- * Resource conflict - another process is updating this rule
8870
+ * Invalid access token
8375
8871
  */
8376
- 409: ApiProblemResponseDto;
8872
+ 403: unknown;
8377
8873
  };
8378
8874
  };
8379
8875
  get: {
8380
- req: TransactionRuleControllerListData;
8876
+ req: UserControllerGetUserData;
8381
8877
  res: {
8382
8878
  /**
8383
- * List of rules
8384
- */
8385
- 200: TransactionRuleListResponseDto;
8386
- /**
8387
- * Unauthorized
8879
+ * User retrieved successfully
8388
8880
  */
8389
- 401: ApiProblemResponseDto;
8881
+ 200: unknown;
8390
8882
  };
8391
8883
  };
8392
- };
8393
- '/api/v1/{region}/bean/transaction-rules/validate': {
8394
8884
  post: {
8395
- req: TransactionRuleControllerValidateData;
8885
+ req: UserControllerSignupUserData;
8396
8886
  res: {
8397
8887
  /**
8398
- * Validation result
8888
+ * User created successfully
8399
8889
  */
8400
- 200: ValidateRuleResponseDto;
8890
+ 201: SignupResponseDto;
8401
8891
  /**
8402
- * Validation failed
8892
+ * Invalid Turnstile token (when Turnstile is enabled)
8403
8893
  */
8404
- 400: ApiProblemResponseDto;
8894
+ 400: unknown;
8405
8895
  /**
8406
- * Unauthorized
8896
+ * User signup is disabled
8407
8897
  */
8408
- 401: ApiProblemResponseDto;
8898
+ 403: unknown;
8409
8899
  };
8410
8900
  };
8411
8901
  };
8412
- '/api/v1/{region}/bean/transaction-rules/bulk': {
8413
- post: {
8414
- req: TransactionRuleControllerBulkCreateData;
8902
+ '/api/v1/users/{id}': {
8903
+ delete: {
8904
+ req: UserControllerDeleteUserData;
8415
8905
  res: {
8416
8906
  /**
8417
- * Bulk create completed
8418
- */
8419
- 201: BulkCreateRulesResponseDto;
8420
- /**
8421
- * Invalid bulk create data
8907
+ * User deleted successfully
8422
8908
  */
8423
- 400: ApiProblemResponseDto;
8909
+ 204: void;
8424
8910
  /**
8425
- * Unauthorized
8911
+ * Cannot delete own account or insufficient permissions
8426
8912
  */
8427
- 401: ApiProblemResponseDto;
8913
+ 403: unknown;
8428
8914
  };
8429
8915
  };
8430
8916
  };
8431
- '/api/v1/{region}/bean/transaction-rules/export/{format}': {
8917
+ '/api/v1/users/{id}/info': {
8432
8918
  get: {
8433
- req: TransactionRuleControllerExportData;
8919
+ req: UserControllerGetUserInfoData;
8434
8920
  res: {
8435
8921
  /**
8436
- * Exported rules
8437
- */
8438
- 200: ExportRulesResponseDto;
8439
- /**
8440
- * Unsupported format
8922
+ * User info retrieved successfully
8441
8923
  */
8442
- 400: ApiProblemResponseDto;
8924
+ 200: unknown;
8443
8925
  /**
8444
- * Unauthorized
8926
+ * Cannot access other user info without admin permission
8445
8927
  */
8446
- 401: ApiProblemResponseDto;
8928
+ 403: unknown;
8447
8929
  };
8448
8930
  };
8449
8931
  };
8450
- '/api/v1/{region}/bean/transaction-rules/statistics/{period}': {
8451
- get: {
8452
- req: TransactionRuleControllerGetStatisticsData;
8932
+ '/api/v1/users/setting': {
8933
+ put: {
8934
+ req: UserControllerUpdateUserSettingData;
8453
8935
  res: {
8454
8936
  /**
8455
- * Rule statistics
8937
+ * Settings updated successfully
8456
8938
  */
8457
- 200: RuleStatisticsResponseDto;
8939
+ 200: unknown;
8458
8940
  /**
8459
- * Unauthorized
8941
+ * Insufficient permissions
8460
8942
  */
8461
- 401: ApiProblemResponseDto;
8943
+ 403: unknown;
8462
8944
  };
8463
8945
  };
8464
8946
  };
8465
- '/api/v1/{region}/bean/transaction-rules/{ruleId}': {
8947
+ '/api/v1/users/settings-by-page': {
8466
8948
  get: {
8467
- req: TransactionRuleControllerGetDetailData;
8949
+ req: UserControllerGetAllUserSettingsByPageData;
8468
8950
  res: {
8469
8951
  /**
8470
- * Rule details
8471
- */
8472
- 200: TransactionRuleResponseDto;
8473
- /**
8474
- * Unauthorized
8475
- */
8476
- 401: ApiProblemResponseDto;
8477
- /**
8478
- * Forbidden - not owner of rule
8479
- */
8480
- 403: ApiProblemResponseDto;
8481
- /**
8482
- * Rule not found
8952
+ * Settings list retrieved successfully
8483
8953
  */
8484
- 404: ApiProblemResponseDto;
8954
+ 200: unknown;
8485
8955
  };
8486
8956
  };
8487
- put: {
8488
- req: TransactionRuleControllerUpdateData;
8957
+ };
8958
+ '/api/v1/users/asset-liability-summary': {
8959
+ get: {
8489
8960
  res: {
8490
8961
  /**
8491
- * Rule updated successfully
8962
+ * Summary retrieved successfully
8492
8963
  */
8493
- 200: TransactionRuleResponseDto;
8964
+ 200: unknown;
8965
+ };
8966
+ };
8967
+ };
8968
+ '/api/v1/admin/properties': {
8969
+ get: {
8970
+ res: {
8494
8971
  /**
8495
- * Validation failed
8972
+ * Properties retrieved successfully
8496
8973
  */
8497
- 400: ApiProblemResponseDto;
8974
+ 200: unknown;
8498
8975
  /**
8499
8976
  * Unauthorized
8500
8977
  */
8501
- 401: ApiProblemResponseDto;
8502
- /**
8503
- * Forbidden - not owner of rule
8504
- */
8505
- 403: ApiProblemResponseDto;
8506
- /**
8507
- * Rule not found
8508
- */
8509
- 404: ApiProblemResponseDto;
8978
+ 401: unknown;
8510
8979
  /**
8511
- * Resource conflict - rule is being modified by another process
8980
+ * Forbidden - insufficient permissions
8512
8981
  */
8513
- 409: ApiProblemResponseDto;
8982
+ 403: unknown;
8514
8983
  };
8515
8984
  };
8516
- delete: {
8517
- req: TransactionRuleControllerDeleteData;
8985
+ };
8986
+ '/api/v1/admin/properties/{key}': {
8987
+ get: {
8988
+ req: PropertyControllerGetByKeyData;
8518
8989
  res: {
8519
8990
  /**
8520
- * Rule deleted successfully
8991
+ * Property retrieved successfully
8521
8992
  */
8522
- 204: void;
8993
+ 200: unknown;
8523
8994
  /**
8524
8995
  * Unauthorized
8525
8996
  */
8526
- 401: ApiProblemResponseDto;
8527
- /**
8528
- * Forbidden - not owner of rule
8529
- */
8530
- 403: ApiProblemResponseDto;
8997
+ 401: unknown;
8531
8998
  /**
8532
- * Rule not found
8999
+ * Forbidden - insufficient permissions
8533
9000
  */
8534
- 404: ApiProblemResponseDto;
9001
+ 403: unknown;
8535
9002
  /**
8536
- * Resource conflict - rule is being modified by another process
9003
+ * Property not found
8537
9004
  */
8538
- 409: ApiProblemResponseDto;
9005
+ 404: unknown;
8539
9006
  };
8540
9007
  };
8541
- };
8542
- '/api/v1/{region}/bean/transaction-rules/{ruleId}/test': {
8543
- post: {
8544
- req: TransactionRuleControllerTestData;
9008
+ put: {
9009
+ req: PropertyControllerUpdateData;
8545
9010
  res: {
8546
9011
  /**
8547
- * Test result
9012
+ * Property updated successfully
8548
9013
  */
8549
- 200: TestRuleResponseDto;
9014
+ 200: unknown;
8550
9015
  /**
8551
9016
  * Unauthorized
8552
9017
  */
8553
- 401: ApiProblemResponseDto;
8554
- /**
8555
- * Forbidden - not owner of rule
8556
- */
8557
- 403: ApiProblemResponseDto;
9018
+ 401: unknown;
8558
9019
  /**
8559
- * Rule not found
9020
+ * Forbidden - insufficient permissions
8560
9021
  */
8561
- 404: ApiProblemResponseDto;
9022
+ 403: unknown;
8562
9023
  };
8563
9024
  };
8564
- };
8565
- '/api/v1/users': {
8566
9025
  delete: {
8567
- req: UserControllerDeleteOwnUserData;
9026
+ req: PropertyControllerDeleteData;
8568
9027
  res: {
8569
9028
  /**
8570
- * User deleted successfully
9029
+ * Property deleted successfully
8571
9030
  */
8572
9031
  204: void;
8573
9032
  /**
8574
- * Invalid access token
9033
+ * Unauthorized
9034
+ */
9035
+ 401: unknown;
9036
+ /**
9037
+ * Forbidden - insufficient permissions
8575
9038
  */
8576
9039
  403: unknown;
8577
- };
8578
- };
8579
- get: {
8580
- req: UserControllerGetUserData;
8581
- res: {
8582
9040
  /**
8583
- * User retrieved successfully
9041
+ * Property not found
8584
9042
  */
8585
- 200: unknown;
9043
+ 404: unknown;
8586
9044
  };
8587
9045
  };
9046
+ };
9047
+ '/api/v1/{region}/bean/transaction-rules': {
8588
9048
  post: {
8589
- req: UserControllerSignupUserData;
9049
+ req: TransactionRuleControllerCreateData;
8590
9050
  res: {
8591
9051
  /**
8592
- * User created successfully
9052
+ * Rule updated successfully (upsert mode)
8593
9053
  */
8594
- 201: unknown;
9054
+ 200: TransactionRuleResponseDto;
8595
9055
  /**
8596
- * Invalid Turnstile token (when Turnstile is enabled)
9056
+ * Validation failed
8597
9057
  */
8598
- 400: unknown;
9058
+ 400: ApiProblemResponseDto;
8599
9059
  /**
8600
- * User signup is disabled
9060
+ * Unauthorized
8601
9061
  */
8602
- 403: unknown;
9062
+ 401: ApiProblemResponseDto;
9063
+ /**
9064
+ * Resource conflict - another process is updating this rule
9065
+ */
9066
+ 409: ApiProblemResponseDto;
8603
9067
  };
8604
9068
  };
8605
- };
8606
- '/api/v1/users/{id}': {
8607
- delete: {
8608
- req: UserControllerDeleteUserData;
9069
+ get: {
9070
+ req: TransactionRuleControllerListData;
8609
9071
  res: {
8610
9072
  /**
8611
- * User deleted successfully
9073
+ * List of rules
8612
9074
  */
8613
- 204: void;
9075
+ 200: TransactionRuleListResponseDto;
8614
9076
  /**
8615
- * Cannot delete own account or insufficient permissions
9077
+ * Unauthorized
8616
9078
  */
8617
- 403: unknown;
9079
+ 401: ApiProblemResponseDto;
8618
9080
  };
8619
9081
  };
8620
9082
  };
8621
- '/api/v1/users/{id}/info': {
8622
- get: {
8623
- req: UserControllerGetUserInfoData;
9083
+ '/api/v1/{region}/bean/transaction-rules/validate': {
9084
+ post: {
9085
+ req: TransactionRuleControllerValidateData;
8624
9086
  res: {
8625
9087
  /**
8626
- * User info retrieved successfully
9088
+ * Validation result
8627
9089
  */
8628
- 200: unknown;
9090
+ 200: ValidateRuleResponseDto;
8629
9091
  /**
8630
- * Cannot access other user info without admin permission
9092
+ * Validation failed
8631
9093
  */
8632
- 403: unknown;
9094
+ 400: ApiProblemResponseDto;
9095
+ /**
9096
+ * Unauthorized
9097
+ */
9098
+ 401: ApiProblemResponseDto;
8633
9099
  };
8634
9100
  };
8635
9101
  };
8636
- '/api/v1/users/setting': {
8637
- put: {
8638
- req: UserControllerUpdateUserSettingData;
9102
+ '/api/v1/{region}/bean/transaction-rules/bulk': {
9103
+ post: {
9104
+ req: TransactionRuleControllerBulkCreateData;
8639
9105
  res: {
8640
9106
  /**
8641
- * Settings updated successfully
9107
+ * Bulk create completed
8642
9108
  */
8643
- 200: unknown;
9109
+ 201: BulkCreateRulesResponseDto;
8644
9110
  /**
8645
- * Insufficient permissions
9111
+ * Invalid bulk create data
8646
9112
  */
8647
- 403: unknown;
9113
+ 400: ApiProblemResponseDto;
9114
+ /**
9115
+ * Unauthorized
9116
+ */
9117
+ 401: ApiProblemResponseDto;
8648
9118
  };
8649
9119
  };
8650
9120
  };
8651
- '/api/v1/users/settings-by-page': {
9121
+ '/api/v1/{region}/bean/transaction-rules/export/{format}': {
8652
9122
  get: {
8653
- req: UserControllerGetAllUserSettingsByPageData;
9123
+ req: TransactionRuleControllerExportData;
8654
9124
  res: {
8655
9125
  /**
8656
- * Settings list retrieved successfully
9126
+ * Exported rules
8657
9127
  */
8658
- 200: unknown;
9128
+ 200: ExportRulesResponseDto;
9129
+ /**
9130
+ * Unsupported format
9131
+ */
9132
+ 400: ApiProblemResponseDto;
9133
+ /**
9134
+ * Unauthorized
9135
+ */
9136
+ 401: ApiProblemResponseDto;
8659
9137
  };
8660
9138
  };
8661
9139
  };
8662
- '/api/v1/users/asset-liability-summary': {
9140
+ '/api/v1/{region}/bean/transaction-rules/statistics/{period}': {
8663
9141
  get: {
9142
+ req: TransactionRuleControllerGetStatisticsData;
8664
9143
  res: {
8665
9144
  /**
8666
- * Summary retrieved successfully
9145
+ * Rule statistics
8667
9146
  */
8668
- 200: unknown;
9147
+ 200: RuleStatisticsResponseDto;
9148
+ /**
9149
+ * Unauthorized
9150
+ */
9151
+ 401: ApiProblemResponseDto;
8669
9152
  };
8670
9153
  };
8671
9154
  };
8672
- '/api/v1/admin/properties': {
9155
+ '/api/v1/{region}/bean/transaction-rules/{ruleId}': {
8673
9156
  get: {
9157
+ req: TransactionRuleControllerGetDetailData;
8674
9158
  res: {
8675
9159
  /**
8676
- * Properties retrieved successfully
9160
+ * Rule details
8677
9161
  */
8678
- 200: unknown;
9162
+ 200: TransactionRuleResponseDto;
8679
9163
  /**
8680
9164
  * Unauthorized
8681
9165
  */
8682
- 401: unknown;
9166
+ 401: ApiProblemResponseDto;
8683
9167
  /**
8684
- * Forbidden - insufficient permissions
9168
+ * Forbidden - not owner of rule
8685
9169
  */
8686
- 403: unknown;
9170
+ 403: ApiProblemResponseDto;
9171
+ /**
9172
+ * Rule not found
9173
+ */
9174
+ 404: ApiProblemResponseDto;
8687
9175
  };
8688
9176
  };
8689
- };
8690
- '/api/v1/admin/properties/{key}': {
8691
- get: {
8692
- req: PropertyControllerGetByKeyData;
9177
+ put: {
9178
+ req: TransactionRuleControllerUpdateData;
8693
9179
  res: {
8694
9180
  /**
8695
- * Property retrieved successfully
9181
+ * Rule updated successfully
8696
9182
  */
8697
- 200: unknown;
9183
+ 200: TransactionRuleResponseDto;
9184
+ /**
9185
+ * Validation failed
9186
+ */
9187
+ 400: ApiProblemResponseDto;
8698
9188
  /**
8699
9189
  * Unauthorized
8700
9190
  */
8701
- 401: unknown;
9191
+ 401: ApiProblemResponseDto;
8702
9192
  /**
8703
- * Forbidden - insufficient permissions
9193
+ * Forbidden - not owner of rule
8704
9194
  */
8705
- 403: unknown;
9195
+ 403: ApiProblemResponseDto;
8706
9196
  /**
8707
- * Property not found
9197
+ * Rule not found
8708
9198
  */
8709
- 404: unknown;
9199
+ 404: ApiProblemResponseDto;
9200
+ /**
9201
+ * Resource conflict - rule is being modified by another process
9202
+ */
9203
+ 409: ApiProblemResponseDto;
8710
9204
  };
8711
9205
  };
8712
- put: {
8713
- req: PropertyControllerUpdateData;
9206
+ delete: {
9207
+ req: TransactionRuleControllerDeleteData;
8714
9208
  res: {
8715
9209
  /**
8716
- * Property updated successfully
9210
+ * Rule deleted successfully
8717
9211
  */
8718
- 200: unknown;
9212
+ 204: void;
8719
9213
  /**
8720
9214
  * Unauthorized
8721
9215
  */
8722
- 401: unknown;
9216
+ 401: ApiProblemResponseDto;
8723
9217
  /**
8724
- * Forbidden - insufficient permissions
9218
+ * Forbidden - not owner of rule
8725
9219
  */
8726
- 403: unknown;
9220
+ 403: ApiProblemResponseDto;
9221
+ /**
9222
+ * Rule not found
9223
+ */
9224
+ 404: ApiProblemResponseDto;
9225
+ /**
9226
+ * Resource conflict - rule is being modified by another process
9227
+ */
9228
+ 409: ApiProblemResponseDto;
8727
9229
  };
8728
9230
  };
8729
- delete: {
8730
- req: PropertyControllerDeleteData;
9231
+ };
9232
+ '/api/v1/{region}/bean/transaction-rules/{ruleId}/test': {
9233
+ post: {
9234
+ req: TransactionRuleControllerTestData;
8731
9235
  res: {
8732
9236
  /**
8733
- * Property deleted successfully
9237
+ * Test result
8734
9238
  */
8735
- 204: void;
9239
+ 200: TestRuleResponseDto;
8736
9240
  /**
8737
9241
  * Unauthorized
8738
9242
  */
8739
- 401: unknown;
9243
+ 401: ApiProblemResponseDto;
8740
9244
  /**
8741
- * Forbidden - insufficient permissions
9245
+ * Forbidden - not owner of rule
8742
9246
  */
8743
- 403: unknown;
9247
+ 403: ApiProblemResponseDto;
8744
9248
  /**
8745
- * Property not found
9249
+ * Rule not found
8746
9250
  */
8747
- 404: unknown;
9251
+ 404: ApiProblemResponseDto;
8748
9252
  };
8749
9253
  };
8750
9254
  };
@@ -9291,7 +9795,7 @@ export type $OpenApiTs = {
9291
9795
  /**
9292
9796
  * List of platforms with user binding status
9293
9797
  */
9294
- 200: unknown;
9798
+ 200: Array<PlatformListItemDto>;
9295
9799
  };
9296
9800
  };
9297
9801
  };
@@ -9300,9 +9804,9 @@ export type $OpenApiTs = {
9300
9804
  req: PlatformControllerMatchPlatformsData;
9301
9805
  res: {
9302
9806
  /**
9303
- * List of matching platforms with suggested segment names
9807
+ * Matching platforms with overall match type and truncation flag
9304
9808
  */
9305
- 200: unknown;
9809
+ 200: PlatformMatchResponseDto;
9306
9810
  };
9307
9811
  };
9308
9812
  };
@@ -9424,78 +9928,6 @@ export type $OpenApiTs = {
9424
9928
  };
9425
9929
  };
9426
9930
  };
9427
- '/api/v1/{region}/reporting/portfolio/trends': {
9428
- get: {
9429
- req: ReportingControllerGetPortfolioTrendsData;
9430
- res: {
9431
- /**
9432
- * Trends retrieved successfully
9433
- */
9434
- 200: PortfolioTrendsResponseDto;
9435
- /**
9436
- * User not authenticated
9437
- */
9438
- 401: unknown;
9439
- };
9440
- };
9441
- };
9442
- '/api/v1/{region}/reporting/cash-flow/trends': {
9443
- get: {
9444
- req: ReportingControllerGetCashFlowTrendsData;
9445
- res: {
9446
- /**
9447
- * Cash-flow trends retrieved successfully
9448
- */
9449
- 200: CashFlowTrendsResponseDto;
9450
- /**
9451
- * User not authenticated
9452
- */
9453
- 401: unknown;
9454
- };
9455
- };
9456
- };
9457
- '/api/v1/{region}/reporting/snapshots/generate': {
9458
- post: {
9459
- req: ReportingControllerGenerateSnapshotData;
9460
- res: {
9461
- /**
9462
- * Snapshot generated successfully
9463
- */
9464
- 200: GenerateSnapshotResponse;
9465
- /**
9466
- * Invalid date format
9467
- */
9468
- 400: unknown;
9469
- /**
9470
- * User not authenticated
9471
- */
9472
- 401: unknown;
9473
- };
9474
- };
9475
- };
9476
- '/api/v1/{region}/reporting/snapshots/backfill': {
9477
- post: {
9478
- req: ReportingControllerBackfillSnapshotsData;
9479
- res: {
9480
- /**
9481
- * Backfill completed successfully
9482
- */
9483
- 200: BackfillSnapshotsResponse;
9484
- /**
9485
- * Invalid date format or range
9486
- */
9487
- 400: unknown;
9488
- /**
9489
- * User not authenticated
9490
- */
9491
- 401: unknown;
9492
- /**
9493
- * Backfill already in progress for this user
9494
- */
9495
- 409: unknown;
9496
- };
9497
- };
9498
- };
9499
9931
  '/api/v1/auth/api-keys': {
9500
9932
  post: {
9501
9933
  res: {
@@ -9517,7 +9949,7 @@ export type $OpenApiTs = {
9517
9949
  /**
9518
9950
  * Login successful
9519
9951
  */
9520
- 200: unknown;
9952
+ 200: AnonymousLoginResponseDto;
9521
9953
  /**
9522
9954
  * Invalid access token
9523
9955
  */
@@ -9664,4 +10096,30 @@ export type $OpenApiTs = {
9664
10096
  };
9665
10097
  };
9666
10098
  };
10099
+ '/api/v1/market/symbols/search': {
10100
+ get: {
10101
+ req: SymbolControllerSearchData;
10102
+ res: {
10103
+ /**
10104
+ * Ranked search results
10105
+ */
10106
+ 200: Array<SymbolSearchResultDto>;
10107
+ };
10108
+ };
10109
+ };
10110
+ '/api/v1/market/symbols/{symbol}/quote': {
10111
+ get: {
10112
+ req: SymbolControllerGetQuoteData;
10113
+ res: {
10114
+ /**
10115
+ * Symbol quote
10116
+ */
10117
+ 200: SymbolQuoteDto;
10118
+ /**
10119
+ * Symbol not found in the openbb catalog
10120
+ */
10121
+ 404: unknown;
10122
+ };
10123
+ };
10124
+ };
9667
10125
  };