@firela/api-types 0.0.0-canary.a90ce0e4 → 0.0.0-canary.a9f0aa08

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.
@@ -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
  */
@@ -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
  */
@@ -2701,384 +2775,223 @@ export type ForecastResponseDto = {
2701
2775
  periodEnd: string;
2702
2776
  };
2703
2777
 
2704
- export type CreateTransactionRuleDto = {
2705
- name: string;
2706
- description?: string;
2707
- narrationKeywords?: Array<unknown[]>;
2708
- payeeKeywords?: Array<unknown[]>;
2709
- categoryKeywords?: Array<unknown[]>;
2778
+ export type CurrencyBalanceDto = {
2710
2779
  /**
2711
- * Payment method keywords (e.g., HuaBei, YuEBao)
2780
+ * ISO 4217 currency code
2712
2781
  */
2713
- methodKeywords?: Array<unknown[]>;
2782
+ currency: string;
2714
2783
  /**
2715
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2784
+ * Balance amount
2716
2785
  */
2717
- categoryAccount?: string;
2718
- matchLogic: 'OR' | 'AND';
2786
+ balance: string;
2787
+ };
2788
+
2789
+ export type TimeSeriesPointDto = {
2719
2790
  /**
2720
- * Minimum transaction amount (inclusive)
2791
+ * Date in YYYY-MM-DD format
2721
2792
  */
2722
- amountMin?: number;
2793
+ date: string;
2723
2794
  /**
2724
- * Maximum transaction amount (inclusive)
2795
+ * Value at this date (in base currency)
2725
2796
  */
2726
- amountMax?: number;
2727
- priority: number;
2728
- additionalTags?: Array<unknown[]>;
2729
- additionalMetadata?: {
2797
+ value: string;
2798
+ /**
2799
+ * Change from previous point
2800
+ */
2801
+ change?: {
2730
2802
  [key: string]: unknown;
2731
2803
  };
2732
2804
  /**
2733
- * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
2805
+ * Total assets at this date (in base currency)
2734
2806
  */
2735
- upsertByPayee?: boolean;
2736
- };
2737
-
2738
- export type matchLogic = 'OR' | 'AND';
2739
-
2740
- export type AmountRangeDto = {
2807
+ assets?: string;
2741
2808
  /**
2742
- * Minimum amount
2809
+ * Total liabilities at this date (in base currency)
2743
2810
  */
2744
- min?: number;
2811
+ liabilities?: string;
2745
2812
  /**
2746
- * Maximum amount
2813
+ * Multi-currency breakdown for this point
2747
2814
  */
2748
- max?: number;
2815
+ byCurrency?: Array<CurrencyBalanceDto>;
2749
2816
  };
2750
2817
 
2751
- export type TransactionRuleResponseDto = {
2752
- /**
2753
- * Rule ID
2754
- */
2755
- id: string;
2756
- /**
2757
- * Rule name
2758
- */
2759
- name: string;
2818
+ export type TrendSummaryDto = {
2760
2819
  /**
2761
- * Rule description
2820
+ * Value at start of period
2762
2821
  */
2763
- description?: string;
2822
+ startValue: string;
2764
2823
  /**
2765
- * Keywords to match in transaction narration
2824
+ * Value at end of period
2766
2825
  */
2767
- narrationKeywords: Array<string>;
2826
+ endValue: string;
2768
2827
  /**
2769
- * Keywords to match in payee name
2828
+ * Total change over period
2770
2829
  */
2771
- payeeKeywords: Array<string>;
2830
+ totalChange: string;
2772
2831
  /**
2773
- * Keywords to match in category
2832
+ * Total change percentage
2774
2833
  */
2775
- categoryKeywords: Array<string>;
2834
+ totalChangePercentage: string;
2835
+ };
2836
+
2837
+ export type MultiCurrencyPointDto = {
2776
2838
  /**
2777
- * Keywords to match in payment method
2839
+ * Date in YYYY-MM-DD format
2778
2840
  */
2779
- methodKeywords: Array<string>;
2841
+ date: string;
2780
2842
  /**
2781
- * Destination account for categorization
2843
+ * Balances by currency
2782
2844
  */
2783
- categoryAccount?: string;
2845
+ byCurrency: Array<CurrencyBalanceDto>;
2846
+ };
2847
+
2848
+ export type PortfolioTrendsResponseDto = {
2784
2849
  /**
2785
- * Keyword matching logic
2850
+ * Time series data points
2786
2851
  */
2787
- matchLogic: 'OR' | 'AND';
2852
+ series: Array<TimeSeriesPointDto>;
2788
2853
  /**
2789
- * Amount range for matching
2854
+ * Period summary
2790
2855
  */
2791
- amountRange?: AmountRangeDto;
2856
+ summary: TrendSummaryDto;
2792
2857
  /**
2793
- * Rule priority (0-1000, higher = first match)
2858
+ * Period requested
2794
2859
  */
2795
- priority: number;
2860
+ period: string;
2796
2861
  /**
2797
- * Whether the rule is enabled
2862
+ * Data granularity
2798
2863
  */
2799
- enabled: boolean;
2864
+ granularity: string;
2800
2865
  /**
2801
- * Learning source: NLP, REVIEW_CENTER, or null for manual
2866
+ * Base currency for converted values
2802
2867
  */
2803
- learningSource?: 'NLP' | 'REVIEW_CENTER' | null;
2868
+ currency: string;
2804
2869
  /**
2805
- * Whether auto-apply is enabled for this rule
2870
+ * Multi-currency time series (each point has currency breakdown)
2806
2871
  */
2807
- autoApplyEnabled: boolean;
2872
+ byCurrency?: Array<MultiCurrencyPointDto>;
2808
2873
  /**
2809
- * Number of confirmations for NLP-learned rules
2874
+ * Exchange rate warnings
2810
2875
  */
2811
- confirmationCount: number;
2876
+ warnings?: Array<ExchangeRateWarningDto>;
2877
+ };
2878
+
2879
+ export type CashFlowPointDto = {
2812
2880
  /**
2813
- * Additional tags
2881
+ * Month key (YYYY-MM)
2814
2882
  */
2815
- additionalTags: Array<string>;
2883
+ month: string;
2816
2884
  /**
2817
- * Additional metadata
2885
+ * Income in base currency (absolute, converted)
2818
2886
  */
2819
- additionalMetadata?: {
2820
- [key: string]: string;
2821
- };
2887
+ income: string;
2822
2888
  /**
2823
- * Created timestamp
2889
+ * Expense in base currency (absolute, converted)
2824
2890
  */
2825
- createdAt: string;
2891
+ expense: string;
2826
2892
  /**
2827
- * Updated timestamp
2893
+ * netSavings = income − expense (savings positive)
2828
2894
  */
2829
- updatedAt: string;
2895
+ netSavings: string;
2830
2896
  };
2831
2897
 
2832
- /**
2833
- * Learning source: NLP, REVIEW_CENTER, or null for manual
2834
- */
2835
- export type learningSource = 'NLP' | 'REVIEW_CENTER';
2836
-
2837
- export type TransactionRuleListResponseDto = {
2838
- data: Array<TransactionRuleResponseDto>;
2898
+ export type CashFlowTrendSummaryDto = {
2839
2899
  /**
2840
- * Total count of rules
2900
+ * Total income across the period
2841
2901
  */
2842
- total: number;
2902
+ totalIncome: string;
2843
2903
  /**
2844
- * Results per page
2904
+ * Total expense across the period
2845
2905
  */
2846
- limit: number;
2906
+ totalExpense: string;
2847
2907
  /**
2848
- * Pagination offset
2908
+ * income − expense across the period
2849
2909
  */
2850
- offset: number;
2910
+ totalNetSavings: string;
2911
+ /**
2912
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
2913
+ */
2914
+ averageMonthlyNetSavings: string;
2851
2915
  };
2852
2916
 
2853
- export type ValidateRuleDto = {
2854
- name: string;
2855
- description?: string;
2856
- narrationKeywords?: Array<unknown[]>;
2857
- payeeKeywords?: Array<unknown[]>;
2858
- categoryKeywords?: Array<unknown[]>;
2917
+ export type CashFlowTrendsResponseDto = {
2859
2918
  /**
2860
- * Payment method keywords (e.g., HuaBei, YuEBao)
2919
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
2861
2920
  */
2862
- methodKeywords?: Array<unknown[]>;
2921
+ series: Array<CashFlowPointDto>;
2863
2922
  /**
2864
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2923
+ * Period totals
2865
2924
  */
2866
- categoryAccount?: string;
2867
- matchLogic: 'OR' | 'AND';
2925
+ summary: CashFlowTrendSummaryDto;
2868
2926
  /**
2869
- * Minimum transaction amount (inclusive)
2927
+ * Period requested
2870
2928
  */
2871
- amountMin?: number;
2929
+ period: string;
2872
2930
  /**
2873
- * Maximum transaction amount (inclusive)
2931
+ * Data granularity (v1 returns month buckets)
2874
2932
  */
2875
- amountMax?: number;
2876
- priority: number;
2877
- additionalTags?: Array<unknown[]>;
2878
- additionalMetadata?: {
2879
- [key: string]: unknown;
2880
- };
2933
+ granularity: string;
2881
2934
  /**
2882
- * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
2935
+ * Base currency for converted values
2883
2936
  */
2884
- upsertByPayee?: boolean;
2885
- };
2886
-
2887
- export type ValidateRuleResponseDto = {
2937
+ currency: string;
2888
2938
  /**
2889
- * Whether the rule configuration is valid
2939
+ * Exchange rate warnings (e.g. missing rate for a currency)
2890
2940
  */
2891
- valid: boolean;
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 = {
2892
2953
  /**
2893
- * List of validation errors (empty if valid)
2954
+ * Access token for user verification
2894
2955
  */
2895
- errors: Array<unknown[]>;
2956
+ accessToken: string;
2957
+ };
2958
+
2959
+ export type SignupDto = {
2896
2960
  /**
2897
- * List of validation warnings (non-blocking issues)
2961
+ * Cloudflare Turnstile verification token (optional when Turnstile disabled)
2898
2962
  */
2899
- warnings: Array<unknown[]>;
2963
+ turnstileToken?: string;
2900
2964
  };
2901
2965
 
2902
- export type BulkCreateRulesDto = {
2966
+ export type SignupResponseDto = {
2903
2967
  /**
2904
- * Array of rules to import
2968
+ * JWT auth token
2905
2969
  */
2906
- rules: Array<unknown[]>;
2970
+ authToken: string;
2907
2971
  /**
2908
- * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
2972
+ * Auto-generated access token
2909
2973
  */
2910
- conflictStrategy: 'replace' | 'skip';
2974
+ accessToken: string;
2975
+ /**
2976
+ * Assigned user role
2977
+ */
2978
+ role: 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2911
2979
  };
2912
2980
 
2913
2981
  /**
2914
- * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
2982
+ * Assigned user role
2915
2983
  */
2916
- export type conflictStrategy = 'replace' | 'skip';
2984
+ export type role = 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2917
2985
 
2918
- export type BulkCreateRulesResponseDto = {
2986
+ export type UpdateUserSettingDto = {
2919
2987
  /**
2920
- * Number of successfully created rules
2988
+ * Security ID
2921
2989
  */
2922
- successCount: number;
2990
+ secId?: number;
2923
2991
  /**
2924
- * Number of failed rules
2992
+ * Annual interest rate
2925
2993
  */
2926
- failureCount: number;
2927
- /**
2928
- * Error details for failed rules
2929
- */
2930
- errors: Array<{
2931
- index?: number;
2932
- message?: string;
2933
- }>;
2934
- /**
2935
- * IDs of successfully created rules
2936
- */
2937
- createdRuleIds: Array<string>;
2938
- };
2939
-
2940
- export type ExportRulesResponseDto = {
2941
- /**
2942
- * Export timestamp
2943
- */
2944
- exportedAt: string;
2945
- /**
2946
- * User ID
2947
- */
2948
- userId: string;
2949
- /**
2950
- * Number of exported rules
2951
- */
2952
- ruleCount: number;
2953
- /**
2954
- * Exported rules
2955
- */
2956
- rules: unknown[];
2957
- };
2958
-
2959
- export type RuleStatisticsResponseDto = {
2960
- /**
2961
- * Statistics time period
2962
- */
2963
- period: '7d' | '30d' | '90d';
2964
- /**
2965
- * Total number of rules
2966
- */
2967
- totalRules: number;
2968
- /**
2969
- * Number of rules with at least one match
2970
- */
2971
- rulesWithMatches: number;
2972
- /**
2973
- * Total number of matches across all rules
2974
- */
2975
- totalMatches: number;
2976
- /**
2977
- * Average confidence score across all matches
2978
- */
2979
- averageConfidence: number;
2980
- /**
2981
- * Per-rule statistics
2982
- */
2983
- ruleStats: Array<{
2984
- ruleId?: string;
2985
- ruleName?: string;
2986
- matchCount?: number;
2987
- averageConfidence?: number;
2988
- }>;
2989
- };
2990
-
2991
- /**
2992
- * Statistics time period
2993
- */
2994
- export type period = '7d' | '30d' | '90d';
2995
-
2996
- export type UpdateTransactionRuleDto = {
2997
- name?: string;
2998
- description?: string;
2999
- narrationKeywords?: Array<unknown[]>;
3000
- payeeKeywords?: Array<unknown[]>;
3001
- categoryKeywords?: Array<unknown[]>;
3002
- /**
3003
- * Payment method keywords (e.g., HuaBei, YuEBao)
3004
- */
3005
- methodKeywords?: Array<unknown[]>;
3006
- /**
3007
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
3008
- */
3009
- categoryAccount?: string;
3010
- matchLogic?: 'OR' | 'AND';
3011
- /**
3012
- * Minimum transaction amount (inclusive)
3013
- */
3014
- amountMin?: number;
3015
- /**
3016
- * Maximum transaction amount (inclusive)
3017
- */
3018
- amountMax?: number;
3019
- priority?: number;
3020
- /**
3021
- * Enable or disable the rule
3022
- */
3023
- enabled?: boolean;
3024
- additionalTags?: Array<unknown[]>;
3025
- additionalMetadata?: {
3026
- [key: string]: unknown;
3027
- };
3028
- };
3029
-
3030
- export type TestRuleDto = {
3031
- narration: string;
3032
- payee?: string;
3033
- categoryAccount?: string;
3034
- amount?: number;
3035
- currency?: string;
3036
- };
3037
-
3038
- export type TestRuleResponseDto = {
3039
- /**
3040
- * Rule ID that was tested
3041
- */
3042
- ruleId: string;
3043
- /**
3044
- * Whether the rule matched the test data
3045
- */
3046
- matches: boolean;
3047
- /**
3048
- * Match confidence score (0-1)
3049
- */
3050
- confidence: number;
3051
- /**
3052
- * Details of which fields matched
3053
- */
3054
- matchDetails: {
3055
- [key: string]: unknown;
3056
- };
3057
- };
3058
-
3059
- export type DeleteOwnUserDto = {
3060
- /**
3061
- * Access token for user verification
3062
- */
3063
- accessToken: string;
3064
- };
3065
-
3066
- export type SignupDto = {
3067
- /**
3068
- * Cloudflare Turnstile verification token (optional when Turnstile disabled)
3069
- */
3070
- turnstileToken?: string;
3071
- };
3072
-
3073
- export type UpdateUserSettingDto = {
3074
- /**
3075
- * Security ID
3076
- */
3077
- secId?: number;
3078
- /**
3079
- * Annual interest rate
3080
- */
3081
- annualInterestRate?: number;
2994
+ annualInterestRate?: number;
3082
2995
  /**
3083
2996
  * Currency code
3084
2997
  */
@@ -3174,93 +3087,448 @@ export type UpdatePropertyDto = {
3174
3087
  value: string;
3175
3088
  };
3176
3089
 
3177
- 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[]>;
3178
3096
  /**
3179
- * Life event date (ISO 8601)
3097
+ * Payment method keywords (e.g., HuaBei, YuEBao)
3180
3098
  */
3181
- date: string;
3099
+ methodKeywords?: Array<unknown[]>;
3182
3100
  /**
3183
- * 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)
3184
3102
  */
3185
- type: string;
3103
+ categoryAccount?: string;
3104
+ matchLogic: 'OR' | 'AND';
3186
3105
  /**
3187
- * Life event description. Empty string is a VALID value (distinct from absence).
3106
+ * Minimum transaction amount (inclusive)
3188
3107
  */
3189
- description: string;
3108
+ amountMin?: number;
3190
3109
  /**
3191
- * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3110
+ * Maximum transaction amount (inclusive)
3192
3111
  */
3193
- meta?: {
3112
+ amountMax?: number;
3113
+ priority: number;
3114
+ additionalTags?: Array<unknown[]>;
3115
+ additionalMetadata?: {
3194
3116
  [key: string]: unknown;
3195
3117
  };
3118
+ /**
3119
+ * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
3120
+ */
3121
+ upsertByPayee?: boolean;
3196
3122
  };
3197
3123
 
3198
- export type EventResponseDto = {
3124
+ export type matchLogic = 'OR' | 'AND';
3125
+
3126
+ export type AmountRangeDto = {
3199
3127
  /**
3200
- * Unique identifier
3128
+ * Minimum amount
3201
3129
  */
3202
- id: string;
3130
+ min?: number;
3203
3131
  /**
3204
- * User ID (owner of the life event)
3132
+ * Maximum amount
3205
3133
  */
3206
- userId: string;
3134
+ max?: number;
3135
+ };
3136
+
3137
+ export type TransactionRuleResponseDto = {
3207
3138
  /**
3208
- * Life event date (ISO 8601 format)
3139
+ * Rule ID
3209
3140
  */
3210
- date: string;
3141
+ id: string;
3211
3142
  /**
3212
- * Life event type (user-defined, e.g., "employer", "location")
3143
+ * Rule name
3213
3144
  */
3214
- type: string;
3145
+ name: string;
3215
3146
  /**
3216
- * Life event description. May be an empty string (a valid value distinct from absence).
3147
+ * Rule description
3217
3148
  */
3218
- description: string;
3149
+ description?: string;
3219
3150
  /**
3220
- * Product-side metadata (free-form JSON)
3151
+ * Keywords to match in transaction narration
3221
3152
  */
3222
- meta: {
3223
- [key: string]: unknown;
3224
- };
3153
+ narrationKeywords: Array<string>;
3225
3154
  /**
3226
- * Creation timestamp
3155
+ * Keywords to match in payee name
3227
3156
  */
3228
- createdAt: string;
3157
+ payeeKeywords: Array<string>;
3229
3158
  /**
3230
- * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3159
+ * Keywords to match in category
3231
3160
  */
3232
- updatedAt: string;
3233
- };
3234
-
3235
- export type EventListResponseDto = {
3161
+ categoryKeywords: Array<string>;
3236
3162
  /**
3237
- * List of life events
3163
+ * Keywords to match in payment method
3238
3164
  */
3239
- items: Array<EventResponseDto>;
3165
+ methodKeywords: Array<string>;
3240
3166
  /**
3241
- * Total number of life events matching the query
3167
+ * Destination account for categorization
3242
3168
  */
3243
- total: number;
3244
- };
3245
-
3246
- export type UpdateBeanEventDto = {
3169
+ categoryAccount?: string;
3247
3170
  /**
3248
- * Life event date (ISO 8601)
3171
+ * Keyword matching logic
3249
3172
  */
3250
- date?: string;
3173
+ matchLogic: 'OR' | 'AND';
3251
3174
  /**
3252
- * Life event type (user-defined)
3175
+ * Amount range for matching
3253
3176
  */
3254
- type?: string;
3177
+ amountRange?: AmountRangeDto;
3255
3178
  /**
3256
- * Life event description. Empty string is a VALID value (distinct from absence).
3179
+ * Rule priority (0-1000, higher = first match)
3257
3180
  */
3258
- description?: string;
3181
+ priority: number;
3259
3182
  /**
3260
- * Product-side metadata (free-form JSON)
3183
+ * Whether the rule is enabled
3261
3184
  */
3262
- meta?: {
3263
- [key: string]: unknown;
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)
3517
+ */
3518
+ date?: string;
3519
+ /**
3520
+ * Life event type (user-defined)
3521
+ */
3522
+ type?: string;
3523
+ /**
3524
+ * Life event description. Empty string is a VALID value (distinct from absence).
3525
+ */
3526
+ description?: string;
3527
+ /**
3528
+ * Product-side metadata (free-form JSON)
3529
+ */
3530
+ meta?: {
3531
+ [key: string]: unknown;
3264
3532
  };
3265
3533
  };
3266
3534
 
@@ -3870,6 +4138,14 @@ export type ProcessNlpDto = {
3870
4138
  parsedData?: {
3871
4139
  [key: string]: unknown;
3872
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;
3873
4149
  };
3874
4150
 
3875
4151
  export type NlpTransactionInfoDto = {
@@ -4113,9 +4389,9 @@ export type NlpAccountConfirmationDataDto = {
4113
4389
  */
4114
4390
  invalidAccount: string;
4115
4391
  /**
4116
- * Suggested replacement account
4392
+ * Suggested replacement account (omitted when no clear candidate)
4117
4393
  */
4118
- suggestedAccount: string;
4394
+ suggestedAccount?: string;
4119
4395
  /**
4120
4396
  * Similar accounts for user selection
4121
4397
  */
@@ -4243,7 +4519,7 @@ export type NlpSuggestedAccountDto = {
4243
4519
  */
4244
4520
  account: string;
4245
4521
  /**
4246
- * 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)
4247
4523
  */
4248
4524
  confidence?: number;
4249
4525
  };
@@ -4261,21 +4537,21 @@ export type NlpSuggestedAccountsDto = {
4261
4537
 
4262
4538
  export type NlpDefaultAccountsDto = {
4263
4539
  /**
4264
- * Default asset account
4540
+ * Default OPEN asset account (MRU when multiple), or null when none/ambiguous
4265
4541
  */
4266
- asset: string;
4542
+ asset: string | null;
4267
4543
  /**
4268
- * Default expense account
4544
+ * Default OPEN expense account (MRU when multiple), or null when none/ambiguous
4269
4545
  */
4270
- expense: string;
4546
+ expense: string | null;
4271
4547
  /**
4272
- * Default income account
4548
+ * Default OPEN income account (MRU when multiple), or null when none/ambiguous
4273
4549
  */
4274
- income: string;
4550
+ income: string | null;
4275
4551
  /**
4276
- * Default liability account
4552
+ * Default OPEN liability account (MRU when multiple), or null when none/ambiguous
4277
4553
  */
4278
- liability: string;
4554
+ liability: string | null;
4279
4555
  };
4280
4556
 
4281
4557
  export type NlpResponseDto = {
@@ -4294,7 +4570,8 @@ export type NlpResponseDto = {
4294
4570
  | 'confirm_rule'
4295
4571
  | 'confirm_account'
4296
4572
  | 'confirm_payee'
4297
- | 'cancel';
4573
+ | 'cancel'
4574
+ | 'aborted';
4298
4575
  /**
4299
4576
  * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4300
4577
  */
@@ -4383,11 +4660,11 @@ export type NlpResponseDto = {
4383
4660
  */
4384
4661
  recurringSuggestion?: RecurringSuggestionDto;
4385
4662
  /**
4386
- * Suggested accounts for this transaction. Contains recommended source and destination accounts based on the detected intent and rules.
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.
4387
4664
  */
4388
4665
  suggestedAccounts?: NlpSuggestedAccountsDto;
4389
4666
  /**
4390
- * Default accounts for the user/region. These are fallback accounts used when no specific suggestion is available.
4667
+ * Default fallback accounts for the user/region (#586). v1 returns universal constants; per-user personalization is planned.
4391
4668
  */
4392
4669
  defaultAccounts?: NlpDefaultAccountsDto;
4393
4670
  };
@@ -4408,7 +4685,8 @@ export type action2 =
4408
4685
  | 'confirm_rule'
4409
4686
  | 'confirm_account'
4410
4687
  | 'confirm_payee'
4411
- | 'cancel';
4688
+ | 'cancel'
4689
+ | 'aborted';
4412
4690
 
4413
4691
  /**
4414
4692
  * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
@@ -4430,6 +4708,127 @@ export type liabilitySubType = 'borrow' | 'repay';
4430
4708
  */
4431
4709
  export type equitySubType = 'opening' | 'adjustment';
4432
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
4745
+ */
4746
+ logoUrl: string | null;
4747
+ /**
4748
+ * Whether user has accounts using this platform
4749
+ */
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 = {
4766
+ /**
4767
+ * Global platform ID
4768
+ */
4769
+ id: string;
4770
+ /**
4771
+ * Platform name (e.g., "ICBC")
4772
+ */
4773
+ name: string;
4774
+ /**
4775
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
4776
+ */
4777
+ canonical: string;
4778
+ /**
4779
+ * Platform type
4780
+ */
4781
+ type:
4782
+ | 'BANK'
4783
+ | 'BROKERAGE'
4784
+ | 'CRYPTO_EXCHANGE'
4785
+ | 'PAYMENT'
4786
+ | 'INVESTMENT'
4787
+ | 'INSURANCE'
4788
+ | 'OTHER';
4789
+ /**
4790
+ * Suggested path segment — canonical, already in ACCOUNT_RE format
4791
+ */
4792
+ suggestedSegment: string;
4793
+ /**
4794
+ * Logo URL
4795
+ */
4796
+ logoUrl: string | null;
4797
+ /**
4798
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4799
+ */
4800
+ matchType: 'exact' | 'prefix' | 'substring';
4801
+ };
4802
+
4803
+ /**
4804
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4805
+ */
4806
+ export type matchType = 'exact' | 'prefix' | 'substring';
4807
+
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
+ };
4826
+
4827
+ /**
4828
+ * Overall match quality — top row's tier, or 'none' when no hits
4829
+ */
4830
+ export type matchType2 = 'none' | 'exact' | 'prefix' | 'substring';
4831
+
4433
4832
  export type CreatePlatformDto = {
4434
4833
  /**
4435
4834
  * Platform name
@@ -4468,18 +4867,6 @@ export type CreatePlatformDto = {
4468
4867
  isActive?: boolean;
4469
4868
  };
4470
4869
 
4471
- /**
4472
- * Platform type
4473
- */
4474
- export type type3 =
4475
- | 'BANK'
4476
- | 'BROKERAGE'
4477
- | 'CRYPTO_EXCHANGE'
4478
- | 'PAYMENT'
4479
- | 'INVESTMENT'
4480
- | 'INSURANCE'
4481
- | 'OTHER';
4482
-
4483
4870
  export type UpdatePlatformDto = {
4484
4871
  /**
4485
4872
  * Platform name
@@ -5231,185 +5618,146 @@ export type HoldingPnlResponseDto = {
5231
5618
  */
5232
5619
  export type method = 'average' | 'FIFO';
5233
5620
 
5234
- export type CurrencyBalanceDto = {
5235
- /**
5236
- * ISO 4217 currency code
5237
- */
5238
- currency: string;
5239
- /**
5240
- * Balance amount
5241
- */
5242
- balance: string;
5243
- };
5244
-
5245
- export type TimeSeriesPointDto = {
5246
- /**
5247
- * Date in YYYY-MM-DD format
5248
- */
5249
- date: string;
5250
- /**
5251
- * Value at this date (in base currency)
5252
- */
5253
- value: string;
5254
- /**
5255
- * Change from previous point
5256
- */
5257
- change?: {
5258
- [key: string]: unknown;
5259
- };
5260
- /**
5261
- * Total assets at this date (in base currency)
5262
- */
5263
- assets?: string;
5264
- /**
5265
- * Total liabilities at this date (in base currency)
5266
- */
5267
- liabilities?: string;
5268
- /**
5269
- * Multi-currency breakdown for this point
5270
- */
5271
- byCurrency?: Array<CurrencyBalanceDto>;
5272
- };
5273
-
5274
- export type TrendSummaryDto = {
5275
- /**
5276
- * Value at start of period
5277
- */
5278
- startValue: string;
5279
- /**
5280
- * Value at end of period
5281
- */
5282
- endValue: string;
5283
- /**
5284
- * Total change over period
5285
- */
5286
- totalChange: string;
5621
+ export type AnonymousLoginDto = {
5287
5622
  /**
5288
- * Total change percentage
5623
+ * Access token for anonymous login
5289
5624
  */
5290
- totalChangePercentage: string;
5625
+ accessToken: string;
5291
5626
  };
5292
5627
 
5293
- export type MultiCurrencyPointDto = {
5294
- /**
5295
- * Date in YYYY-MM-DD format
5296
- */
5297
- date: string;
5628
+ export type AnonymousLoginResponseDto = {
5298
5629
  /**
5299
- * Balances by currency
5630
+ * JWT auth token
5300
5631
  */
5301
- byCurrency: Array<CurrencyBalanceDto>;
5632
+ authToken: string;
5302
5633
  };
5303
5634
 
5304
- export type PortfolioTrendsResponseDto = {
5305
- /**
5306
- * Time series data points
5307
- */
5308
- series: Array<TimeSeriesPointDto>;
5309
- /**
5310
- * Period summary
5311
- */
5312
- summary: TrendSummaryDto;
5313
- /**
5314
- * Period requested
5315
- */
5316
- 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;
5317
5643
  /**
5318
- * Data granularity
5644
+ * OpenBB asset_type (e.g. stock, etf)
5319
5645
  */
5320
- granularity: string;
5646
+ assetType?: {
5647
+ [key: string]: unknown;
5648
+ } | null;
5321
5649
  /**
5322
- * Base currency for converted values
5650
+ * IGN asset class (region.types.ts ASSET_CLASSES)
5323
5651
  */
5324
- currency: string;
5652
+ assetClass?: {
5653
+ [key: string]: unknown;
5654
+ } | null;
5325
5655
  /**
5326
- * Multi-currency time series (each point has currency breakdown)
5656
+ * IGN asset sub-class (region.types.ts ASSET_SUB_CLASSES)
5327
5657
  */
5328
- byCurrency?: Array<MultiCurrencyPointDto>;
5658
+ assetSubClass?: {
5659
+ [key: string]: unknown;
5660
+ } | null;
5329
5661
  /**
5330
- * Exchange rate warnings
5662
+ * Trading currency (extra_data or inferred from exchange)
5331
5663
  */
5332
- warnings?: Array<ExchangeRateWarningDto>;
5664
+ currency?: {
5665
+ [key: string]: unknown;
5666
+ } | null;
5333
5667
  };
5334
5668
 
5335
- export type CashFlowPointDto = {
5336
- /**
5337
- * Month key (YYYY-MM)
5338
- */
5339
- 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;
5340
5677
  /**
5341
- * Income in base currency (absolute, converted)
5678
+ * OpenBB asset_type
5342
5679
  */
5343
- income: string;
5680
+ assetType?: {
5681
+ [key: string]: unknown;
5682
+ } | null;
5344
5683
  /**
5345
- * Expense in base currency (absolute, converted)
5684
+ * IGN asset class
5346
5685
  */
5347
- expense: string;
5686
+ assetClass?: {
5687
+ [key: string]: unknown;
5688
+ } | null;
5348
5689
  /**
5349
- * netSavings = income − expense (savings positive)
5690
+ * IGN asset sub-class
5350
5691
  */
5351
- netSavings: string;
5352
- };
5353
-
5354
- export type CashFlowTrendSummaryDto = {
5692
+ assetSubClass?: {
5693
+ [key: string]: unknown;
5694
+ } | null;
5355
5695
  /**
5356
- * Total income across the period
5696
+ * Trading currency (extra_data or inferred from exchange)
5357
5697
  */
5358
- totalIncome: string;
5698
+ currency?: {
5699
+ [key: string]: unknown;
5700
+ } | null;
5359
5701
  /**
5360
- * Total expense across the period
5702
+ * Latest price (Decimal string)
5361
5703
  */
5362
- totalExpense: string;
5704
+ price?: {
5705
+ [key: string]: unknown;
5706
+ } | null;
5363
5707
  /**
5364
- * income − expense across the period
5708
+ * Date the price was observed (ISO yyyy-MM-dd)
5365
5709
  */
5366
- totalNetSavings: string;
5710
+ priceDate?: {
5711
+ [key: string]: unknown;
5712
+ } | null;
5367
5713
  /**
5368
- * 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.
5369
5715
  */
5370
- averageMonthlyNetSavings: string;
5371
- };
5372
-
5373
- export type CashFlowTrendsResponseDto = {
5716
+ changePercent?: {
5717
+ [key: string]: unknown;
5718
+ } | null;
5374
5719
  /**
5375
- * Monthly cash-flow series (fixed N-month window, zero-filled)
5720
+ * Previous close (Decimal string)
5376
5721
  */
5377
- series: Array<CashFlowPointDto>;
5722
+ prevClose?: {
5723
+ [key: string]: unknown;
5724
+ } | null;
5378
5725
  /**
5379
- * Period totals
5726
+ * Day open (Decimal string)
5380
5727
  */
5381
- summary: CashFlowTrendSummaryDto;
5728
+ open?: {
5729
+ [key: string]: unknown;
5730
+ } | null;
5382
5731
  /**
5383
- * Period requested
5732
+ * Day high (Decimal string)
5384
5733
  */
5385
- period: string;
5734
+ high?: {
5735
+ [key: string]: unknown;
5736
+ } | null;
5386
5737
  /**
5387
- * Data granularity (v1 returns month buckets)
5738
+ * Day low (Decimal string)
5388
5739
  */
5389
- granularity: string;
5740
+ low?: {
5741
+ [key: string]: unknown;
5742
+ } | null;
5390
5743
  /**
5391
- * Base currency for converted values
5744
+ * Day volume (Decimal string)
5392
5745
  */
5393
- currency: string;
5746
+ volume?: {
5747
+ [key: string]: unknown;
5748
+ } | null;
5394
5749
  /**
5395
- * Exchange rate warnings (e.g. missing rate for a currency)
5750
+ * 52-week high (Decimal string)
5396
5751
  */
5397
- warnings?: Array<ExchangeRateWarningDto>;
5398
- };
5399
-
5400
- export type GenerateSnapshotBody = unknown;
5401
-
5402
- export type GenerateSnapshotResponse = unknown;
5403
-
5404
- export type BackfillSnapshotsBody = unknown;
5405
-
5406
- export type BackfillSnapshotsResponse = unknown;
5407
-
5408
- export type AnonymousLoginDto = {
5752
+ yearHigh?: {
5753
+ [key: string]: unknown;
5754
+ } | null;
5409
5755
  /**
5410
- * Access token for anonymous login
5756
+ * 52-week low (Decimal string)
5411
5757
  */
5412
- accessToken: string;
5758
+ yearLow?: {
5759
+ [key: string]: unknown;
5760
+ } | null;
5413
5761
  };
5414
5762
 
5415
5763
  export type AccountControllerCreateData = {
@@ -6445,18 +6793,166 @@ export type ExpectedTransactionControllerEnterNowData = {
6445
6793
 
6446
6794
  export type ExpectedTransactionControllerEnterNowResponse = unknown;
6447
6795
 
6448
- export type ForecastControllerGetForecastData = {
6449
- /**
6450
- * Number of months to forecast (1-12, default 3)
6451
- */
6452
- months?: number;
6796
+ export type ForecastControllerGetForecastData = {
6797
+ /**
6798
+ * Number of months to forecast (1-12, default 3)
6799
+ */
6800
+ months?: number;
6801
+ /**
6802
+ * Region code for tenant context
6803
+ */
6804
+ region: 'cn' | 'us' | 'de' | 'gb';
6805
+ };
6806
+
6807
+ export type ForecastControllerGetForecastResponse = ForecastResponseDto;
6808
+
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';
6818
+ /**
6819
+ * Region code for tenant context
6820
+ */
6821
+ region: 'cn' | 'us' | 'de' | 'gb';
6822
+ };
6823
+
6824
+ export type ReportingControllerGetPortfolioTrendsResponse =
6825
+ PortfolioTrendsResponseDto;
6826
+
6827
+ export type ReportingControllerGetCashFlowTrendsData = {
6828
+ /**
6829
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6830
+ */
6831
+ granularity?: 'day' | 'week' | 'month';
6832
+ /**
6833
+ * Time period
6834
+ */
6835
+ period?: '1m' | '3m' | '6m' | '1y';
6836
+ /**
6837
+ * Region code for tenant context
6838
+ */
6839
+ region: 'cn' | 'us' | 'de' | 'gb';
6840
+ };
6841
+
6842
+ export type ReportingControllerGetCashFlowTrendsResponse =
6843
+ CashFlowTrendsResponseDto;
6844
+
6845
+ export type ReportingControllerGenerateSnapshotData = {
6846
+ /**
6847
+ * Region code for tenant context
6848
+ */
6849
+ region: 'cn' | 'us' | 'de' | 'gb';
6850
+ /**
6851
+ * Optional date (defaults to today)
6852
+ */
6853
+ requestBody: GenerateSnapshotBody;
6854
+ };
6855
+
6856
+ export type ReportingControllerGenerateSnapshotResponse =
6857
+ GenerateSnapshotResponse;
6858
+
6859
+ export type ReportingControllerBackfillSnapshotsData = {
6860
+ /**
6861
+ * Region code for tenant context
6862
+ */
6863
+ region: 'cn' | 'us' | 'de' | 'gb';
6864
+ requestBody: BackfillSnapshotsBody;
6865
+ };
6866
+
6867
+ export type ReportingControllerBackfillSnapshotsResponse =
6868
+ BackfillSnapshotsResponse;
6869
+
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 = {
6889
+ /**
6890
+ * User ID to delete
6891
+ */
6892
+ id: string;
6893
+ };
6894
+
6895
+ export type UserControllerDeleteUserResponse = void;
6896
+
6897
+ export type UserControllerGetUserInfoData = {
6898
+ /**
6899
+ * User ID
6900
+ */
6901
+ id: string;
6902
+ };
6903
+
6904
+ export type UserControllerGetUserInfoResponse = unknown;
6905
+
6906
+ export type UserControllerUpdateUserSettingData = {
6907
+ requestBody: UpdateUserSettingDto;
6908
+ };
6909
+
6910
+ export type UserControllerUpdateUserSettingResponse = unknown;
6911
+
6912
+ export type UserControllerGetAllUserSettingsByPageData = {
6913
+ /**
6914
+ * Page number
6915
+ */
6916
+ pageNo: number;
6917
+ /**
6918
+ * Page size
6919
+ */
6920
+ pageSize: number;
6921
+ };
6922
+
6923
+ export type UserControllerGetAllUserSettingsByPageResponse = unknown;
6924
+
6925
+ export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
6926
+
6927
+ export type PropertyControllerGetAllResponse = unknown;
6928
+
6929
+ export type PropertyControllerGetByKeyData = {
6930
+ /**
6931
+ * Property key
6932
+ */
6933
+ key: string;
6934
+ };
6935
+
6936
+ export type PropertyControllerGetByKeyResponse = unknown;
6937
+
6938
+ export type PropertyControllerUpdateData = {
6939
+ /**
6940
+ * Property key
6941
+ */
6942
+ key: string;
6943
+ requestBody: UpdatePropertyDto;
6944
+ };
6945
+
6946
+ export type PropertyControllerUpdateResponse = unknown;
6947
+
6948
+ export type PropertyControllerDeleteData = {
6453
6949
  /**
6454
- * Region code for tenant context
6950
+ * Property key
6455
6951
  */
6456
- region: 'cn' | 'us' | 'de' | 'gb';
6952
+ key: string;
6457
6953
  };
6458
6954
 
6459
- export type ForecastControllerGetForecastResponse = ForecastResponseDto;
6955
+ export type PropertyControllerDeleteResponse = void;
6460
6956
 
6461
6957
  export type TransactionRuleControllerCreateData = {
6462
6958
  /**
@@ -6603,93 +7099,6 @@ export type TransactionRuleControllerTestData = {
6603
7099
 
6604
7100
  export type TransactionRuleControllerTestResponse = TestRuleResponseDto;
6605
7101
 
6606
- export type UserControllerDeleteOwnUserData = {
6607
- requestBody: DeleteOwnUserDto;
6608
- };
6609
-
6610
- export type UserControllerDeleteOwnUserResponse = void;
6611
-
6612
- export type UserControllerGetUserData = {
6613
- acceptLanguage: string;
6614
- };
6615
-
6616
- export type UserControllerGetUserResponse = unknown;
6617
-
6618
- export type UserControllerSignupUserData = {
6619
- requestBody: SignupDto;
6620
- };
6621
-
6622
- export type UserControllerSignupUserResponse = unknown;
6623
-
6624
- export type UserControllerDeleteUserData = {
6625
- /**
6626
- * User ID to delete
6627
- */
6628
- id: string;
6629
- };
6630
-
6631
- export type UserControllerDeleteUserResponse = void;
6632
-
6633
- export type UserControllerGetUserInfoData = {
6634
- /**
6635
- * User ID
6636
- */
6637
- id: string;
6638
- };
6639
-
6640
- export type UserControllerGetUserInfoResponse = unknown;
6641
-
6642
- export type UserControllerUpdateUserSettingData = {
6643
- requestBody: UpdateUserSettingDto;
6644
- };
6645
-
6646
- export type UserControllerUpdateUserSettingResponse = unknown;
6647
-
6648
- export type UserControllerGetAllUserSettingsByPageData = {
6649
- /**
6650
- * Page number
6651
- */
6652
- pageNo: number;
6653
- /**
6654
- * Page size
6655
- */
6656
- pageSize: number;
6657
- };
6658
-
6659
- export type UserControllerGetAllUserSettingsByPageResponse = unknown;
6660
-
6661
- export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
6662
-
6663
- export type PropertyControllerGetAllResponse = unknown;
6664
-
6665
- export type PropertyControllerGetByKeyData = {
6666
- /**
6667
- * Property key
6668
- */
6669
- key: string;
6670
- };
6671
-
6672
- export type PropertyControllerGetByKeyResponse = unknown;
6673
-
6674
- export type PropertyControllerUpdateData = {
6675
- /**
6676
- * Property key
6677
- */
6678
- key: string;
6679
- requestBody: UpdatePropertyDto;
6680
- };
6681
-
6682
- export type PropertyControllerUpdateResponse = unknown;
6683
-
6684
- export type PropertyControllerDeleteData = {
6685
- /**
6686
- * Property key
6687
- */
6688
- key: string;
6689
- };
6690
-
6691
- export type PropertyControllerDeleteResponse = void;
6692
-
6693
7102
  export type EventControllerCreateData = {
6694
7103
  /**
6695
7104
  * Region code for tenant context (decorative for life events)
@@ -7103,7 +7512,8 @@ export type PlatformControllerCreateData = {
7103
7512
 
7104
7513
  export type PlatformControllerCreateResponse = unknown;
7105
7514
 
7106
- export type PlatformControllerGetPlatformListResponse = unknown;
7515
+ export type PlatformControllerGetPlatformListResponse =
7516
+ Array<PlatformListItemDto>;
7107
7517
 
7108
7518
  export type PlatformControllerMatchPlatformsData = {
7109
7519
  /**
@@ -7116,7 +7526,7 @@ export type PlatformControllerMatchPlatformsData = {
7116
7526
  region?: string;
7117
7527
  };
7118
7528
 
7119
- export type PlatformControllerMatchPlatformsResponse = unknown;
7529
+ export type PlatformControllerMatchPlatformsResponse = PlatformMatchResponseDto;
7120
7530
 
7121
7531
  export type PlatformControllerUpdateData = {
7122
7532
  /**
@@ -7234,74 +7644,13 @@ export type HoldingPnlControllerGetHoldingPnlData = {
7234
7644
 
7235
7645
  export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
7236
7646
 
7237
- export type ReportingControllerGetPortfolioTrendsData = {
7238
- /**
7239
- * Data granularity
7240
- */
7241
- granularity?: 'day' | 'week' | 'month';
7242
- /**
7243
- * Time period
7244
- */
7245
- period?: '1m' | '3m' | '6m' | '1y';
7246
- /**
7247
- * Region code for tenant context
7248
- */
7249
- region: 'cn' | 'us' | 'de' | 'gb';
7250
- };
7251
-
7252
- export type ReportingControllerGetPortfolioTrendsResponse =
7253
- PortfolioTrendsResponseDto;
7254
-
7255
- export type ReportingControllerGetCashFlowTrendsData = {
7256
- /**
7257
- * Data granularity (accepted for API symmetry; v1 returns month buckets)
7258
- */
7259
- granularity?: 'day' | 'week' | 'month';
7260
- /**
7261
- * Time period
7262
- */
7263
- period?: '1m' | '3m' | '6m' | '1y';
7264
- /**
7265
- * Region code for tenant context
7266
- */
7267
- region: 'cn' | 'us' | 'de' | 'gb';
7268
- };
7269
-
7270
- export type ReportingControllerGetCashFlowTrendsResponse =
7271
- CashFlowTrendsResponseDto;
7272
-
7273
- export type ReportingControllerGenerateSnapshotData = {
7274
- /**
7275
- * Region code for tenant context
7276
- */
7277
- region: 'cn' | 'us' | 'de' | 'gb';
7278
- /**
7279
- * Optional date (defaults to today)
7280
- */
7281
- requestBody: GenerateSnapshotBody;
7282
- };
7283
-
7284
- export type ReportingControllerGenerateSnapshotResponse =
7285
- GenerateSnapshotResponse;
7286
-
7287
- export type ReportingControllerBackfillSnapshotsData = {
7288
- /**
7289
- * Region code for tenant context
7290
- */
7291
- region: 'cn' | 'us' | 'de' | 'gb';
7292
- requestBody: BackfillSnapshotsBody;
7293
- };
7294
-
7295
- export type ReportingControllerBackfillSnapshotsResponse =
7296
- BackfillSnapshotsResponse;
7297
-
7298
7647
  export type ApiKeysControllerCreateApiKeyResponse = unknown;
7299
7648
 
7300
7649
  export type AuthControllerAccessTokenLoginData = {
7301
7650
  requestBody: AnonymousLoginDto;
7302
7651
  };
7303
7652
 
7304
- export type AuthControllerAccessTokenLoginResponse = unknown;
7653
+ export type AuthControllerAccessTokenLoginResponse = AnonymousLoginResponseDto;
7305
7654
 
7306
7655
  export type CacheControllerFlushCacheResponse = unknown;
7307
7656
 
@@ -7341,6 +7690,33 @@ export type HealthControllerGetMetricsResponse = unknown;
7341
7690
 
7342
7691
  export type InfoControllerGetInfoResponse = unknown;
7343
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
+
7344
7720
  export type $OpenApiTs = {
7345
7721
  '/api/v1/{region}/bean/accounts': {
7346
7722
  post: {
@@ -7405,7 +7781,7 @@ export type $OpenApiTs = {
7405
7781
  */
7406
7782
  404: unknown;
7407
7783
  /**
7408
- * Account has transactions and cannot be deleted
7784
+ * Account has active transactions and cannot be deleted
7409
7785
  */
7410
7786
  409: unknown;
7411
7787
  };
@@ -8382,425 +8758,497 @@ export type $OpenApiTs = {
8382
8758
  };
8383
8759
  '/api/v1/{region}/bean/expected-transactions/{id}/enter': {
8384
8760
  post: {
8385
- 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;
8386
8841
  res: {
8387
8842
  /**
8388
- * Transaction created successfully
8843
+ * Backfill completed successfully
8389
8844
  */
8390
- 201: unknown;
8845
+ 200: BackfillSnapshotsResponse;
8391
8846
  /**
8392
- * Cannot enter - not in PENDING status or missing accounts
8847
+ * Invalid date format or range
8393
8848
  */
8394
8849
  400: unknown;
8395
8850
  /**
8396
- * Expected transaction or accounts not found
8851
+ * User not authenticated
8397
8852
  */
8398
- 404: unknown;
8399
- };
8400
- };
8401
- };
8402
- '/api/v1/{region}/bean/recurring/forecast': {
8403
- get: {
8404
- req: ForecastControllerGetForecastData;
8405
- res: {
8853
+ 401: unknown;
8406
8854
  /**
8407
- * Forecast retrieved successfully
8855
+ * Backfill already in progress for this user
8408
8856
  */
8409
- 200: ForecastResponseDto;
8857
+ 409: unknown;
8410
8858
  };
8411
8859
  };
8412
8860
  };
8413
- '/api/v1/{region}/bean/transaction-rules': {
8414
- post: {
8415
- req: TransactionRuleControllerCreateData;
8861
+ '/api/v1/users': {
8862
+ delete: {
8863
+ req: UserControllerDeleteOwnUserData;
8416
8864
  res: {
8417
8865
  /**
8418
- * Rule updated successfully (upsert mode)
8419
- */
8420
- 200: TransactionRuleResponseDto;
8421
- /**
8422
- * Validation failed
8423
- */
8424
- 400: ApiProblemResponseDto;
8425
- /**
8426
- * Unauthorized
8866
+ * User deleted successfully
8427
8867
  */
8428
- 401: ApiProblemResponseDto;
8868
+ 204: void;
8429
8869
  /**
8430
- * Resource conflict - another process is updating this rule
8870
+ * Invalid access token
8431
8871
  */
8432
- 409: ApiProblemResponseDto;
8872
+ 403: unknown;
8433
8873
  };
8434
8874
  };
8435
8875
  get: {
8436
- req: TransactionRuleControllerListData;
8876
+ req: UserControllerGetUserData;
8437
8877
  res: {
8438
8878
  /**
8439
- * List of rules
8440
- */
8441
- 200: TransactionRuleListResponseDto;
8442
- /**
8443
- * Unauthorized
8879
+ * User retrieved successfully
8444
8880
  */
8445
- 401: ApiProblemResponseDto;
8881
+ 200: unknown;
8446
8882
  };
8447
8883
  };
8448
- };
8449
- '/api/v1/{region}/bean/transaction-rules/validate': {
8450
8884
  post: {
8451
- req: TransactionRuleControllerValidateData;
8885
+ req: UserControllerSignupUserData;
8452
8886
  res: {
8453
8887
  /**
8454
- * Validation result
8888
+ * User created successfully
8455
8889
  */
8456
- 200: ValidateRuleResponseDto;
8890
+ 201: SignupResponseDto;
8457
8891
  /**
8458
- * Validation failed
8892
+ * Invalid Turnstile token (when Turnstile is enabled)
8459
8893
  */
8460
- 400: ApiProblemResponseDto;
8894
+ 400: unknown;
8461
8895
  /**
8462
- * Unauthorized
8896
+ * User signup is disabled
8463
8897
  */
8464
- 401: ApiProblemResponseDto;
8898
+ 403: unknown;
8465
8899
  };
8466
8900
  };
8467
8901
  };
8468
- '/api/v1/{region}/bean/transaction-rules/bulk': {
8469
- post: {
8470
- req: TransactionRuleControllerBulkCreateData;
8902
+ '/api/v1/users/{id}': {
8903
+ delete: {
8904
+ req: UserControllerDeleteUserData;
8471
8905
  res: {
8472
8906
  /**
8473
- * Bulk create completed
8474
- */
8475
- 201: BulkCreateRulesResponseDto;
8476
- /**
8477
- * Invalid bulk create data
8907
+ * User deleted successfully
8478
8908
  */
8479
- 400: ApiProblemResponseDto;
8909
+ 204: void;
8480
8910
  /**
8481
- * Unauthorized
8911
+ * Cannot delete own account or insufficient permissions
8482
8912
  */
8483
- 401: ApiProblemResponseDto;
8913
+ 403: unknown;
8484
8914
  };
8485
8915
  };
8486
8916
  };
8487
- '/api/v1/{region}/bean/transaction-rules/export/{format}': {
8917
+ '/api/v1/users/{id}/info': {
8488
8918
  get: {
8489
- req: TransactionRuleControllerExportData;
8919
+ req: UserControllerGetUserInfoData;
8490
8920
  res: {
8491
8921
  /**
8492
- * Exported rules
8493
- */
8494
- 200: ExportRulesResponseDto;
8495
- /**
8496
- * Unsupported format
8922
+ * User info retrieved successfully
8497
8923
  */
8498
- 400: ApiProblemResponseDto;
8924
+ 200: unknown;
8499
8925
  /**
8500
- * Unauthorized
8926
+ * Cannot access other user info without admin permission
8501
8927
  */
8502
- 401: ApiProblemResponseDto;
8928
+ 403: unknown;
8503
8929
  };
8504
8930
  };
8505
8931
  };
8506
- '/api/v1/{region}/bean/transaction-rules/statistics/{period}': {
8507
- get: {
8508
- req: TransactionRuleControllerGetStatisticsData;
8932
+ '/api/v1/users/setting': {
8933
+ put: {
8934
+ req: UserControllerUpdateUserSettingData;
8509
8935
  res: {
8510
8936
  /**
8511
- * Rule statistics
8937
+ * Settings updated successfully
8512
8938
  */
8513
- 200: RuleStatisticsResponseDto;
8939
+ 200: unknown;
8514
8940
  /**
8515
- * Unauthorized
8941
+ * Insufficient permissions
8516
8942
  */
8517
- 401: ApiProblemResponseDto;
8943
+ 403: unknown;
8518
8944
  };
8519
8945
  };
8520
8946
  };
8521
- '/api/v1/{region}/bean/transaction-rules/{ruleId}': {
8947
+ '/api/v1/users/settings-by-page': {
8522
8948
  get: {
8523
- req: TransactionRuleControllerGetDetailData;
8949
+ req: UserControllerGetAllUserSettingsByPageData;
8524
8950
  res: {
8525
8951
  /**
8526
- * Rule details
8527
- */
8528
- 200: TransactionRuleResponseDto;
8529
- /**
8530
- * Unauthorized
8531
- */
8532
- 401: ApiProblemResponseDto;
8533
- /**
8534
- * Forbidden - not owner of rule
8535
- */
8536
- 403: ApiProblemResponseDto;
8537
- /**
8538
- * Rule not found
8952
+ * Settings list retrieved successfully
8539
8953
  */
8540
- 404: ApiProblemResponseDto;
8954
+ 200: unknown;
8541
8955
  };
8542
8956
  };
8543
- put: {
8544
- req: TransactionRuleControllerUpdateData;
8957
+ };
8958
+ '/api/v1/users/asset-liability-summary': {
8959
+ get: {
8545
8960
  res: {
8546
8961
  /**
8547
- * Rule updated successfully
8962
+ * Summary retrieved successfully
8548
8963
  */
8549
- 200: TransactionRuleResponseDto;
8964
+ 200: unknown;
8965
+ };
8966
+ };
8967
+ };
8968
+ '/api/v1/admin/properties': {
8969
+ get: {
8970
+ res: {
8550
8971
  /**
8551
- * Validation failed
8972
+ * Properties retrieved successfully
8552
8973
  */
8553
- 400: ApiProblemResponseDto;
8974
+ 200: unknown;
8554
8975
  /**
8555
8976
  * Unauthorized
8556
8977
  */
8557
- 401: ApiProblemResponseDto;
8558
- /**
8559
- * Forbidden - not owner of rule
8560
- */
8561
- 403: ApiProblemResponseDto;
8562
- /**
8563
- * Rule not found
8564
- */
8565
- 404: ApiProblemResponseDto;
8978
+ 401: unknown;
8566
8979
  /**
8567
- * Resource conflict - rule is being modified by another process
8980
+ * Forbidden - insufficient permissions
8568
8981
  */
8569
- 409: ApiProblemResponseDto;
8982
+ 403: unknown;
8570
8983
  };
8571
8984
  };
8572
- delete: {
8573
- req: TransactionRuleControllerDeleteData;
8985
+ };
8986
+ '/api/v1/admin/properties/{key}': {
8987
+ get: {
8988
+ req: PropertyControllerGetByKeyData;
8574
8989
  res: {
8575
8990
  /**
8576
- * Rule deleted successfully
8991
+ * Property retrieved successfully
8577
8992
  */
8578
- 204: void;
8993
+ 200: unknown;
8579
8994
  /**
8580
8995
  * Unauthorized
8581
8996
  */
8582
- 401: ApiProblemResponseDto;
8583
- /**
8584
- * Forbidden - not owner of rule
8585
- */
8586
- 403: ApiProblemResponseDto;
8997
+ 401: unknown;
8587
8998
  /**
8588
- * Rule not found
8999
+ * Forbidden - insufficient permissions
8589
9000
  */
8590
- 404: ApiProblemResponseDto;
9001
+ 403: unknown;
8591
9002
  /**
8592
- * Resource conflict - rule is being modified by another process
9003
+ * Property not found
8593
9004
  */
8594
- 409: ApiProblemResponseDto;
9005
+ 404: unknown;
8595
9006
  };
8596
9007
  };
8597
- };
8598
- '/api/v1/{region}/bean/transaction-rules/{ruleId}/test': {
8599
- post: {
8600
- req: TransactionRuleControllerTestData;
9008
+ put: {
9009
+ req: PropertyControllerUpdateData;
8601
9010
  res: {
8602
9011
  /**
8603
- * Test result
9012
+ * Property updated successfully
8604
9013
  */
8605
- 200: TestRuleResponseDto;
9014
+ 200: unknown;
8606
9015
  /**
8607
9016
  * Unauthorized
8608
9017
  */
8609
- 401: ApiProblemResponseDto;
8610
- /**
8611
- * Forbidden - not owner of rule
8612
- */
8613
- 403: ApiProblemResponseDto;
9018
+ 401: unknown;
8614
9019
  /**
8615
- * Rule not found
9020
+ * Forbidden - insufficient permissions
8616
9021
  */
8617
- 404: ApiProblemResponseDto;
9022
+ 403: unknown;
8618
9023
  };
8619
9024
  };
8620
- };
8621
- '/api/v1/users': {
8622
9025
  delete: {
8623
- req: UserControllerDeleteOwnUserData;
9026
+ req: PropertyControllerDeleteData;
8624
9027
  res: {
8625
9028
  /**
8626
- * User deleted successfully
9029
+ * Property deleted successfully
8627
9030
  */
8628
9031
  204: void;
8629
9032
  /**
8630
- * Invalid access token
9033
+ * Unauthorized
9034
+ */
9035
+ 401: unknown;
9036
+ /**
9037
+ * Forbidden - insufficient permissions
8631
9038
  */
8632
9039
  403: unknown;
8633
- };
8634
- };
8635
- get: {
8636
- req: UserControllerGetUserData;
8637
- res: {
8638
9040
  /**
8639
- * User retrieved successfully
9041
+ * Property not found
8640
9042
  */
8641
- 200: unknown;
9043
+ 404: unknown;
8642
9044
  };
8643
9045
  };
9046
+ };
9047
+ '/api/v1/{region}/bean/transaction-rules': {
8644
9048
  post: {
8645
- req: UserControllerSignupUserData;
9049
+ req: TransactionRuleControllerCreateData;
8646
9050
  res: {
8647
9051
  /**
8648
- * User created successfully
9052
+ * Rule updated successfully (upsert mode)
8649
9053
  */
8650
- 201: unknown;
9054
+ 200: TransactionRuleResponseDto;
8651
9055
  /**
8652
- * Invalid Turnstile token (when Turnstile is enabled)
9056
+ * Validation failed
8653
9057
  */
8654
- 400: unknown;
9058
+ 400: ApiProblemResponseDto;
8655
9059
  /**
8656
- * User signup is disabled
9060
+ * Unauthorized
8657
9061
  */
8658
- 403: unknown;
9062
+ 401: ApiProblemResponseDto;
9063
+ /**
9064
+ * Resource conflict - another process is updating this rule
9065
+ */
9066
+ 409: ApiProblemResponseDto;
8659
9067
  };
8660
9068
  };
8661
- };
8662
- '/api/v1/users/{id}': {
8663
- delete: {
8664
- req: UserControllerDeleteUserData;
9069
+ get: {
9070
+ req: TransactionRuleControllerListData;
8665
9071
  res: {
8666
9072
  /**
8667
- * User deleted successfully
9073
+ * List of rules
8668
9074
  */
8669
- 204: void;
9075
+ 200: TransactionRuleListResponseDto;
8670
9076
  /**
8671
- * Cannot delete own account or insufficient permissions
9077
+ * Unauthorized
8672
9078
  */
8673
- 403: unknown;
9079
+ 401: ApiProblemResponseDto;
8674
9080
  };
8675
9081
  };
8676
9082
  };
8677
- '/api/v1/users/{id}/info': {
8678
- get: {
8679
- req: UserControllerGetUserInfoData;
9083
+ '/api/v1/{region}/bean/transaction-rules/validate': {
9084
+ post: {
9085
+ req: TransactionRuleControllerValidateData;
8680
9086
  res: {
8681
9087
  /**
8682
- * User info retrieved successfully
9088
+ * Validation result
8683
9089
  */
8684
- 200: unknown;
9090
+ 200: ValidateRuleResponseDto;
8685
9091
  /**
8686
- * Cannot access other user info without admin permission
9092
+ * Validation failed
8687
9093
  */
8688
- 403: unknown;
9094
+ 400: ApiProblemResponseDto;
9095
+ /**
9096
+ * Unauthorized
9097
+ */
9098
+ 401: ApiProblemResponseDto;
8689
9099
  };
8690
9100
  };
8691
9101
  };
8692
- '/api/v1/users/setting': {
8693
- put: {
8694
- req: UserControllerUpdateUserSettingData;
9102
+ '/api/v1/{region}/bean/transaction-rules/bulk': {
9103
+ post: {
9104
+ req: TransactionRuleControllerBulkCreateData;
8695
9105
  res: {
8696
9106
  /**
8697
- * Settings updated successfully
9107
+ * Bulk create completed
8698
9108
  */
8699
- 200: unknown;
9109
+ 201: BulkCreateRulesResponseDto;
8700
9110
  /**
8701
- * Insufficient permissions
9111
+ * Invalid bulk create data
8702
9112
  */
8703
- 403: unknown;
9113
+ 400: ApiProblemResponseDto;
9114
+ /**
9115
+ * Unauthorized
9116
+ */
9117
+ 401: ApiProblemResponseDto;
8704
9118
  };
8705
9119
  };
8706
9120
  };
8707
- '/api/v1/users/settings-by-page': {
9121
+ '/api/v1/{region}/bean/transaction-rules/export/{format}': {
8708
9122
  get: {
8709
- req: UserControllerGetAllUserSettingsByPageData;
9123
+ req: TransactionRuleControllerExportData;
8710
9124
  res: {
8711
9125
  /**
8712
- * Settings list retrieved successfully
9126
+ * Exported rules
8713
9127
  */
8714
- 200: unknown;
9128
+ 200: ExportRulesResponseDto;
9129
+ /**
9130
+ * Unsupported format
9131
+ */
9132
+ 400: ApiProblemResponseDto;
9133
+ /**
9134
+ * Unauthorized
9135
+ */
9136
+ 401: ApiProblemResponseDto;
8715
9137
  };
8716
9138
  };
8717
9139
  };
8718
- '/api/v1/users/asset-liability-summary': {
9140
+ '/api/v1/{region}/bean/transaction-rules/statistics/{period}': {
8719
9141
  get: {
9142
+ req: TransactionRuleControllerGetStatisticsData;
8720
9143
  res: {
8721
9144
  /**
8722
- * Summary retrieved successfully
9145
+ * Rule statistics
8723
9146
  */
8724
- 200: unknown;
9147
+ 200: RuleStatisticsResponseDto;
9148
+ /**
9149
+ * Unauthorized
9150
+ */
9151
+ 401: ApiProblemResponseDto;
8725
9152
  };
8726
9153
  };
8727
9154
  };
8728
- '/api/v1/admin/properties': {
9155
+ '/api/v1/{region}/bean/transaction-rules/{ruleId}': {
8729
9156
  get: {
9157
+ req: TransactionRuleControllerGetDetailData;
8730
9158
  res: {
8731
9159
  /**
8732
- * Properties retrieved successfully
9160
+ * Rule details
8733
9161
  */
8734
- 200: unknown;
9162
+ 200: TransactionRuleResponseDto;
8735
9163
  /**
8736
9164
  * Unauthorized
8737
9165
  */
8738
- 401: unknown;
9166
+ 401: ApiProblemResponseDto;
8739
9167
  /**
8740
- * Forbidden - insufficient permissions
9168
+ * Forbidden - not owner of rule
8741
9169
  */
8742
- 403: unknown;
9170
+ 403: ApiProblemResponseDto;
9171
+ /**
9172
+ * Rule not found
9173
+ */
9174
+ 404: ApiProblemResponseDto;
8743
9175
  };
8744
9176
  };
8745
- };
8746
- '/api/v1/admin/properties/{key}': {
8747
- get: {
8748
- req: PropertyControllerGetByKeyData;
9177
+ put: {
9178
+ req: TransactionRuleControllerUpdateData;
8749
9179
  res: {
8750
9180
  /**
8751
- * Property retrieved successfully
9181
+ * Rule updated successfully
8752
9182
  */
8753
- 200: unknown;
9183
+ 200: TransactionRuleResponseDto;
9184
+ /**
9185
+ * Validation failed
9186
+ */
9187
+ 400: ApiProblemResponseDto;
8754
9188
  /**
8755
9189
  * Unauthorized
8756
9190
  */
8757
- 401: unknown;
9191
+ 401: ApiProblemResponseDto;
8758
9192
  /**
8759
- * Forbidden - insufficient permissions
9193
+ * Forbidden - not owner of rule
8760
9194
  */
8761
- 403: unknown;
9195
+ 403: ApiProblemResponseDto;
8762
9196
  /**
8763
- * Property not found
9197
+ * Rule not found
8764
9198
  */
8765
- 404: unknown;
9199
+ 404: ApiProblemResponseDto;
9200
+ /**
9201
+ * Resource conflict - rule is being modified by another process
9202
+ */
9203
+ 409: ApiProblemResponseDto;
8766
9204
  };
8767
9205
  };
8768
- put: {
8769
- req: PropertyControllerUpdateData;
9206
+ delete: {
9207
+ req: TransactionRuleControllerDeleteData;
8770
9208
  res: {
8771
9209
  /**
8772
- * Property updated successfully
9210
+ * Rule deleted successfully
8773
9211
  */
8774
- 200: unknown;
9212
+ 204: void;
8775
9213
  /**
8776
9214
  * Unauthorized
8777
9215
  */
8778
- 401: unknown;
9216
+ 401: ApiProblemResponseDto;
8779
9217
  /**
8780
- * Forbidden - insufficient permissions
9218
+ * Forbidden - not owner of rule
8781
9219
  */
8782
- 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;
8783
9229
  };
8784
9230
  };
8785
- delete: {
8786
- req: PropertyControllerDeleteData;
9231
+ };
9232
+ '/api/v1/{region}/bean/transaction-rules/{ruleId}/test': {
9233
+ post: {
9234
+ req: TransactionRuleControllerTestData;
8787
9235
  res: {
8788
9236
  /**
8789
- * Property deleted successfully
9237
+ * Test result
8790
9238
  */
8791
- 204: void;
9239
+ 200: TestRuleResponseDto;
8792
9240
  /**
8793
9241
  * Unauthorized
8794
9242
  */
8795
- 401: unknown;
9243
+ 401: ApiProblemResponseDto;
8796
9244
  /**
8797
- * Forbidden - insufficient permissions
9245
+ * Forbidden - not owner of rule
8798
9246
  */
8799
- 403: unknown;
9247
+ 403: ApiProblemResponseDto;
8800
9248
  /**
8801
- * Property not found
9249
+ * Rule not found
8802
9250
  */
8803
- 404: unknown;
9251
+ 404: ApiProblemResponseDto;
8804
9252
  };
8805
9253
  };
8806
9254
  };
@@ -9347,7 +9795,7 @@ export type $OpenApiTs = {
9347
9795
  /**
9348
9796
  * List of platforms with user binding status
9349
9797
  */
9350
- 200: unknown;
9798
+ 200: Array<PlatformListItemDto>;
9351
9799
  };
9352
9800
  };
9353
9801
  };
@@ -9356,9 +9804,9 @@ export type $OpenApiTs = {
9356
9804
  req: PlatformControllerMatchPlatformsData;
9357
9805
  res: {
9358
9806
  /**
9359
- * List of matching platforms with suggested segment names
9807
+ * Matching platforms with overall match type and truncation flag
9360
9808
  */
9361
- 200: unknown;
9809
+ 200: PlatformMatchResponseDto;
9362
9810
  };
9363
9811
  };
9364
9812
  };
@@ -9480,78 +9928,6 @@ export type $OpenApiTs = {
9480
9928
  };
9481
9929
  };
9482
9930
  };
9483
- '/api/v1/{region}/reporting/portfolio/trends': {
9484
- get: {
9485
- req: ReportingControllerGetPortfolioTrendsData;
9486
- res: {
9487
- /**
9488
- * Trends retrieved successfully
9489
- */
9490
- 200: PortfolioTrendsResponseDto;
9491
- /**
9492
- * User not authenticated
9493
- */
9494
- 401: unknown;
9495
- };
9496
- };
9497
- };
9498
- '/api/v1/{region}/reporting/cash-flow/trends': {
9499
- get: {
9500
- req: ReportingControllerGetCashFlowTrendsData;
9501
- res: {
9502
- /**
9503
- * Cash-flow trends retrieved successfully
9504
- */
9505
- 200: CashFlowTrendsResponseDto;
9506
- /**
9507
- * User not authenticated
9508
- */
9509
- 401: unknown;
9510
- };
9511
- };
9512
- };
9513
- '/api/v1/{region}/reporting/snapshots/generate': {
9514
- post: {
9515
- req: ReportingControllerGenerateSnapshotData;
9516
- res: {
9517
- /**
9518
- * Snapshot generated successfully
9519
- */
9520
- 200: GenerateSnapshotResponse;
9521
- /**
9522
- * Invalid date format
9523
- */
9524
- 400: unknown;
9525
- /**
9526
- * User not authenticated
9527
- */
9528
- 401: unknown;
9529
- };
9530
- };
9531
- };
9532
- '/api/v1/{region}/reporting/snapshots/backfill': {
9533
- post: {
9534
- req: ReportingControllerBackfillSnapshotsData;
9535
- res: {
9536
- /**
9537
- * Backfill completed successfully
9538
- */
9539
- 200: BackfillSnapshotsResponse;
9540
- /**
9541
- * Invalid date format or range
9542
- */
9543
- 400: unknown;
9544
- /**
9545
- * User not authenticated
9546
- */
9547
- 401: unknown;
9548
- /**
9549
- * Backfill already in progress for this user
9550
- */
9551
- 409: unknown;
9552
- };
9553
- };
9554
- };
9555
9931
  '/api/v1/auth/api-keys': {
9556
9932
  post: {
9557
9933
  res: {
@@ -9573,7 +9949,7 @@ export type $OpenApiTs = {
9573
9949
  /**
9574
9950
  * Login successful
9575
9951
  */
9576
- 200: unknown;
9952
+ 200: AnonymousLoginResponseDto;
9577
9953
  /**
9578
9954
  * Invalid access token
9579
9955
  */
@@ -9720,4 +10096,30 @@ export type $OpenApiTs = {
9720
10096
  };
9721
10097
  };
9722
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
+ };
9723
10125
  };