@firela/api-types 0.0.0-canary.8c68ebbe → 0.0.0-canary.92035f3d

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,13 +6,9 @@ export type CreateAccountDto = {
6
6
  */
7
7
  path: string;
8
8
  /**
9
- * Display name to distinguish accounts at the same path (default: "")
9
+ * Account open date (server defaults to today)
10
10
  */
11
- displayName?: string;
12
- /**
13
- * Account open date
14
- */
15
- openDate: string;
11
+ openDate?: string;
16
12
  /**
17
13
  * Allowed currencies (null = no restriction)
18
14
  */
@@ -36,18 +32,14 @@ export type CreateAccountDto = {
36
32
  * Whether this is a custom (user-created) account
37
33
  */
38
34
  isCustom?: boolean;
39
- /**
40
- * i18n key for display name (overrides template)
41
- */
42
- i18nKey?: string;
43
35
  /**
44
36
  * Icon identifier (overrides template)
45
37
  */
46
38
  icon?: string;
47
39
  /**
48
- * Additional metadata
40
+ * Open directive metadata (NOT an opening-balance amount — use the opening-balance endpoint)
49
41
  */
50
- openMeta?: {
42
+ openDirectiveMeta?: {
51
43
  [key: string]: unknown;
52
44
  };
53
45
  /**
@@ -77,14 +69,47 @@ export type AccountResponseDto = {
77
69
  * Account path (hierarchical, colon-separated)
78
70
  */
79
71
  path: string;
80
- /**
81
- * Display name distinguishing multiple accounts at the same path
82
- */
83
- displayName: string;
84
72
  /**
85
73
  * Account type (root segment)
86
74
  */
87
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;
88
113
  /**
89
114
  * Account status
90
115
  */
@@ -121,17 +146,17 @@ export type AccountResponseDto = {
121
146
  */
122
147
  isCustom: boolean;
123
148
  /**
124
- * i18n key for display name
149
+ * Localized display name (ADR-0114, read-time projection)
125
150
  */
126
- i18nKey?: string;
151
+ displayName?: string;
127
152
  /**
128
153
  * Icon identifier
129
154
  */
130
155
  icon?: string;
131
156
  /**
132
- * Account metadata
157
+ * Open directive metadata (ADR-0115 Decision 9)
133
158
  */
134
- openMeta?: {
159
+ openDirectiveMeta?: {
135
160
  [key: string]: unknown;
136
161
  };
137
162
  /**
@@ -161,6 +186,43 @@ export type AccountResponseDto = {
161
186
  */
162
187
  export type type = 'Assets' | 'Liabilities' | 'Income' | 'Expenses' | 'Equity';
163
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
+
164
226
  /**
165
227
  * Account status
166
228
  */
@@ -178,10 +240,6 @@ export type AccountListResponseDto = {
178
240
  };
179
241
 
180
242
  export type UpdateAccountDto = {
181
- /**
182
- * Display name to distinguish accounts at the same path
183
- */
184
- displayName?: string;
185
243
  /**
186
244
  * Allowed currencies (null = no restriction)
187
245
  */
@@ -197,18 +255,14 @@ export type UpdateAccountDto = {
197
255
  | 'STRICT'
198
256
  | 'STRICT_WITH_SIZE'
199
257
  | 'NONE';
200
- /**
201
- * i18n key for display name
202
- */
203
- i18nKey?: string;
204
258
  /**
205
259
  * Icon identifier
206
260
  */
207
261
  icon?: string;
208
262
  /**
209
- * Additional metadata (merged with existing)
263
+ * Open directive metadata (merged with existing; NOT an opening-balance amount)
210
264
  */
211
- openMeta?: {
265
+ openDirectiveMeta?: {
212
266
  [key: string]: unknown;
213
267
  };
214
268
  /**
@@ -237,6 +291,28 @@ export type ReopenAccountDto = {
237
291
  reopenDate?: string;
238
292
  };
239
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
+
240
316
  export type AccountStandardResponseDto = {
241
317
  /**
242
318
  * Account path (hierarchical, colon-separated)
@@ -246,10 +322,6 @@ export type AccountStandardResponseDto = {
246
322
  * Account type in Beancount hierarchy
247
323
  */
248
324
  type: 'Assets' | 'Liabilities' | 'Income' | 'Expenses' | 'Equity';
249
- /**
250
- * i18n key for localized display name
251
- */
252
- i18nKey: string;
253
325
  /**
254
326
  * Short localized display name
255
327
  */
@@ -284,10 +356,6 @@ export type AccountStandardListResponseDto = {
284
356
  };
285
357
 
286
358
  export type TemplateMetadataDto = {
287
- /**
288
- * Whether this path can be extended
289
- */
290
- extendable: boolean;
291
359
  /**
292
360
  * Root account type
293
361
  */
@@ -848,6 +916,51 @@ export type flag2 =
848
916
  */
849
917
  export type status2 = 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
850
918
 
919
+ export type BalanceByCurrencyDto = {
920
+ /**
921
+ * ISO 4217 currency code
922
+ */
923
+ currency: string;
924
+ /**
925
+ * Balance amount
926
+ */
927
+ balance: string;
928
+ };
929
+
930
+ export type ExchangeRateWarningDto = {
931
+ /**
932
+ * Warning type
933
+ */
934
+ type: string;
935
+ /**
936
+ * Currency without exchange rate
937
+ */
938
+ currency: string;
939
+ /**
940
+ * Total amount affected
941
+ */
942
+ totalAmount: string;
943
+ };
944
+
945
+ export type TransactionListSummaryDto = {
946
+ /**
947
+ * Partial converted total in base currency (rated currencies only, raw Beancount sign). When warnings is non-empty this excludes currencies missing an FX rate; may be "0.00" if ALL non-base currencies lack a rate. Converted at the dateTo (or current) available rate.
948
+ */
949
+ totalAmount: string;
950
+ /**
951
+ * Base currency (ISO 4217)
952
+ */
953
+ currency: string;
954
+ /**
955
+ * Raw (unconverted) balance per currency
956
+ */
957
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
958
+ /**
959
+ * Currencies missing an FX rate (omitted when empty)
960
+ */
961
+ warnings?: Array<ExchangeRateWarningDto>;
962
+ };
963
+
851
964
  export type TransactionListResponseDto = {
852
965
  /**
853
966
  * List of transactions
@@ -865,6 +978,10 @@ export type TransactionListResponseDto = {
865
978
  * Number of items skipped
866
979
  */
867
980
  offset: number;
981
+ /**
982
+ * Amount summary for the full filtered set (#514). Present only when the request has a single account OR category viewpoint; omitted for search-only / plain-list / dual-perspective requests.
983
+ */
984
+ summary?: TransactionListSummaryDto;
868
985
  };
869
986
 
870
987
  export type TagSuggestionDto = {
@@ -1917,6 +2034,108 @@ export type UpdateCommodityDto = {
1917
2034
  };
1918
2035
  };
1919
2036
 
2037
+ export type CreateBeanPriceDto = {
2038
+ /**
2039
+ * Currency being priced (e.g., USD, AAPL, BTC)
2040
+ */
2041
+ currency: string;
2042
+ /**
2043
+ * Quote currency (pricing currency, e.g., CNY, EUR)
2044
+ */
2045
+ quoteCurrency: string;
2046
+ /**
2047
+ * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
2048
+ */
2049
+ amount: number;
2050
+ /**
2051
+ * Price date (ISO 8601 format)
2052
+ */
2053
+ date: string;
2054
+ /**
2055
+ * Metadata (validated by Zod schema, max field lengths enforced)
2056
+ */
2057
+ metadata?: {
2058
+ [key: string]: unknown;
2059
+ };
2060
+ };
2061
+
2062
+ export type PriceResponseDto = {
2063
+ /**
2064
+ * Unique identifier
2065
+ */
2066
+ id: string;
2067
+ /**
2068
+ * User ID (owner of the price)
2069
+ */
2070
+ userId: string;
2071
+ /**
2072
+ * Currency being priced (e.g., USD, AAPL, BTC)
2073
+ */
2074
+ currency: string;
2075
+ /**
2076
+ * Quote currency (pricing currency, e.g., USD, CNY)
2077
+ */
2078
+ quoteCurrency: string;
2079
+ /**
2080
+ * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
2081
+ */
2082
+ amount: number;
2083
+ /**
2084
+ * Price date (ISO 8601 format). Represents the date this price was valid.
2085
+ */
2086
+ date: string;
2087
+ /**
2088
+ * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
2089
+ */
2090
+ meta: {
2091
+ [key: string]: unknown;
2092
+ };
2093
+ /**
2094
+ * Creation timestamp
2095
+ */
2096
+ createdAt: string;
2097
+ /**
2098
+ * Last update timestamp
2099
+ */
2100
+ updatedAt: string;
2101
+ };
2102
+
2103
+ export type PriceListResponseDto = {
2104
+ /**
2105
+ * List of prices
2106
+ */
2107
+ items: Array<PriceResponseDto>;
2108
+ /**
2109
+ * Total number of prices
2110
+ */
2111
+ total: number;
2112
+ };
2113
+
2114
+ export type UpdateBeanPriceDto = {
2115
+ /**
2116
+ * Currency being priced
2117
+ */
2118
+ currency?: string;
2119
+ /**
2120
+ * Quote currency (pricing currency)
2121
+ */
2122
+ quoteCurrency?: string;
2123
+ /**
2124
+ * Price amount (MUST be >= 0 per Beancount spec)
2125
+ */
2126
+ amount?: number;
2127
+ /**
2128
+ * Price date (ISO 8601 format)
2129
+ */
2130
+ date?: string;
2131
+ /**
2132
+ * Metadata
2133
+ */
2134
+ metadata?: {
2135
+ [key: string]: unknown;
2136
+ };
2137
+ };
2138
+
1920
2139
  export type CreateRecurringRuleDto = {
1921
2140
  /**
1922
2141
  * Rule name (unique per user)
@@ -2556,68 +2775,380 @@ export type ForecastResponseDto = {
2556
2775
  periodEnd: string;
2557
2776
  };
2558
2777
 
2559
- export type CreateTransactionRuleDto = {
2560
- name: string;
2561
- description?: string;
2562
- narrationKeywords?: Array<unknown[]>;
2563
- payeeKeywords?: Array<unknown[]>;
2564
- categoryKeywords?: Array<unknown[]>;
2778
+ export type CurrencyBalanceDto = {
2565
2779
  /**
2566
- * Payment method keywords (e.g., HuaBei, YuEBao)
2780
+ * ISO 4217 currency code
2567
2781
  */
2568
- methodKeywords?: Array<unknown[]>;
2782
+ currency: string;
2569
2783
  /**
2570
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2784
+ * Balance amount
2571
2785
  */
2572
- categoryAccount?: string;
2573
- matchLogic: 'OR' | 'AND';
2786
+ balance: string;
2787
+ };
2788
+
2789
+ export type TimeSeriesPointDto = {
2574
2790
  /**
2575
- * Minimum transaction amount (inclusive)
2791
+ * Date in YYYY-MM-DD format
2576
2792
  */
2577
- amountMin?: number;
2793
+ date: string;
2578
2794
  /**
2579
- * Maximum transaction amount (inclusive)
2795
+ * Value at this date (in base currency)
2580
2796
  */
2581
- amountMax?: number;
2582
- priority: number;
2583
- additionalTags?: Array<unknown[]>;
2584
- additionalMetadata?: {
2797
+ value: string;
2798
+ /**
2799
+ * Change from previous point
2800
+ */
2801
+ change?: {
2585
2802
  [key: string]: unknown;
2586
2803
  };
2587
2804
  /**
2588
- * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
2805
+ * Total assets at this date (in base currency)
2589
2806
  */
2590
- upsertByPayee?: boolean;
2591
- };
2592
-
2593
- export type matchLogic = 'OR' | 'AND';
2594
-
2595
- export type AmountRangeDto = {
2807
+ assets?: string;
2596
2808
  /**
2597
- * Minimum amount
2809
+ * Total liabilities at this date (in base currency)
2598
2810
  */
2599
- min?: number;
2811
+ liabilities?: string;
2600
2812
  /**
2601
- * Maximum amount
2813
+ * Multi-currency breakdown for this point
2602
2814
  */
2603
- max?: number;
2815
+ byCurrency?: Array<CurrencyBalanceDto>;
2604
2816
  };
2605
2817
 
2606
- export type TransactionRuleResponseDto = {
2818
+ export type TrendSummaryDto = {
2607
2819
  /**
2608
- * Rule ID
2820
+ * Value at start of period
2609
2821
  */
2610
- id: string;
2822
+ startValue: string;
2611
2823
  /**
2612
- * Rule name
2824
+ * Value at end of period
2613
2825
  */
2614
- name: string;
2826
+ endValue: string;
2615
2827
  /**
2616
- * Rule description
2828
+ * Total change over period
2617
2829
  */
2618
- description?: string;
2830
+ totalChange: string;
2619
2831
  /**
2620
- * Keywords to match in transaction narration
2832
+ * Total change percentage
2833
+ */
2834
+ totalChangePercentage: string;
2835
+ };
2836
+
2837
+ export type MultiCurrencyPointDto = {
2838
+ /**
2839
+ * Date in YYYY-MM-DD format
2840
+ */
2841
+ date: string;
2842
+ /**
2843
+ * Balances by currency
2844
+ */
2845
+ byCurrency: Array<CurrencyBalanceDto>;
2846
+ };
2847
+
2848
+ export type PortfolioTrendsResponseDto = {
2849
+ /**
2850
+ * Time series data points
2851
+ */
2852
+ series: Array<TimeSeriesPointDto>;
2853
+ /**
2854
+ * Period summary
2855
+ */
2856
+ summary: TrendSummaryDto;
2857
+ /**
2858
+ * Period requested
2859
+ */
2860
+ period: string;
2861
+ /**
2862
+ * Data granularity
2863
+ */
2864
+ granularity: string;
2865
+ /**
2866
+ * Base currency for converted values
2867
+ */
2868
+ currency: string;
2869
+ /**
2870
+ * Multi-currency time series (each point has currency breakdown)
2871
+ */
2872
+ byCurrency?: Array<MultiCurrencyPointDto>;
2873
+ /**
2874
+ * Exchange rate warnings
2875
+ */
2876
+ warnings?: Array<ExchangeRateWarningDto>;
2877
+ };
2878
+
2879
+ export type CashFlowPointDto = {
2880
+ /**
2881
+ * Month key (YYYY-MM)
2882
+ */
2883
+ month: string;
2884
+ /**
2885
+ * Income in base currency (absolute, converted)
2886
+ */
2887
+ income: string;
2888
+ /**
2889
+ * Expense in base currency (absolute, converted)
2890
+ */
2891
+ expense: string;
2892
+ /**
2893
+ * netSavings = income − expense (savings positive)
2894
+ */
2895
+ netSavings: string;
2896
+ };
2897
+
2898
+ export type CashFlowTrendSummaryDto = {
2899
+ /**
2900
+ * Total income across the period
2901
+ */
2902
+ totalIncome: string;
2903
+ /**
2904
+ * Total expense across the period
2905
+ */
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;
2915
+ };
2916
+
2917
+ export type CashFlowTrendsResponseDto = {
2918
+ /**
2919
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
2920
+ */
2921
+ series: Array<CashFlowPointDto>;
2922
+ /**
2923
+ * Period totals
2924
+ */
2925
+ summary: CashFlowTrendSummaryDto;
2926
+ /**
2927
+ * Period requested
2928
+ */
2929
+ period: string;
2930
+ /**
2931
+ * Data granularity (v1 returns month buckets)
2932
+ */
2933
+ granularity: string;
2934
+ /**
2935
+ * Base currency for converted values
2936
+ */
2937
+ currency: string;
2938
+ /**
2939
+ * Exchange rate warnings (e.g. missing rate for a currency)
2940
+ */
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 = {
2953
+ /**
2954
+ * Access token for user verification
2955
+ */
2956
+ accessToken: string;
2957
+ };
2958
+
2959
+ export type SignupDto = {
2960
+ /**
2961
+ * Cloudflare Turnstile verification token (optional when Turnstile disabled)
2962
+ */
2963
+ turnstileToken?: string;
2964
+ };
2965
+
2966
+ export type SignupResponseDto = {
2967
+ /**
2968
+ * JWT auth token
2969
+ */
2970
+ authToken: string;
2971
+ /**
2972
+ * Auto-generated access token
2973
+ */
2974
+ accessToken: string;
2975
+ /**
2976
+ * Assigned user role
2977
+ */
2978
+ role: 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2979
+ };
2980
+
2981
+ /**
2982
+ * Assigned user role
2983
+ */
2984
+ export type role = 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2985
+
2986
+ export type UpdateUserSettingDto = {
2987
+ /**
2988
+ * Security ID
2989
+ */
2990
+ secId?: number;
2991
+ /**
2992
+ * Annual interest rate
2993
+ */
2994
+ annualInterestRate?: number;
2995
+ /**
2996
+ * Currency code
2997
+ */
2998
+ currency?: string;
2999
+ /**
3000
+ * Base currency code
3001
+ */
3002
+ baseCurrency?: string;
3003
+ /**
3004
+ * Benchmark symbol
3005
+ */
3006
+ benchmark?: string;
3007
+ /**
3008
+ * Color scheme
3009
+ */
3010
+ colorScheme?: 'DARK' | 'LIGHT';
3011
+ /**
3012
+ * Date range filter
3013
+ */
3014
+ dateRange?: string;
3015
+ /**
3016
+ * Emergency fund amount
3017
+ */
3018
+ emergencyFund?: number;
3019
+ /**
3020
+ * Account filter IDs
3021
+ */
3022
+ 'filters.accounts'?: Array<string>;
3023
+ /**
3024
+ * Asset class filters
3025
+ */
3026
+ 'filters.assetClasses'?: Array<string>;
3027
+ /**
3028
+ * Data source filter
3029
+ */
3030
+ 'filters.dataSource'?: string;
3031
+ /**
3032
+ * Symbol filter
3033
+ */
3034
+ 'filters.symbol'?: string;
3035
+ /**
3036
+ * Tag filters
3037
+ */
3038
+ 'filters.tags'?: Array<string>;
3039
+ /**
3040
+ * Enable experimental features
3041
+ */
3042
+ isExperimentalFeatures?: boolean;
3043
+ /**
3044
+ * Enable restricted view mode
3045
+ */
3046
+ isRestrictedView?: boolean;
3047
+ /**
3048
+ * Language code
3049
+ */
3050
+ language?: string;
3051
+ /**
3052
+ * Locale code
3053
+ */
3054
+ locale?: string;
3055
+ /**
3056
+ * Projected total amount
3057
+ */
3058
+ projectedTotalAmount?: number;
3059
+ /**
3060
+ * Retirement date in ISO 8601 format
3061
+ */
3062
+ retirementDate?: string;
3063
+ /**
3064
+ * Savings rate percentage
3065
+ */
3066
+ savingsRate?: number;
3067
+ /**
3068
+ * View mode
3069
+ */
3070
+ viewMode?: 'DEFAULT' | 'ZEN';
3071
+ };
3072
+
3073
+ /**
3074
+ * Color scheme
3075
+ */
3076
+ export type colorScheme = 'DARK' | 'LIGHT';
3077
+
3078
+ /**
3079
+ * View mode
3080
+ */
3081
+ export type viewMode = 'DEFAULT' | 'ZEN';
3082
+
3083
+ export type UpdatePropertyDto = {
3084
+ /**
3085
+ * Property value
3086
+ */
3087
+ value: string;
3088
+ };
3089
+
3090
+ export type CreateTransactionRuleDto = {
3091
+ name: string;
3092
+ description?: string;
3093
+ narrationKeywords?: Array<unknown[]>;
3094
+ payeeKeywords?: Array<unknown[]>;
3095
+ categoryKeywords?: Array<unknown[]>;
3096
+ /**
3097
+ * Payment method keywords (e.g., HuaBei, YuEBao)
3098
+ */
3099
+ methodKeywords?: Array<unknown[]>;
3100
+ /**
3101
+ * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
3102
+ */
3103
+ categoryAccount?: string;
3104
+ matchLogic: 'OR' | 'AND';
3105
+ /**
3106
+ * Minimum transaction amount (inclusive)
3107
+ */
3108
+ amountMin?: number;
3109
+ /**
3110
+ * Maximum transaction amount (inclusive)
3111
+ */
3112
+ amountMax?: number;
3113
+ priority: number;
3114
+ additionalTags?: Array<unknown[]>;
3115
+ additionalMetadata?: {
3116
+ [key: string]: unknown;
3117
+ };
3118
+ /**
3119
+ * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
3120
+ */
3121
+ upsertByPayee?: boolean;
3122
+ };
3123
+
3124
+ export type matchLogic = 'OR' | 'AND';
3125
+
3126
+ export type AmountRangeDto = {
3127
+ /**
3128
+ * Minimum amount
3129
+ */
3130
+ min?: number;
3131
+ /**
3132
+ * Maximum amount
3133
+ */
3134
+ max?: number;
3135
+ };
3136
+
3137
+ export type TransactionRuleResponseDto = {
3138
+ /**
3139
+ * Rule ID
3140
+ */
3141
+ id: string;
3142
+ /**
3143
+ * Rule name
3144
+ */
3145
+ name: string;
3146
+ /**
3147
+ * Rule description
3148
+ */
3149
+ description?: string;
3150
+ /**
3151
+ * Keywords to match in transaction narration
2621
3152
  */
2622
3153
  narrationKeywords: Array<string>;
2623
3154
  /**
@@ -2855,178 +3386,60 @@ export type UpdateTransactionRuleDto = {
2855
3386
  payeeKeywords?: Array<unknown[]>;
2856
3387
  categoryKeywords?: Array<unknown[]>;
2857
3388
  /**
2858
- * Payment method keywords (e.g., HuaBei, YuEBao)
2859
- */
2860
- methodKeywords?: Array<unknown[]>;
2861
- /**
2862
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2863
- */
2864
- categoryAccount?: string;
2865
- matchLogic?: 'OR' | 'AND';
2866
- /**
2867
- * Minimum transaction amount (inclusive)
2868
- */
2869
- amountMin?: number;
2870
- /**
2871
- * Maximum transaction amount (inclusive)
2872
- */
2873
- amountMax?: number;
2874
- priority?: number;
2875
- /**
2876
- * Enable or disable the rule
2877
- */
2878
- enabled?: boolean;
2879
- additionalTags?: Array<unknown[]>;
2880
- additionalMetadata?: {
2881
- [key: string]: unknown;
2882
- };
2883
- };
2884
-
2885
- export type TestRuleDto = {
2886
- narration: string;
2887
- payee?: string;
2888
- categoryAccount?: string;
2889
- amount?: number;
2890
- currency?: string;
2891
- };
2892
-
2893
- export type TestRuleResponseDto = {
2894
- /**
2895
- * Rule ID that was tested
2896
- */
2897
- ruleId: string;
2898
- /**
2899
- * Whether the rule matched the test data
2900
- */
2901
- matches: boolean;
2902
- /**
2903
- * Match confidence score (0-1)
2904
- */
2905
- confidence: number;
2906
- /**
2907
- * Details of which fields matched
2908
- */
2909
- matchDetails: {
2910
- [key: string]: unknown;
2911
- };
2912
- };
2913
-
2914
- export type DeleteOwnUserDto = {
2915
- /**
2916
- * Access token for user verification
2917
- */
2918
- accessToken: string;
2919
- };
2920
-
2921
- export type SignupDto = {
2922
- /**
2923
- * Cloudflare Turnstile verification token (optional when Turnstile disabled)
2924
- */
2925
- turnstileToken?: string;
2926
- };
2927
-
2928
- export type UpdateUserSettingDto = {
2929
- /**
2930
- * Security ID
2931
- */
2932
- secId?: number;
2933
- /**
2934
- * Annual interest rate
2935
- */
2936
- annualInterestRate?: number;
2937
- /**
2938
- * Currency code
2939
- */
2940
- currency?: string;
2941
- /**
2942
- * Base currency code
2943
- */
2944
- baseCurrency?: string;
2945
- /**
2946
- * Benchmark symbol
2947
- */
2948
- benchmark?: string;
2949
- /**
2950
- * Color scheme
2951
- */
2952
- colorScheme?: 'DARK' | 'LIGHT';
2953
- /**
2954
- * Date range filter
2955
- */
2956
- dateRange?: string;
2957
- /**
2958
- * Emergency fund amount
2959
- */
2960
- emergencyFund?: number;
2961
- /**
2962
- * Account filter IDs
2963
- */
2964
- 'filters.accounts'?: Array<string>;
2965
- /**
2966
- * Asset class filters
2967
- */
2968
- 'filters.assetClasses'?: Array<string>;
2969
- /**
2970
- * Data source filter
2971
- */
2972
- 'filters.dataSource'?: string;
2973
- /**
2974
- * Symbol filter
2975
- */
2976
- 'filters.symbol'?: string;
2977
- /**
2978
- * Tag filters
2979
- */
2980
- 'filters.tags'?: Array<string>;
2981
- /**
2982
- * Enable experimental features
3389
+ * Payment method keywords (e.g., HuaBei, YuEBao)
2983
3390
  */
2984
- isExperimentalFeatures?: boolean;
3391
+ methodKeywords?: Array<unknown[]>;
2985
3392
  /**
2986
- * Enable restricted view mode
3393
+ * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2987
3394
  */
2988
- isRestrictedView?: boolean;
3395
+ categoryAccount?: string;
3396
+ matchLogic?: 'OR' | 'AND';
2989
3397
  /**
2990
- * Language code
3398
+ * Minimum transaction amount (inclusive)
2991
3399
  */
2992
- language?: string;
3400
+ amountMin?: number;
2993
3401
  /**
2994
- * Locale code
3402
+ * Maximum transaction amount (inclusive)
2995
3403
  */
2996
- locale?: string;
3404
+ amountMax?: number;
3405
+ priority?: number;
2997
3406
  /**
2998
- * Projected total amount
3407
+ * Enable or disable the rule
2999
3408
  */
3000
- projectedTotalAmount?: number;
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 = {
3001
3425
  /**
3002
- * Retirement date in ISO 8601 format
3426
+ * Rule ID that was tested
3003
3427
  */
3004
- retirementDate?: string;
3428
+ ruleId: string;
3005
3429
  /**
3006
- * Savings rate percentage
3430
+ * Whether the rule matched the test data
3007
3431
  */
3008
- savingsRate?: number;
3432
+ matches: boolean;
3009
3433
  /**
3010
- * View mode
3434
+ * Match confidence score (0-1)
3011
3435
  */
3012
- viewMode?: 'DEFAULT' | 'ZEN';
3013
- };
3014
-
3015
- /**
3016
- * Color scheme
3017
- */
3018
- export type colorScheme = 'DARK' | 'LIGHT';
3019
-
3020
- /**
3021
- * View mode
3022
- */
3023
- export type viewMode = 'DEFAULT' | 'ZEN';
3024
-
3025
- export type UpdatePropertyDto = {
3436
+ confidence: number;
3026
3437
  /**
3027
- * Property value
3438
+ * Details of which fields matched
3028
3439
  */
3029
- value: string;
3440
+ matchDetails: {
3441
+ [key: string]: unknown;
3442
+ };
3030
3443
  };
3031
3444
 
3032
3445
  export type CreateBeanEventDto = {
@@ -3119,6 +3532,160 @@ export type UpdateBeanEventDto = {
3119
3532
  };
3120
3533
  };
3121
3534
 
3535
+ export type OnboardingAccountDto = {
3536
+ /**
3537
+ * Account path (Assets/Liabilities only; format validated by the account service)
3538
+ */
3539
+ path: string;
3540
+ /**
3541
+ * ISO 4217 currency code (3 letters)
3542
+ */
3543
+ currency: string;
3544
+ /**
3545
+ * Opening balance as a non-negative Decimal string (e.g. "1000.00")
3546
+ */
3547
+ openingBalance?: string;
3548
+ /**
3549
+ * Platform ID to bind the account to (references Platform.id); omit for unbound
3550
+ */
3551
+ platformId?: string;
3552
+ };
3553
+
3554
+ export type OnboardingDto = {
3555
+ /**
3556
+ * Asset/Liability accounts to register with opening balances
3557
+ */
3558
+ accounts?: Array<OnboardingAccountDto>;
3559
+ /**
3560
+ * Skip asset registration; only bootstrap the core account set
3561
+ */
3562
+ skipAssetRegistration?: boolean;
3563
+ };
3564
+
3565
+ export type ActualBalanceDto = {
3566
+ /**
3567
+ * Actual balance amount as a decimal string (preserves precision for tolerance inference).
3568
+ */
3569
+ amount: string;
3570
+ /**
3571
+ * Currency code (ISO 4217 or commodity ticker).
3572
+ */
3573
+ ccy: string;
3574
+ };
3575
+
3576
+ export type ComputeReconciliationDto = {
3577
+ /**
3578
+ * BeanAccount id to reconcile.
3579
+ */
3580
+ accountId: string;
3581
+ /**
3582
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3583
+ */
3584
+ asOfDate: string;
3585
+ /**
3586
+ * Actual balance from the external statement.
3587
+ */
3588
+ actualBalance: ActualBalanceDto;
3589
+ };
3590
+
3591
+ export type ReconciliationComputeResultDto = {
3592
+ accountId: string;
3593
+ asOfDate: string;
3594
+ /**
3595
+ * System-computed book balance (decimal string).
3596
+ */
3597
+ bookBalance: string;
3598
+ /**
3599
+ * User-entered actual balance (decimal string).
3600
+ */
3601
+ actualBalance: string;
3602
+ currency: string;
3603
+ /**
3604
+ * Diff = book − actual (decimal string).
3605
+ */
3606
+ diff: string;
3607
+ /**
3608
+ * Applied tolerance (decimal string).
3609
+ */
3610
+ tolerance: string;
3611
+ /**
3612
+ * true when |diff| ≤ tolerance.
3613
+ */
3614
+ withinTolerance: boolean;
3615
+ /**
3616
+ * Suggested next action: assert when within tolerance, pad otherwise.
3617
+ */
3618
+ suggestedAction: 'assert' | 'pad';
3619
+ };
3620
+
3621
+ /**
3622
+ * Suggested next action: assert when within tolerance, pad otherwise.
3623
+ */
3624
+ export type suggestedAction = 'assert' | 'pad';
3625
+
3626
+ export type AssertReconciliationDto = {
3627
+ /**
3628
+ * BeanAccount id to reconcile.
3629
+ */
3630
+ accountId: string;
3631
+ /**
3632
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3633
+ */
3634
+ asOfDate: string;
3635
+ /**
3636
+ * Actual balance from the external statement.
3637
+ */
3638
+ actualBalance: ActualBalanceDto;
3639
+ /**
3640
+ * Optional explicit tolerance override. Omit to infer from amount precision (Beancount default).
3641
+ */
3642
+ tolerance?: string;
3643
+ };
3644
+
3645
+ export type ReconciliationRecordDto = {
3646
+ id: string;
3647
+ accountId: string;
3648
+ date: string;
3649
+ /**
3650
+ * Asserted (actual) amount.
3651
+ */
3652
+ amount: string;
3653
+ currency: string;
3654
+ tolerance?: string;
3655
+ /**
3656
+ * book − actual.
3657
+ */
3658
+ diffAmount?: string;
3659
+ diffCurrency?: string;
3660
+ createdAt: string;
3661
+ };
3662
+
3663
+ export type PadReconciliationDto = {
3664
+ /**
3665
+ * BeanAccount id to reconcile.
3666
+ */
3667
+ accountId: string;
3668
+ /**
3669
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3670
+ */
3671
+ asOfDate: string;
3672
+ /**
3673
+ * Actual balance from the external statement.
3674
+ */
3675
+ actualBalance: ActualBalanceDto;
3676
+ /**
3677
+ * Pad source account. Defaults to Equity:Opening-Balances (official Beancount convention).
3678
+ */
3679
+ sourceAccount?: string;
3680
+ };
3681
+
3682
+ export type PadResultDto = {
3683
+ /**
3684
+ * Created pad adjusting transaction id.
3685
+ */
3686
+ transactionId: string;
3687
+ };
3688
+
3122
3689
  export type FileImportDto = {
3123
3690
  /**
3124
3691
  * Bill file to import (CSV, PDF, OFX, etc.)
@@ -3409,100 +3976,12 @@ export type UpdateConfigDataDto = {
3409
3976
  */
3410
3977
  defaults?: UpdateMapperDefaultsDto;
3411
3978
  };
3412
-
3413
- export type UpdateImporterConfigDto = {
3414
- /**
3415
- * Configuration data (v1 schema)
3416
- */
3417
- data?: UpdateConfigDataDto;
3418
- };
3419
-
3420
- export type CreatePlatformDto = {
3421
- /**
3422
- * Platform name
3423
- */
3424
- name: string;
3425
- /**
3426
- * Platform canonical identifier (lowercase, kebab-case)
3427
- */
3428
- canonical: string;
3429
- /**
3430
- * Platform aliases (multi-language names for lookup)
3431
- */
3432
- aliases: Array<string>;
3433
- /**
3434
- * Platform URL
3435
- */
3436
- url: string;
3437
- /**
3438
- * Platform type
3439
- */
3440
- type:
3441
- | 'BANK'
3442
- | 'BROKERAGE'
3443
- | 'CRYPTO_EXCHANGE'
3444
- | 'PAYMENT'
3445
- | 'INVESTMENT'
3446
- | 'INSURANCE'
3447
- | 'OTHER';
3448
- /**
3449
- * Platform logo URL
3450
- */
3451
- logoUrl?: string;
3452
- /**
3453
- * Whether the platform is active
3454
- */
3455
- isActive?: boolean;
3456
- };
3457
-
3458
- /**
3459
- * Platform type
3460
- */
3461
- export type type3 =
3462
- | 'BANK'
3463
- | 'BROKERAGE'
3464
- | 'CRYPTO_EXCHANGE'
3465
- | 'PAYMENT'
3466
- | 'INVESTMENT'
3467
- | 'INSURANCE'
3468
- | 'OTHER';
3469
-
3470
- export type UpdatePlatformDto = {
3471
- /**
3472
- * Platform name
3473
- */
3474
- name?: string;
3475
- /**
3476
- * Platform canonical identifier (lowercase, kebab-case)
3477
- */
3478
- canonical?: string;
3479
- /**
3480
- * Platform aliases (multi-language names for lookup)
3481
- */
3482
- aliases?: Array<string>;
3483
- /**
3484
- * Platform URL
3485
- */
3486
- url?: string;
3487
- /**
3488
- * Platform type
3489
- */
3490
- type?:
3491
- | 'BANK'
3492
- | 'BROKERAGE'
3493
- | 'CRYPTO_EXCHANGE'
3494
- | 'PAYMENT'
3495
- | 'INVESTMENT'
3496
- | 'INSURANCE'
3497
- | 'OTHER';
3498
- /**
3499
- * Platform logo URL
3500
- */
3501
- logoUrl?: string;
3979
+
3980
+ export type UpdateImporterConfigDto = {
3502
3981
  /**
3503
- * Whether the platform is active
3982
+ * Configuration data (v1 schema)
3504
3983
  */
3505
- isActive?: boolean;
3984
+ data?: UpdateConfigDataDto;
3506
3985
  };
3507
3986
 
3508
3987
  export type ProviderSyncConfigDto = {
@@ -3526,6 +4005,10 @@ export type ProviderSyncConfigDto = {
3526
4005
  * Filter pending transactions
3527
4006
  */
3528
4007
  filterPending?: boolean;
4008
+ /**
4009
+ * External account ID for per-batch providers (e.g. GoCardless). Overrides sourceAccount when an ExternalAccountLink mapping exists.
4010
+ */
4011
+ externalAccountId?: string;
3529
4012
  };
3530
4013
 
3531
4014
  export type ProviderSyncDto = {
@@ -3581,6 +4064,61 @@ export type SupportedProvidersResponseDto = {
3581
4064
  providers: Array<string>;
3582
4065
  };
3583
4066
 
4067
+ export type CreateExternalAccountLinkDto = {
4068
+ /**
4069
+ * Open Banking provider (whitelist)
4070
+ */
4071
+ provider:
4072
+ | 'plaid'
4073
+ | 'teller'
4074
+ | 'truelayer'
4075
+ | 'gocardless'
4076
+ | 'simplefin'
4077
+ | 'yodlee'
4078
+ | 'beancount-direct'
4079
+ | 'parsed-bill';
4080
+ /**
4081
+ * External account ID from the provider
4082
+ */
4083
+ externalAccountId: string;
4084
+ /**
4085
+ * Target BeanAccount ID (must belong to the JWT user)
4086
+ */
4087
+ beanAccountId: string;
4088
+ };
4089
+
4090
+ /**
4091
+ * Open Banking provider (whitelist)
4092
+ */
4093
+ export type provider =
4094
+ | 'plaid'
4095
+ | 'teller'
4096
+ | 'truelayer'
4097
+ | 'gocardless'
4098
+ | 'simplefin'
4099
+ | 'yodlee'
4100
+ | 'beancount-direct'
4101
+ | 'parsed-bill';
4102
+
4103
+ export type ExternalAccountLinkResponseDto = {
4104
+ id: string;
4105
+ provider: string;
4106
+ externalAccountId: string;
4107
+ beanAccountId: string;
4108
+ isActive: boolean;
4109
+ createdAt: string;
4110
+ updatedAt: string;
4111
+ };
4112
+
4113
+ export type ExternalAccountLinkListResponseDto = {
4114
+ items: Array<ExternalAccountLinkResponseDto>;
4115
+ total: number;
4116
+ /**
4117
+ * Filter by provider (query param)
4118
+ */
4119
+ provider?: string;
4120
+ };
4121
+
3584
4122
  export type ParserTelemetryReportDto = unknown;
3585
4123
 
3586
4124
  export type UncoveredFormatMissDto = unknown;
@@ -3600,6 +4138,14 @@ export type ProcessNlpDto = {
3600
4138
  parsedData?: {
3601
4139
  [key: string]: unknown;
3602
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;
3603
4149
  };
3604
4150
 
3605
4151
  export type NlpTransactionInfoDto = {
@@ -3843,9 +4389,9 @@ export type NlpAccountConfirmationDataDto = {
3843
4389
  */
3844
4390
  invalidAccount: string;
3845
4391
  /**
3846
- * Suggested replacement account
4392
+ * Suggested replacement account (omitted when no clear candidate)
3847
4393
  */
3848
- suggestedAccount: string;
4394
+ suggestedAccount?: string;
3849
4395
  /**
3850
4396
  * Similar accounts for user selection
3851
4397
  */
@@ -3973,7 +4519,7 @@ export type NlpSuggestedAccountDto = {
3973
4519
  */
3974
4520
  account: string;
3975
4521
  /**
3976
- * 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)
3977
4523
  */
3978
4524
  confidence?: number;
3979
4525
  };
@@ -4024,7 +4570,8 @@ export type NlpResponseDto = {
4024
4570
  | 'confirm_rule'
4025
4571
  | 'confirm_account'
4026
4572
  | 'confirm_payee'
4027
- | 'cancel';
4573
+ | 'cancel'
4574
+ | 'aborted';
4028
4575
  /**
4029
4576
  * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4030
4577
  */
@@ -4113,11 +4660,11 @@ export type NlpResponseDto = {
4113
4660
  */
4114
4661
  recurringSuggestion?: RecurringSuggestionDto;
4115
4662
  /**
4116
- * 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.
4117
4664
  */
4118
4665
  suggestedAccounts?: NlpSuggestedAccountsDto;
4119
4666
  /**
4120
- * 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.
4121
4668
  */
4122
4669
  defaultAccounts?: NlpDefaultAccountsDto;
4123
4670
  };
@@ -4138,7 +4685,8 @@ export type action2 =
4138
4685
  | 'confirm_rule'
4139
4686
  | 'confirm_account'
4140
4687
  | 'confirm_payee'
4141
- | 'cancel';
4688
+ | 'cancel'
4689
+ | 'aborted';
4142
4690
 
4143
4691
  /**
4144
4692
  * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
@@ -4160,15 +4708,201 @@ export type liabilitySubType = 'borrow' | 'repay';
4160
4708
  */
4161
4709
  export type equitySubType = 'opening' | 'adjustment';
4162
4710
 
4163
- export type BalanceByCurrencyDto = {
4711
+ export type PlatformListItemDto = {
4164
4712
  /**
4165
- * ISO 4217 currency code
4713
+ * Global platform ID
4166
4714
  */
4167
- currency: string;
4715
+ id: string;
4168
4716
  /**
4169
- * Balance amount
4717
+ * Platform name
4170
4718
  */
4171
- balance: string;
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
+
4832
+ export type CreatePlatformDto = {
4833
+ /**
4834
+ * Platform name
4835
+ */
4836
+ name: string;
4837
+ /**
4838
+ * Platform canonical identifier (lowercase, kebab-case)
4839
+ */
4840
+ canonical: string;
4841
+ /**
4842
+ * Platform aliases (multi-language names for lookup)
4843
+ */
4844
+ aliases: Array<string>;
4845
+ /**
4846
+ * Platform URL
4847
+ */
4848
+ url: string;
4849
+ /**
4850
+ * Platform type
4851
+ */
4852
+ type:
4853
+ | 'BANK'
4854
+ | 'BROKERAGE'
4855
+ | 'CRYPTO_EXCHANGE'
4856
+ | 'PAYMENT'
4857
+ | 'INVESTMENT'
4858
+ | 'INSURANCE'
4859
+ | 'OTHER';
4860
+ /**
4861
+ * Platform logo URL
4862
+ */
4863
+ logoUrl?: string;
4864
+ /**
4865
+ * Whether the platform is active
4866
+ */
4867
+ isActive?: boolean;
4868
+ };
4869
+
4870
+ export type UpdatePlatformDto = {
4871
+ /**
4872
+ * Platform name
4873
+ */
4874
+ name?: string;
4875
+ /**
4876
+ * Platform canonical identifier (lowercase, kebab-case)
4877
+ */
4878
+ canonical?: string;
4879
+ /**
4880
+ * Platform aliases (multi-language names for lookup)
4881
+ */
4882
+ aliases?: Array<string>;
4883
+ /**
4884
+ * Platform URL
4885
+ */
4886
+ url?: string;
4887
+ /**
4888
+ * Platform type
4889
+ */
4890
+ type?:
4891
+ | 'BANK'
4892
+ | 'BROKERAGE'
4893
+ | 'CRYPTO_EXCHANGE'
4894
+ | 'PAYMENT'
4895
+ | 'INVESTMENT'
4896
+ | 'INSURANCE'
4897
+ | 'OTHER';
4898
+ /**
4899
+ * Platform logo URL
4900
+ */
4901
+ logoUrl?: string;
4902
+ /**
4903
+ * Whether the platform is active
4904
+ */
4905
+ isActive?: boolean;
4172
4906
  };
4173
4907
 
4174
4908
  export type NetWorthByCurrencyDto = {
@@ -4211,21 +4945,6 @@ export type ConvertedNetWorthDto = {
4211
4945
  };
4212
4946
  };
4213
4947
 
4214
- export type ExchangeRateWarningDto = {
4215
- /**
4216
- * Warning type
4217
- */
4218
- type: string;
4219
- /**
4220
- * Currency without exchange rate
4221
- */
4222
- currency: string;
4223
- /**
4224
- * Total amount affected
4225
- */
4226
- totalAmount: string;
4227
- };
4228
-
4229
4948
  export type NetWorthResponseDto = {
4230
4949
  /**
4231
4950
  * Total net worth (assets - liabilities, converted to base currency)
@@ -4283,32 +5002,67 @@ export type AccountItemDto = {
4283
5002
  */
4284
5003
  displayName: string;
4285
5004
  /**
4286
- * Account balance
5005
+ * Account balance
5006
+ */
5007
+ balance: string;
5008
+ /**
5009
+ * Currency code
5010
+ */
5011
+ currency: string;
5012
+ /**
5013
+ * FX-converted balance in base currency; omitted when not convertible
5014
+ */
5015
+ convertedBalance?: string;
5016
+ };
5017
+
5018
+ export type PlatformGroupDto = {
5019
+ /**
5020
+ * Platform ID
5021
+ */
5022
+ platformId: string;
5023
+ /**
5024
+ * Platform display name
5025
+ */
5026
+ platformName: string;
5027
+ /**
5028
+ * Accounts within this platform
5029
+ */
5030
+ accounts: Array<AccountItemDto>;
5031
+ /**
5032
+ * FX-converted total balance in base currency
5033
+ */
5034
+ totalBalance: string;
5035
+ /**
5036
+ * Raw (unconverted) balances grouped by currency
5037
+ */
5038
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
5039
+ /**
5040
+ * Converted balance in base currency (omitted when no currency is convertible)
4287
5041
  */
4288
- balance: string;
5042
+ convertedBalance?: string;
4289
5043
  /**
4290
- * Currency code
5044
+ * Share of the grand converted total (0-100); 0 when grand total is 0
4291
5045
  */
4292
- currency: string;
5046
+ sharePct: number;
4293
5047
  };
4294
5048
 
4295
- export type PlatformGroupDto = {
5049
+ export type AccountExchangeRateWarningDto = {
4296
5050
  /**
4297
- * Platform ID
5051
+ * Warning type
4298
5052
  */
4299
- platformId: string;
5053
+ type: string;
4300
5054
  /**
4301
- * Platform display name
5055
+ * Currency without exchange rate
4302
5056
  */
4303
- platformName: string;
5057
+ currency: string;
4304
5058
  /**
4305
- * Accounts within this platform
5059
+ * Affected account paths
4306
5060
  */
4307
- accounts: Array<AccountItemDto>;
5061
+ accounts: Array<string>;
4308
5062
  /**
4309
- * Total balance across all accounts in platform
5063
+ * Total amount in this currency
4310
5064
  */
4311
- totalBalance: string;
5065
+ totalAmount: string;
4312
5066
  };
4313
5067
 
4314
5068
  export type AccountsSummaryDto = {
@@ -4320,6 +5074,14 @@ export type AccountsSummaryDto = {
4320
5074
  * Total number of platforms
4321
5075
  */
4322
5076
  totalPlatforms: number;
5077
+ /**
5078
+ * Base currency for conversion
5079
+ */
5080
+ baseCurrency: string;
5081
+ /**
5082
+ * Per-account exchange rate warnings
5083
+ */
5084
+ warnings?: Array<AccountExchangeRateWarningDto>;
4323
5085
  };
4324
5086
 
4325
5087
  export type AccountsResponseDto = {
@@ -4354,6 +5116,10 @@ export type AccountItemWithAssetClassDto = {
4354
5116
  * Currency code
4355
5117
  */
4356
5118
  currency: string;
5119
+ /**
5120
+ * FX-converted balance in base currency; omitted when not convertible
5121
+ */
5122
+ convertedBalance?: string;
4357
5123
  /**
4358
5124
  * Asset class
4359
5125
  */
@@ -4435,25 +5201,6 @@ export type assetClass =
4435
5201
  | 'REAL_ESTATE'
4436
5202
  | 'INDEX';
4437
5203
 
4438
- export type AccountExchangeRateWarningDto = {
4439
- /**
4440
- * Warning type
4441
- */
4442
- type: string;
4443
- /**
4444
- * Currency without exchange rate
4445
- */
4446
- currency: string;
4447
- /**
4448
- * Affected account paths
4449
- */
4450
- accounts: Array<string>;
4451
- /**
4452
- * Total amount in this currency
4453
- */
4454
- totalAmount: string;
4455
- };
4456
-
4457
5204
  export type AssetClassSummaryDto = {
4458
5205
  /**
4459
5206
  * Total number of accounts
@@ -4619,6 +5366,63 @@ export type CashFlowResponseDto = {
4619
5366
  warnings?: Array<ExchangeRateWarningDto>;
4620
5367
  };
4621
5368
 
5369
+ export type CategoryGroupDto = {
5370
+ /**
5371
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
5372
+ */
5373
+ category: string;
5374
+ /**
5375
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
5376
+ */
5377
+ totalExpense: string;
5378
+ /**
5379
+ * Share of grand total (0-100); 0 when grand total is 0
5380
+ */
5381
+ sharePct: number;
5382
+ /**
5383
+ * Raw (unconverted) expense per currency
5384
+ */
5385
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
5386
+ /**
5387
+ * Converted total in base currency (omitted when FX missing for all currencies in this category)
5388
+ */
5389
+ convertedBalance?: string;
5390
+ };
5391
+
5392
+ export type ExpensesByCategorySummaryDto = {
5393
+ /**
5394
+ * Total across all categories, converted (convertible categories only); expense totals when flow=expense, income totals when flow=income
5395
+ */
5396
+ totalExpense: string;
5397
+ /**
5398
+ * Number of categories
5399
+ */
5400
+ categoryCount: number;
5401
+ };
5402
+
5403
+ export type ExpensesByCategoryResponseDto = {
5404
+ /**
5405
+ * Period requested
5406
+ */
5407
+ period: string;
5408
+ /**
5409
+ * Base currency for converted values
5410
+ */
5411
+ baseCurrency: string;
5412
+ /**
5413
+ * Expense groups by functional category, sorted by converted total desc
5414
+ */
5415
+ groups: Array<CategoryGroupDto>;
5416
+ /**
5417
+ * Summary statistics
5418
+ */
5419
+ summary: ExpensesByCategorySummaryDto;
5420
+ /**
5421
+ * Exchange rate warnings (e.g. missing rate for a currency)
5422
+ */
5423
+ warnings?: Array<ExchangeRateWarningDto>;
5424
+ };
5425
+
4622
5426
  export type MonetaryDto = {
4623
5427
  /**
4624
5428
  * Amount (Decimal string)
@@ -4814,214 +5618,146 @@ export type HoldingPnlResponseDto = {
4814
5618
  */
4815
5619
  export type method = 'average' | 'FIFO';
4816
5620
 
4817
- export type CreateBeanPriceDto = {
4818
- /**
4819
- * Currency being priced (e.g., USD, AAPL, BTC)
4820
- */
4821
- currency: string;
4822
- /**
4823
- * Quote currency (pricing currency, e.g., CNY, EUR)
4824
- */
4825
- quoteCurrency: string;
4826
- /**
4827
- * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
4828
- */
4829
- amount: number;
4830
- /**
4831
- * Price date (ISO 8601 format)
4832
- */
4833
- date: string;
4834
- /**
4835
- * Metadata (validated by Zod schema, max field lengths enforced)
4836
- */
4837
- metadata?: {
4838
- [key: string]: unknown;
4839
- };
4840
- };
4841
-
4842
- export type PriceResponseDto = {
4843
- /**
4844
- * Unique identifier
4845
- */
4846
- id: string;
4847
- /**
4848
- * User ID (owner of the price)
4849
- */
4850
- userId: string;
4851
- /**
4852
- * Currency being priced (e.g., USD, AAPL, BTC)
4853
- */
4854
- currency: string;
4855
- /**
4856
- * Quote currency (pricing currency, e.g., USD, CNY)
4857
- */
4858
- quoteCurrency: string;
4859
- /**
4860
- * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
4861
- */
4862
- amount: number;
4863
- /**
4864
- * Price date (ISO 8601 format). Represents the date this price was valid.
4865
- */
4866
- date: string;
4867
- /**
4868
- * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
4869
- */
4870
- meta: {
4871
- [key: string]: unknown;
4872
- };
4873
- /**
4874
- * Creation timestamp
4875
- */
4876
- createdAt: string;
5621
+ export type AnonymousLoginDto = {
4877
5622
  /**
4878
- * Last update timestamp
5623
+ * Access token for anonymous login
4879
5624
  */
4880
- updatedAt: string;
5625
+ accessToken: string;
4881
5626
  };
4882
5627
 
4883
- export type PriceListResponseDto = {
4884
- /**
4885
- * List of prices
4886
- */
4887
- items: Array<PriceResponseDto>;
5628
+ export type AnonymousLoginResponseDto = {
4888
5629
  /**
4889
- * Total number of prices
5630
+ * JWT auth token
4890
5631
  */
4891
- total: number;
5632
+ authToken: string;
4892
5633
  };
4893
5634
 
4894
- export type UpdateBeanPriceDto = {
4895
- /**
4896
- * Currency being priced
4897
- */
4898
- currency?: string;
4899
- /**
4900
- * Quote currency (pricing currency)
4901
- */
4902
- quoteCurrency?: string;
4903
- /**
4904
- * Price amount (MUST be >= 0 per Beancount spec)
4905
- */
4906
- amount?: number;
4907
- /**
4908
- * Price date (ISO 8601 format)
4909
- */
4910
- date?: string;
4911
- /**
4912
- * Metadata
4913
- */
4914
- metadata?: {
5635
+ export type SymbolSearchResultDto = {
5636
+ symbol: string;
5637
+ name?: {
4915
5638
  [key: string]: unknown;
4916
- };
4917
- };
4918
-
4919
- export type CurrencyBalanceDto = {
4920
- /**
4921
- * ISO 4217 currency code
4922
- */
4923
- currency: string;
4924
- /**
4925
- * Balance amount
4926
- */
4927
- balance: string;
4928
- };
4929
-
4930
- export type TimeSeriesPointDto = {
5639
+ } | null;
5640
+ exchange?: {
5641
+ [key: string]: unknown;
5642
+ } | null;
4931
5643
  /**
4932
- * Date in YYYY-MM-DD format
5644
+ * OpenBB asset_type (e.g. stock, etf)
4933
5645
  */
4934
- date: string;
5646
+ assetType?: {
5647
+ [key: string]: unknown;
5648
+ } | null;
4935
5649
  /**
4936
- * Value at this date (in base currency)
5650
+ * IGN asset class (region.types.ts ASSET_CLASSES)
4937
5651
  */
4938
- value: string;
5652
+ assetClass?: {
5653
+ [key: string]: unknown;
5654
+ } | null;
4939
5655
  /**
4940
- * Change from previous point
5656
+ * IGN asset sub-class (region.types.ts ASSET_SUB_CLASSES)
4941
5657
  */
4942
- change?: {
5658
+ assetSubClass?: {
4943
5659
  [key: string]: unknown;
4944
- };
5660
+ } | null;
4945
5661
  /**
4946
- * Multi-currency breakdown for this point
5662
+ * Trading currency (extra_data or inferred from exchange)
4947
5663
  */
4948
- byCurrency?: Array<CurrencyBalanceDto>;
5664
+ currency?: {
5665
+ [key: string]: unknown;
5666
+ } | null;
4949
5667
  };
4950
5668
 
4951
- export type TrendSummaryDto = {
5669
+ export type SymbolQuoteDto = {
5670
+ symbol?: string;
5671
+ name?: {
5672
+ [key: string]: unknown;
5673
+ } | null;
5674
+ exchange?: {
5675
+ [key: string]: unknown;
5676
+ } | null;
4952
5677
  /**
4953
- * Value at start of period
5678
+ * OpenBB asset_type
4954
5679
  */
4955
- startValue: string;
5680
+ assetType?: {
5681
+ [key: string]: unknown;
5682
+ } | null;
4956
5683
  /**
4957
- * Value at end of period
5684
+ * IGN asset class
4958
5685
  */
4959
- endValue: string;
5686
+ assetClass?: {
5687
+ [key: string]: unknown;
5688
+ } | null;
4960
5689
  /**
4961
- * Total change over period
5690
+ * IGN asset sub-class
4962
5691
  */
4963
- totalChange: string;
5692
+ assetSubClass?: {
5693
+ [key: string]: unknown;
5694
+ } | null;
4964
5695
  /**
4965
- * Total change percentage
5696
+ * Trading currency (extra_data or inferred from exchange)
4966
5697
  */
4967
- totalChangePercentage: string;
4968
- };
4969
-
4970
- export type MultiCurrencyPointDto = {
5698
+ currency?: {
5699
+ [key: string]: unknown;
5700
+ } | null;
4971
5701
  /**
4972
- * Date in YYYY-MM-DD format
5702
+ * Latest price (Decimal string)
4973
5703
  */
4974
- date: string;
5704
+ price?: {
5705
+ [key: string]: unknown;
5706
+ } | null;
4975
5707
  /**
4976
- * Balances by currency
5708
+ * Date the price was observed (ISO yyyy-MM-dd)
4977
5709
  */
4978
- byCurrency: Array<CurrencyBalanceDto>;
4979
- };
4980
-
4981
- export type PortfolioTrendsResponseDto = {
5710
+ priceDate?: {
5711
+ [key: string]: unknown;
5712
+ } | null;
4982
5713
  /**
4983
- * Time series data points
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.
4984
5715
  */
4985
- series: Array<TimeSeriesPointDto>;
5716
+ changePercent?: {
5717
+ [key: string]: unknown;
5718
+ } | null;
4986
5719
  /**
4987
- * Period summary
5720
+ * Previous close (Decimal string)
4988
5721
  */
4989
- summary: TrendSummaryDto;
5722
+ prevClose?: {
5723
+ [key: string]: unknown;
5724
+ } | null;
4990
5725
  /**
4991
- * Period requested
5726
+ * Day open (Decimal string)
4992
5727
  */
4993
- period: string;
5728
+ open?: {
5729
+ [key: string]: unknown;
5730
+ } | null;
4994
5731
  /**
4995
- * Data granularity
5732
+ * Day high (Decimal string)
4996
5733
  */
4997
- granularity: string;
5734
+ high?: {
5735
+ [key: string]: unknown;
5736
+ } | null;
4998
5737
  /**
4999
- * Base currency for converted values
5738
+ * Day low (Decimal string)
5000
5739
  */
5001
- currency: string;
5740
+ low?: {
5741
+ [key: string]: unknown;
5742
+ } | null;
5002
5743
  /**
5003
- * Multi-currency time series (each point has currency breakdown)
5744
+ * Day volume (Decimal string)
5004
5745
  */
5005
- byCurrency?: Array<MultiCurrencyPointDto>;
5746
+ volume?: {
5747
+ [key: string]: unknown;
5748
+ } | null;
5006
5749
  /**
5007
- * Exchange rate warnings
5750
+ * 52-week high (Decimal string)
5008
5751
  */
5009
- warnings?: Array<ExchangeRateWarningDto>;
5010
- };
5011
-
5012
- export type GenerateSnapshotBody = unknown;
5013
-
5014
- export type GenerateSnapshotResponse = unknown;
5015
-
5016
- export type BackfillSnapshotsBody = unknown;
5017
-
5018
- export type BackfillSnapshotsResponse = unknown;
5019
-
5020
- export type AnonymousLoginDto = {
5752
+ yearHigh?: {
5753
+ [key: string]: unknown;
5754
+ } | null;
5021
5755
  /**
5022
- * Access token for anonymous login
5756
+ * 52-week low (Decimal string)
5023
5757
  */
5024
- accessToken: string;
5758
+ yearLow?: {
5759
+ [key: string]: unknown;
5760
+ } | null;
5025
5761
  };
5026
5762
 
5027
5763
  export type AccountControllerCreateData = {
@@ -5052,7 +5788,7 @@ export type AccountControllerFindAllData = {
5052
5788
  */
5053
5789
  region: 'cn' | 'us' | 'de' | 'gb';
5054
5790
  /**
5055
- * Search term for path or i18nKey
5791
+ * Search term for account path
5056
5792
  */
5057
5793
  search?: string;
5058
5794
  /**
@@ -5135,6 +5871,21 @@ export type AccountControllerReopenData = {
5135
5871
 
5136
5872
  export type AccountControllerReopenResponse = AccountResponseDto;
5137
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
+
5138
5889
  export type AccountStandardsControllerGetTemplatesData = {
5139
5890
  /**
5140
5891
  * Region code (cn, us, de)
@@ -5195,6 +5946,10 @@ export type TransactionControllerListData = {
5195
5946
  * Filter by account ID (transactions with postings to this account)
5196
5947
  */
5197
5948
  accountId?: string;
5949
+ /**
5950
+ * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
5951
+ */
5952
+ category?: string;
5198
5953
  /**
5199
5954
  * Filter by start date (inclusive), format: YYYY-MM-DD
5200
5955
  */
@@ -5319,7 +6074,7 @@ export type TransactionControllerDeleteResponse = void;
5319
6074
 
5320
6075
  export type BalanceControllerGetBalanceData = {
5321
6076
  /**
5322
- * Account name (e.g., "Assets:Bank:Checking")
6077
+ * Account name (e.g., "Assets:Checking")
5323
6078
  */
5324
6079
  account: string;
5325
6080
  /**
@@ -5721,6 +6476,103 @@ export type CommodityControllerBulkCreateData = {
5721
6476
 
5722
6477
  export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
5723
6478
 
6479
+ export type PriceControllerCreateData = {
6480
+ /**
6481
+ * Region code for tenant context
6482
+ */
6483
+ region: 'cn' | 'us' | 'de' | 'gb';
6484
+ requestBody: CreateBeanPriceDto;
6485
+ };
6486
+
6487
+ export type PriceControllerCreateResponse = PriceResponseDto;
6488
+
6489
+ export type PriceControllerFindAllData = {
6490
+ /**
6491
+ * Filter by currency (e.g., BTC, AAPL, USD)
6492
+ */
6493
+ currency?: string;
6494
+ /**
6495
+ * Filter prices from this date (ISO 8601 format)
6496
+ */
6497
+ dateFrom?: string;
6498
+ /**
6499
+ * Filter prices to this date (ISO 8601 format)
6500
+ */
6501
+ dateTo?: string;
6502
+ /**
6503
+ * Number of items per page (default: 20, max: 100)
6504
+ */
6505
+ limit?: number;
6506
+ /**
6507
+ * Page number for pagination (default: 1)
6508
+ */
6509
+ page?: number;
6510
+ /**
6511
+ * Filter by quote currency (pricing currency, e.g., USD, CNY)
6512
+ */
6513
+ quoteCurrency?: string;
6514
+ /**
6515
+ * Region code for tenant context
6516
+ */
6517
+ region: 'cn' | 'us' | 'de' | 'gb';
6518
+ /**
6519
+ * Search term for currency or quoteCurrency (case-insensitive partial match)
6520
+ */
6521
+ search?: string;
6522
+ };
6523
+
6524
+ export type PriceControllerFindAllResponse = PriceListResponseDto;
6525
+
6526
+ export type PriceControllerFindOneData = {
6527
+ /**
6528
+ * Price ID
6529
+ */
6530
+ id: string;
6531
+ /**
6532
+ * Region code for tenant context
6533
+ */
6534
+ region: 'cn' | 'us' | 'de' | 'gb';
6535
+ };
6536
+
6537
+ export type PriceControllerFindOneResponse = PriceResponseDto;
6538
+
6539
+ export type PriceControllerUpdateData = {
6540
+ /**
6541
+ * Price ID
6542
+ */
6543
+ id: string;
6544
+ /**
6545
+ * Region code for tenant context
6546
+ */
6547
+ region: 'cn' | 'us' | 'de' | 'gb';
6548
+ requestBody: UpdateBeanPriceDto;
6549
+ };
6550
+
6551
+ export type PriceControllerUpdateResponse = PriceResponseDto;
6552
+
6553
+ export type PriceControllerDeleteData = {
6554
+ /**
6555
+ * Price ID
6556
+ */
6557
+ id: string;
6558
+ /**
6559
+ * Region code for tenant context
6560
+ */
6561
+ region: 'cn' | 'us' | 'de' | 'gb';
6562
+ };
6563
+
6564
+ export type PriceControllerDeleteResponse = void;
6565
+
6566
+ export type PriceControllerBulkCreateData = {
6567
+ /**
6568
+ * Region code for tenant context
6569
+ */
6570
+ region: 'cn' | 'us' | 'de' | 'gb';
6571
+ requestBody: Array<string>;
6572
+ };
6573
+
6574
+ export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
6575
+
5724
6576
  export type RecurringRuleControllerCreateData = {
5725
6577
  /**
5726
6578
  * Region code for tenant context
@@ -5869,90 +6721,238 @@ export type ExpectedTransactionControllerFindOneData = {
5869
6721
  region: 'cn' | 'us' | 'de' | 'gb';
5870
6722
  };
5871
6723
 
5872
- export type ExpectedTransactionControllerFindOneResponse =
5873
- ExpectedTransactionResponseDto;
6724
+ export type ExpectedTransactionControllerFindOneResponse =
6725
+ ExpectedTransactionResponseDto;
6726
+
6727
+ export type ExpectedTransactionControllerSkipData = {
6728
+ /**
6729
+ * Expected transaction ID
6730
+ */
6731
+ id: string;
6732
+ /**
6733
+ * Region code for tenant context
6734
+ */
6735
+ region: 'cn' | 'us' | 'de' | 'gb';
6736
+ };
6737
+
6738
+ export type ExpectedTransactionControllerSkipResponse =
6739
+ ExpectedTransactionResponseDto;
6740
+
6741
+ export type ExpectedTransactionControllerUndoSkipData = {
6742
+ /**
6743
+ * Expected transaction ID
6744
+ */
6745
+ id: string;
6746
+ /**
6747
+ * Region code for tenant context
6748
+ */
6749
+ region: 'cn' | 'us' | 'de' | 'gb';
6750
+ };
6751
+
6752
+ export type ExpectedTransactionControllerUndoSkipResponse =
6753
+ ExpectedTransactionResponseDto;
6754
+
6755
+ export type ExpectedTransactionControllerConfirmMatchData = {
6756
+ /**
6757
+ * Expected transaction ID
6758
+ */
6759
+ id: string;
6760
+ /**
6761
+ * Region code for tenant context
6762
+ */
6763
+ region: 'cn' | 'us' | 'de' | 'gb';
6764
+ requestBody: ConfirmMatchDto;
6765
+ };
6766
+
6767
+ export type ExpectedTransactionControllerConfirmMatchResponse = unknown;
6768
+
6769
+ export type ExpectedTransactionControllerUnmatchData = {
6770
+ /**
6771
+ * Expected transaction ID
6772
+ */
6773
+ id: string;
6774
+ /**
6775
+ * Region code for tenant context
6776
+ */
6777
+ region: 'cn' | 'us' | 'de' | 'gb';
6778
+ };
6779
+
6780
+ export type ExpectedTransactionControllerUnmatchResponse = unknown;
6781
+
6782
+ export type ExpectedTransactionControllerEnterNowData = {
6783
+ /**
6784
+ * Expected transaction ID
6785
+ */
6786
+ id: string;
6787
+ /**
6788
+ * Region code for tenant context
6789
+ */
6790
+ region: 'cn' | 'us' | 'de' | 'gb';
6791
+ requestBody: EnterNowDto;
6792
+ };
6793
+
6794
+ export type ExpectedTransactionControllerEnterNowResponse = unknown;
6795
+
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;
5874
6826
 
5875
- export type ExpectedTransactionControllerSkipData = {
6827
+ export type ReportingControllerGetCashFlowTrendsData = {
5876
6828
  /**
5877
- * Expected transaction ID
6829
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
5878
6830
  */
5879
- id: string;
6831
+ granularity?: 'day' | 'week' | 'month';
6832
+ /**
6833
+ * Time period
6834
+ */
6835
+ period?: '1m' | '3m' | '6m' | '1y';
5880
6836
  /**
5881
6837
  * Region code for tenant context
5882
6838
  */
5883
6839
  region: 'cn' | 'us' | 'de' | 'gb';
5884
6840
  };
5885
6841
 
5886
- export type ExpectedTransactionControllerSkipResponse =
5887
- ExpectedTransactionResponseDto;
6842
+ export type ReportingControllerGetCashFlowTrendsResponse =
6843
+ CashFlowTrendsResponseDto;
5888
6844
 
5889
- export type ExpectedTransactionControllerUndoSkipData = {
5890
- /**
5891
- * Expected transaction ID
5892
- */
5893
- id: string;
6845
+ export type ReportingControllerGenerateSnapshotData = {
5894
6846
  /**
5895
6847
  * Region code for tenant context
5896
6848
  */
5897
6849
  region: 'cn' | 'us' | 'de' | 'gb';
6850
+ /**
6851
+ * Optional date (defaults to today)
6852
+ */
6853
+ requestBody: GenerateSnapshotBody;
5898
6854
  };
5899
6855
 
5900
- export type ExpectedTransactionControllerUndoSkipResponse =
5901
- ExpectedTransactionResponseDto;
6856
+ export type ReportingControllerGenerateSnapshotResponse =
6857
+ GenerateSnapshotResponse;
5902
6858
 
5903
- export type ExpectedTransactionControllerConfirmMatchData = {
5904
- /**
5905
- * Expected transaction ID
5906
- */
5907
- id: string;
6859
+ export type ReportingControllerBackfillSnapshotsData = {
5908
6860
  /**
5909
6861
  * Region code for tenant context
5910
6862
  */
5911
6863
  region: 'cn' | 'us' | 'de' | 'gb';
5912
- requestBody: ConfirmMatchDto;
6864
+ requestBody: BackfillSnapshotsBody;
5913
6865
  };
5914
6866
 
5915
- export type ExpectedTransactionControllerConfirmMatchResponse = unknown;
6867
+ export type ReportingControllerBackfillSnapshotsResponse =
6868
+ BackfillSnapshotsResponse;
5916
6869
 
5917
- export type ExpectedTransactionControllerUnmatchData = {
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 = {
5918
6889
  /**
5919
- * Expected transaction ID
6890
+ * User ID to delete
5920
6891
  */
5921
6892
  id: string;
6893
+ };
6894
+
6895
+ export type UserControllerDeleteUserResponse = void;
6896
+
6897
+ export type UserControllerGetUserInfoData = {
5922
6898
  /**
5923
- * Region code for tenant context
6899
+ * User ID
5924
6900
  */
5925
- region: 'cn' | 'us' | 'de' | 'gb';
6901
+ id: string;
5926
6902
  };
5927
6903
 
5928
- export type ExpectedTransactionControllerUnmatchResponse = unknown;
6904
+ export type UserControllerGetUserInfoResponse = unknown;
5929
6905
 
5930
- export type ExpectedTransactionControllerEnterNowData = {
6906
+ export type UserControllerUpdateUserSettingData = {
6907
+ requestBody: UpdateUserSettingDto;
6908
+ };
6909
+
6910
+ export type UserControllerUpdateUserSettingResponse = unknown;
6911
+
6912
+ export type UserControllerGetAllUserSettingsByPageData = {
5931
6913
  /**
5932
- * Expected transaction ID
6914
+ * Page number
5933
6915
  */
5934
- id: string;
6916
+ pageNo: number;
5935
6917
  /**
5936
- * Region code for tenant context
6918
+ * Page size
5937
6919
  */
5938
- region: 'cn' | 'us' | 'de' | 'gb';
5939
- requestBody: EnterNowDto;
6920
+ pageSize: number;
5940
6921
  };
5941
6922
 
5942
- export type ExpectedTransactionControllerEnterNowResponse = unknown;
6923
+ export type UserControllerGetAllUserSettingsByPageResponse = unknown;
5943
6924
 
5944
- export type ForecastControllerGetForecastData = {
6925
+ export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
6926
+
6927
+ export type PropertyControllerGetAllResponse = unknown;
6928
+
6929
+ export type PropertyControllerGetByKeyData = {
5945
6930
  /**
5946
- * Number of months to forecast (1-12, default 3)
6931
+ * Property key
5947
6932
  */
5948
- months?: number;
6933
+ key: string;
6934
+ };
6935
+
6936
+ export type PropertyControllerGetByKeyResponse = unknown;
6937
+
6938
+ export type PropertyControllerUpdateData = {
5949
6939
  /**
5950
- * Region code for tenant context
6940
+ * Property key
5951
6941
  */
5952
- region: 'cn' | 'us' | 'de' | 'gb';
6942
+ key: string;
6943
+ requestBody: UpdatePropertyDto;
5953
6944
  };
5954
6945
 
5955
- export type ForecastControllerGetForecastResponse = ForecastResponseDto;
6946
+ export type PropertyControllerUpdateResponse = unknown;
6947
+
6948
+ export type PropertyControllerDeleteData = {
6949
+ /**
6950
+ * Property key
6951
+ */
6952
+ key: string;
6953
+ };
6954
+
6955
+ export type PropertyControllerDeleteResponse = void;
5956
6956
 
5957
6957
  export type TransactionRuleControllerCreateData = {
5958
6958
  /**
@@ -6099,175 +7099,158 @@ export type TransactionRuleControllerTestData = {
6099
7099
 
6100
7100
  export type TransactionRuleControllerTestResponse = TestRuleResponseDto;
6101
7101
 
6102
- export type UserControllerDeleteOwnUserData = {
6103
- requestBody: DeleteOwnUserDto;
6104
- };
6105
-
6106
- export type UserControllerDeleteOwnUserResponse = void;
6107
-
6108
- export type UserControllerGetUserData = {
6109
- acceptLanguage: string;
6110
- };
6111
-
6112
- export type UserControllerGetUserResponse = unknown;
6113
-
6114
- export type UserControllerSignupUserData = {
6115
- requestBody: SignupDto;
6116
- };
6117
-
6118
- export type UserControllerSignupUserResponse = unknown;
6119
-
6120
- export type UserControllerDeleteUserData = {
7102
+ export type EventControllerCreateData = {
6121
7103
  /**
6122
- * User ID to delete
7104
+ * Region code for tenant context (decorative for life events)
6123
7105
  */
6124
- id: string;
7106
+ region: 'cn' | 'us' | 'de' | 'gb';
7107
+ requestBody: CreateBeanEventDto;
6125
7108
  };
6126
7109
 
6127
- export type UserControllerDeleteUserResponse = void;
7110
+ export type EventControllerCreateResponse = EventResponseDto;
6128
7111
 
6129
- export type UserControllerGetUserInfoData = {
7112
+ export type EventControllerFindAllData = {
6130
7113
  /**
6131
- * User ID
7114
+ * Filter life events from this date (ISO 8601 format)
6132
7115
  */
6133
- id: string;
6134
- };
6135
-
6136
- export type UserControllerGetUserInfoResponse = unknown;
6137
-
6138
- export type UserControllerUpdateUserSettingData = {
6139
- requestBody: UpdateUserSettingDto;
6140
- };
6141
-
6142
- export type UserControllerUpdateUserSettingResponse = unknown;
6143
-
6144
- export type UserControllerGetAllUserSettingsByPageData = {
7116
+ from?: string;
6145
7117
  /**
6146
- * Page number
7118
+ * Number of items per page (default: 20, max: 100)
6147
7119
  */
6148
- pageNo: number;
7120
+ limit?: number;
6149
7121
  /**
6150
- * Page size
7122
+ * Page number for pagination (default: 1)
6151
7123
  */
6152
- pageSize: number;
6153
- };
6154
-
6155
- export type UserControllerGetAllUserSettingsByPageResponse = unknown;
6156
-
6157
- export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
6158
-
6159
- export type PropertyControllerGetAllResponse = unknown;
6160
-
6161
- export type PropertyControllerGetByKeyData = {
7124
+ page?: number;
6162
7125
  /**
6163
- * Property key
7126
+ * Search term for description (case-insensitive partial match)
6164
7127
  */
6165
- key: string;
6166
- };
6167
-
6168
- export type PropertyControllerGetByKeyResponse = unknown;
6169
-
6170
- export type PropertyControllerUpdateData = {
7128
+ q?: string;
6171
7129
  /**
6172
- * Property key
7130
+ * Region code for tenant context (decorative for life events)
6173
7131
  */
6174
- key: string;
6175
- requestBody: UpdatePropertyDto;
6176
- };
6177
-
6178
- export type PropertyControllerUpdateResponse = unknown;
6179
-
6180
- export type PropertyControllerDeleteData = {
7132
+ region: 'cn' | 'us' | 'de' | 'gb';
6181
7133
  /**
6182
- * Property key
7134
+ * Filter life events to this date (ISO 8601 format)
6183
7135
  */
6184
- key: string;
7136
+ to?: string;
7137
+ /**
7138
+ * Filter by life event type (exact match)
7139
+ */
7140
+ type?: string;
6185
7141
  };
6186
7142
 
6187
- export type PropertyControllerDeleteResponse = void;
7143
+ export type EventControllerFindAllResponse = EventListResponseDto;
6188
7144
 
6189
- export type EventControllerCreateData = {
7145
+ export type EventControllerFindOneData = {
7146
+ /**
7147
+ * Life event ID
7148
+ */
7149
+ id: string;
6190
7150
  /**
6191
7151
  * Region code for tenant context (decorative for life events)
6192
7152
  */
6193
7153
  region: 'cn' | 'us' | 'de' | 'gb';
6194
- requestBody: CreateBeanEventDto;
6195
7154
  };
6196
7155
 
6197
- export type EventControllerCreateResponse = EventResponseDto;
7156
+ export type EventControllerFindOneResponse = EventResponseDto;
6198
7157
 
6199
- export type EventControllerFindAllData = {
6200
- /**
6201
- * Filter life events from this date (ISO 8601 format)
6202
- */
6203
- from?: string;
7158
+ export type EventControllerUpdateData = {
6204
7159
  /**
6205
- * Number of items per page (default: 20, max: 100)
7160
+ * Life event ID
6206
7161
  */
6207
- limit?: number;
7162
+ id: string;
6208
7163
  /**
6209
- * Page number for pagination (default: 1)
7164
+ * Region code for tenant context (decorative for life events)
6210
7165
  */
6211
- page?: number;
7166
+ region: 'cn' | 'us' | 'de' | 'gb';
7167
+ requestBody: UpdateBeanEventDto;
7168
+ };
7169
+
7170
+ export type EventControllerUpdateResponse = EventResponseDto;
7171
+
7172
+ export type EventControllerDeleteData = {
6212
7173
  /**
6213
- * Search term for description (case-insensitive partial match)
7174
+ * Life event ID
6214
7175
  */
6215
- q?: string;
7176
+ id: string;
6216
7177
  /**
6217
7178
  * Region code for tenant context (decorative for life events)
6218
7179
  */
6219
7180
  region: 'cn' | 'us' | 'de' | 'gb';
7181
+ };
7182
+
7183
+ export type EventControllerDeleteResponse = void;
7184
+
7185
+ export type EventControllerGetSliceData = {
7186
+ accountPattern: string;
7187
+ granularity: string;
6220
7188
  /**
6221
- * Filter life events to this date (ISO 8601 format)
7189
+ * Life event ID
6222
7190
  */
6223
- to?: string;
7191
+ id: string;
6224
7192
  /**
6225
- * Filter by life event type (exact match)
7193
+ * Region code for tenant context (decorative for life events)
6226
7194
  */
6227
- type?: string;
7195
+ region: 'cn' | 'us' | 'de' | 'gb';
6228
7196
  };
6229
7197
 
6230
- export type EventControllerFindAllResponse = EventListResponseDto;
7198
+ export type EventControllerGetSliceResponse = unknown;
6231
7199
 
6232
- export type EventControllerFindOneData = {
7200
+ export type OnboardingControllerBootstrapData = {
6233
7201
  /**
6234
- * Life event ID
7202
+ * Region code for tenant context
6235
7203
  */
6236
- id: string;
7204
+ region: 'cn' | 'us' | 'de' | 'gb';
7205
+ requestBody: OnboardingDto;
7206
+ };
7207
+
7208
+ export type OnboardingControllerBootstrapResponse = unknown;
7209
+
7210
+ export type ReconciliationControllerComputeData = {
6237
7211
  /**
6238
- * Region code for tenant context (decorative for life events)
7212
+ * Region code for tenant context (decorative for reconciliation)
6239
7213
  */
6240
7214
  region: 'cn' | 'us' | 'de' | 'gb';
7215
+ requestBody: ComputeReconciliationDto;
6241
7216
  };
6242
7217
 
6243
- export type EventControllerFindOneResponse = EventResponseDto;
7218
+ export type ReconciliationControllerComputeResponse =
7219
+ ReconciliationComputeResultDto;
6244
7220
 
6245
- export type EventControllerUpdateData = {
7221
+ export type ReconciliationControllerAssertData = {
6246
7222
  /**
6247
- * Life event ID
7223
+ * Region code for tenant context (decorative for reconciliation)
6248
7224
  */
6249
- id: string;
7225
+ region: 'cn' | 'us' | 'de' | 'gb';
7226
+ requestBody: AssertReconciliationDto;
7227
+ };
7228
+
7229
+ export type ReconciliationControllerAssertResponse = ReconciliationRecordDto;
7230
+
7231
+ export type ReconciliationControllerPadData = {
6250
7232
  /**
6251
- * Region code for tenant context (decorative for life events)
7233
+ * Region code for tenant context (decorative for reconciliation)
6252
7234
  */
6253
7235
  region: 'cn' | 'us' | 'de' | 'gb';
6254
- requestBody: UpdateBeanEventDto;
7236
+ requestBody: PadReconciliationDto;
6255
7237
  };
6256
7238
 
6257
- export type EventControllerUpdateResponse = EventResponseDto;
7239
+ export type ReconciliationControllerPadResponse = PadResultDto;
6258
7240
 
6259
- export type EventControllerDeleteData = {
7241
+ export type ReconciliationControllerHistoryData = {
6260
7242
  /**
6261
- * Life event ID
7243
+ * BeanAccount id
6262
7244
  */
6263
- id: string;
7245
+ accountId: string;
6264
7246
  /**
6265
- * Region code for tenant context (decorative for life events)
7247
+ * Region code for tenant context (decorative for reconciliation)
6266
7248
  */
6267
7249
  region: 'cn' | 'us' | 'de' | 'gb';
6268
7250
  };
6269
7251
 
6270
- export type EventControllerDeleteResponse = void;
7252
+ export type ReconciliationControllerHistoryResponse =
7253
+ Array<ReconciliationRecordDto>;
6271
7254
 
6272
7255
  export type ExportControllerExportBeancountResponse = unknown;
6273
7256
 
@@ -6361,48 +7344,6 @@ export type ImporterConfigControllerResetConfigData = {
6361
7344
 
6362
7345
  export type ImporterConfigControllerResetConfigResponse = ImporterConfigDto;
6363
7346
 
6364
- export type PlatformControllerFindAllResponse = unknown;
6365
-
6366
- export type PlatformControllerCreateData = {
6367
- requestBody: CreatePlatformDto;
6368
- };
6369
-
6370
- export type PlatformControllerCreateResponse = unknown;
6371
-
6372
- export type PlatformControllerGetPlatformListResponse = unknown;
6373
-
6374
- export type PlatformControllerMatchPlatformsData = {
6375
- /**
6376
- * Search query — Chinese name, English name, or abbreviation
6377
- */
6378
- q: string;
6379
- /**
6380
- * Region code for category override lookup
6381
- */
6382
- region?: string;
6383
- };
6384
-
6385
- export type PlatformControllerMatchPlatformsResponse = unknown;
6386
-
6387
- export type PlatformControllerUpdateData = {
6388
- /**
6389
- * Platform ID
6390
- */
6391
- id: string;
6392
- requestBody: UpdatePlatformDto;
6393
- };
6394
-
6395
- export type PlatformControllerUpdateResponse = unknown;
6396
-
6397
- export type PlatformControllerDeleteData = {
6398
- /**
6399
- * Platform ID
6400
- */
6401
- id: string;
6402
- };
6403
-
6404
- export type PlatformControllerDeleteResponse = void;
6405
-
6406
7347
  export type ProviderSyncControllerSyncData = {
6407
7348
  /**
6408
7349
  * Provider name
@@ -6448,6 +7389,49 @@ export type ProviderSyncControllerIsProviderSupportedData = {
6448
7389
 
6449
7390
  export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
6450
7391
 
7392
+ export type ExternalAccountLinkControllerCreateData = {
7393
+ /**
7394
+ * Region code for tenant context
7395
+ */
7396
+ region: 'cn' | 'us' | 'de' | 'gb';
7397
+ requestBody: CreateExternalAccountLinkDto;
7398
+ };
7399
+
7400
+ export type ExternalAccountLinkControllerCreateResponse =
7401
+ ExternalAccountLinkResponseDto;
7402
+
7403
+ export type ExternalAccountLinkControllerFindAllData = {
7404
+ provider: string;
7405
+ /**
7406
+ * Region code for tenant context
7407
+ */
7408
+ region: 'cn' | 'us' | 'de' | 'gb';
7409
+ };
7410
+
7411
+ export type ExternalAccountLinkControllerFindAllResponse =
7412
+ ExternalAccountLinkListResponseDto;
7413
+
7414
+ export type ExternalAccountLinkControllerFindOneData = {
7415
+ id: string;
7416
+ /**
7417
+ * Region code for tenant context
7418
+ */
7419
+ region: 'cn' | 'us' | 'de' | 'gb';
7420
+ };
7421
+
7422
+ export type ExternalAccountLinkControllerFindOneResponse =
7423
+ ExternalAccountLinkResponseDto;
7424
+
7425
+ export type ExternalAccountLinkControllerRemoveData = {
7426
+ id: string;
7427
+ /**
7428
+ * Region code for tenant context
7429
+ */
7430
+ region: 'cn' | 'us' | 'de' | 'gb';
7431
+ };
7432
+
7433
+ export type ExternalAccountLinkControllerRemoveResponse = void;
7434
+
6451
7435
  export type TelemetryControllerReportTelemetryData = {
6452
7436
  /**
6453
7437
  * Region code for tenant context
@@ -6520,185 +7504,114 @@ export type NlpControllerGetSessionData = {
6520
7504
 
6521
7505
  export type NlpControllerGetSessionResponse = unknown;
6522
7506
 
6523
- export type DashboardControllerGetNetWorthData = {
6524
- /**
6525
- * Date for balance calculation (ISO 8601 format)
6526
- */
6527
- date?: string;
6528
- /**
6529
- * Region code for tenant context
6530
- */
6531
- region: 'cn' | 'us' | 'de' | 'gb';
6532
- };
6533
-
6534
- export type DashboardControllerGetNetWorthResponse = NetWorthResponseDto;
7507
+ export type PlatformControllerFindAllResponse = unknown;
6535
7508
 
6536
- export type DashboardControllerGetAccountsData = {
6537
- /**
6538
- * Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
6539
- */
6540
- accountId?: string;
6541
- /**
6542
- * Date for balance calculation (ISO 8601 format)
6543
- */
6544
- date?: string;
6545
- /**
6546
- * Grouping strategy
6547
- */
6548
- groupBy?:
6549
- | 'platform'
6550
- | 'assetClass'
6551
- | 'holdingAssetClass'
6552
- | 'holdingAssetClassByAccount';
6553
- /**
6554
- * Region code for tenant context
6555
- */
6556
- region: 'cn' | 'us' | 'de' | 'gb';
7509
+ export type PlatformControllerCreateData = {
7510
+ requestBody: CreatePlatformDto;
6557
7511
  };
6558
7512
 
6559
- export type DashboardControllerGetAccountsResponse =
6560
- | AccountsResponseDto
6561
- | AssetClassAccountsResponseDto
6562
- | HoldingAssetClassCrossAccountResponseDto;
6563
-
6564
- export type DashboardControllerGetCashFlowData = {
6565
- /**
6566
- * Period in YYYY-MM format
6567
- */
6568
- period: string;
6569
- /**
6570
- * Region code for tenant context
6571
- */
6572
- region: 'cn' | 'us' | 'de' | 'gb';
6573
- };
7513
+ export type PlatformControllerCreateResponse = unknown;
6574
7514
 
6575
- export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
7515
+ export type PlatformControllerGetPlatformListResponse =
7516
+ Array<PlatformListItemDto>;
6576
7517
 
6577
- export type HoldingPnlControllerGetHoldingPnlData = {
6578
- /**
6579
- * Scope to a single account
6580
- */
6581
- accountId?: string;
6582
- /**
6583
- * As-of date (ISO 8601), defaults to today
6584
- */
6585
- asOf?: string;
7518
+ export type PlatformControllerMatchPlatformsData = {
6586
7519
  /**
6587
- * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
7520
+ * Search query — Chinese name, English name, or abbreviation
6588
7521
  */
6589
- method?: 'FIFO' | 'average';
7522
+ q: string;
6590
7523
  /**
6591
- * Region code for tenant context
7524
+ * Region code for category override lookup
6592
7525
  */
6593
- region: 'cn' | 'us' | 'de' | 'gb';
7526
+ region?: string;
6594
7527
  };
6595
7528
 
6596
- export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
7529
+ export type PlatformControllerMatchPlatformsResponse = PlatformMatchResponseDto;
6597
7530
 
6598
- export type PriceControllerCreateData = {
7531
+ export type PlatformControllerUpdateData = {
6599
7532
  /**
6600
- * Region code for tenant context
7533
+ * Platform ID
6601
7534
  */
6602
- region: 'cn' | 'us' | 'de' | 'gb';
6603
- requestBody: CreateBeanPriceDto;
7535
+ id: string;
7536
+ requestBody: UpdatePlatformDto;
6604
7537
  };
6605
7538
 
6606
- export type PriceControllerCreateResponse = PriceResponseDto;
7539
+ export type PlatformControllerUpdateResponse = unknown;
6607
7540
 
6608
- export type PriceControllerFindAllData = {
6609
- /**
6610
- * Filter by currency (e.g., BTC, AAPL, USD)
6611
- */
6612
- currency?: string;
6613
- /**
6614
- * Filter prices from this date (ISO 8601 format)
6615
- */
6616
- dateFrom?: string;
6617
- /**
6618
- * Filter prices to this date (ISO 8601 format)
6619
- */
6620
- dateTo?: string;
6621
- /**
6622
- * Number of items per page (default: 20, max: 100)
6623
- */
6624
- limit?: number;
6625
- /**
6626
- * Page number for pagination (default: 1)
6627
- */
6628
- page?: number;
6629
- /**
6630
- * Filter by quote currency (pricing currency, e.g., USD, CNY)
6631
- */
6632
- quoteCurrency?: string;
6633
- /**
6634
- * Region code for tenant context
6635
- */
6636
- region: 'cn' | 'us' | 'de' | 'gb';
7541
+ export type PlatformControllerDeleteData = {
6637
7542
  /**
6638
- * Search term for currency or quoteCurrency (case-insensitive partial match)
7543
+ * Platform ID
6639
7544
  */
6640
- search?: string;
7545
+ id: string;
6641
7546
  };
6642
7547
 
6643
- export type PriceControllerFindAllResponse = PriceListResponseDto;
7548
+ export type PlatformControllerDeleteResponse = void;
6644
7549
 
6645
- export type PriceControllerFindOneData = {
7550
+ export type DashboardControllerGetNetWorthData = {
6646
7551
  /**
6647
- * Price ID
7552
+ * Date for balance calculation (ISO 8601 format)
6648
7553
  */
6649
- id: string;
7554
+ date?: string;
6650
7555
  /**
6651
7556
  * Region code for tenant context
6652
7557
  */
6653
7558
  region: 'cn' | 'us' | 'de' | 'gb';
6654
7559
  };
6655
7560
 
6656
- export type PriceControllerFindOneResponse = PriceResponseDto;
7561
+ export type DashboardControllerGetNetWorthResponse = NetWorthResponseDto;
6657
7562
 
6658
- export type PriceControllerUpdateData = {
7563
+ export type DashboardControllerGetAccountsData = {
6659
7564
  /**
6660
- * Price ID
7565
+ * Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
6661
7566
  */
6662
- id: string;
7567
+ accountId?: string;
6663
7568
  /**
6664
- * Region code for tenant context
7569
+ * Date for balance calculation (ISO 8601 format)
6665
7570
  */
6666
- region: 'cn' | 'us' | 'de' | 'gb';
6667
- requestBody: UpdateBeanPriceDto;
6668
- };
6669
-
6670
- export type PriceControllerUpdateResponse = PriceResponseDto;
6671
-
6672
- export type PriceControllerDeleteData = {
7571
+ date?: string;
6673
7572
  /**
6674
- * Price ID
7573
+ * Grouping strategy
6675
7574
  */
6676
- id: string;
7575
+ groupBy?:
7576
+ | 'platform'
7577
+ | 'assetClass'
7578
+ | 'holdingAssetClass'
7579
+ | 'holdingAssetClassByAccount';
6677
7580
  /**
6678
7581
  * Region code for tenant context
6679
7582
  */
6680
7583
  region: 'cn' | 'us' | 'de' | 'gb';
6681
7584
  };
6682
7585
 
6683
- export type PriceControllerDeleteResponse = void;
7586
+ export type DashboardControllerGetAccountsResponse =
7587
+ | AccountsResponseDto
7588
+ | AssetClassAccountsResponseDto
7589
+ | HoldingAssetClassCrossAccountResponseDto;
6684
7590
 
6685
- export type PriceControllerBulkCreateData = {
7591
+ export type DashboardControllerGetCashFlowData = {
7592
+ /**
7593
+ * Period in YYYY-MM format
7594
+ */
7595
+ period: string;
6686
7596
  /**
6687
7597
  * Region code for tenant context
6688
7598
  */
6689
7599
  region: 'cn' | 'us' | 'de' | 'gb';
6690
- requestBody: Array<string>;
6691
7600
  };
6692
7601
 
6693
- export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
7602
+ export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
6694
7603
 
6695
- export type ReportingControllerGetPortfolioTrendsData = {
7604
+ export type DashboardControllerGetExpensesData = {
6696
7605
  /**
6697
- * Data granularity
7606
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
6698
7607
  */
6699
- granularity?: 'day' | 'week' | 'month';
7608
+ flow?: 'expense' | 'income';
6700
7609
  /**
6701
- * Time period
7610
+ * Grouping strategy
7611
+ */
7612
+ groupBy?: 'category';
7613
+ /**
7614
+ * Time window (1m = current calendar month)
6702
7615
  */
6703
7616
  period?: '1m' | '3m' | '6m' | '1y';
6704
7617
  /**
@@ -6707,33 +7620,29 @@ export type ReportingControllerGetPortfolioTrendsData = {
6707
7620
  region: 'cn' | 'us' | 'de' | 'gb';
6708
7621
  };
6709
7622
 
6710
- export type ReportingControllerGetPortfolioTrendsResponse =
6711
- PortfolioTrendsResponseDto;
7623
+ export type DashboardControllerGetExpensesResponse =
7624
+ ExpensesByCategoryResponseDto;
6712
7625
 
6713
- export type ReportingControllerGenerateSnapshotData = {
7626
+ export type HoldingPnlControllerGetHoldingPnlData = {
6714
7627
  /**
6715
- * Region code for tenant context
7628
+ * Scope to a single account
6716
7629
  */
6717
- region: 'cn' | 'us' | 'de' | 'gb';
7630
+ accountId?: string;
6718
7631
  /**
6719
- * Optional date (defaults to today)
7632
+ * As-of date (ISO 8601), defaults to today
6720
7633
  */
6721
- requestBody: GenerateSnapshotBody;
6722
- };
6723
-
6724
- export type ReportingControllerGenerateSnapshotResponse =
6725
- GenerateSnapshotResponse;
6726
-
6727
- export type ReportingControllerBackfillSnapshotsData = {
7634
+ asOf?: string;
7635
+ /**
7636
+ * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
7637
+ */
7638
+ method?: 'FIFO' | 'average';
6728
7639
  /**
6729
7640
  * Region code for tenant context
6730
7641
  */
6731
7642
  region: 'cn' | 'us' | 'de' | 'gb';
6732
- requestBody: BackfillSnapshotsBody;
6733
7643
  };
6734
7644
 
6735
- export type ReportingControllerBackfillSnapshotsResponse =
6736
- BackfillSnapshotsResponse;
7645
+ export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
6737
7646
 
6738
7647
  export type ApiKeysControllerCreateApiKeyResponse = unknown;
6739
7648
 
@@ -6741,7 +7650,7 @@ export type AuthControllerAccessTokenLoginData = {
6741
7650
  requestBody: AnonymousLoginDto;
6742
7651
  };
6743
7652
 
6744
- export type AuthControllerAccessTokenLoginResponse = unknown;
7653
+ export type AuthControllerAccessTokenLoginResponse = AnonymousLoginResponseDto;
6745
7654
 
6746
7655
  export type CacheControllerFlushCacheResponse = unknown;
6747
7656
 
@@ -6781,6 +7690,33 @@ export type HealthControllerGetMetricsResponse = unknown;
6781
7690
 
6782
7691
  export type InfoControllerGetInfoResponse = unknown;
6783
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
+
6784
7720
  export type $OpenApiTs = {
6785
7721
  '/api/v1/{region}/bean/accounts': {
6786
7722
  post: {
@@ -6889,6 +7825,25 @@ export type $OpenApiTs = {
6889
7825
  };
6890
7826
  };
6891
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
+ };
6892
7847
  '/api/v1/{region}/bean/account-standards': {
6893
7848
  get: {
6894
7849
  req: AccountStandardsControllerGetTemplatesData;
@@ -7497,6 +8452,90 @@ export type $OpenApiTs = {
7497
8452
  };
7498
8453
  };
7499
8454
  };
8455
+ '/api/v1/{region}/bean/prices': {
8456
+ post: {
8457
+ req: PriceControllerCreateData;
8458
+ res: {
8459
+ /**
8460
+ * Price created successfully
8461
+ */
8462
+ 201: PriceResponseDto;
8463
+ /**
8464
+ * Currency or quoteCurrency commodity not found
8465
+ */
8466
+ 404: unknown;
8467
+ /**
8468
+ * Price already exists for this currency pair and date
8469
+ */
8470
+ 409: unknown;
8471
+ };
8472
+ };
8473
+ get: {
8474
+ req: PriceControllerFindAllData;
8475
+ res: {
8476
+ /**
8477
+ * Prices retrieved successfully
8478
+ */
8479
+ 200: PriceListResponseDto;
8480
+ };
8481
+ };
8482
+ };
8483
+ '/api/v1/{region}/bean/prices/{id}': {
8484
+ get: {
8485
+ req: PriceControllerFindOneData;
8486
+ res: {
8487
+ /**
8488
+ * Price retrieved successfully
8489
+ */
8490
+ 200: PriceResponseDto;
8491
+ /**
8492
+ * Price not found
8493
+ */
8494
+ 404: unknown;
8495
+ };
8496
+ };
8497
+ put: {
8498
+ req: PriceControllerUpdateData;
8499
+ res: {
8500
+ /**
8501
+ * Price updated successfully
8502
+ */
8503
+ 200: PriceResponseDto;
8504
+ /**
8505
+ * Price not found
8506
+ */
8507
+ 404: unknown;
8508
+ /**
8509
+ * Updated price conflicts with existing price
8510
+ */
8511
+ 409: unknown;
8512
+ };
8513
+ };
8514
+ delete: {
8515
+ req: PriceControllerDeleteData;
8516
+ res: {
8517
+ /**
8518
+ * Price deleted successfully
8519
+ */
8520
+ 204: void;
8521
+ /**
8522
+ * Price not found
8523
+ */
8524
+ 404: unknown;
8525
+ };
8526
+ };
8527
+ };
8528
+ '/api/v1/{region}/bean/prices/bulk': {
8529
+ post: {
8530
+ req: PriceControllerBulkCreateData;
8531
+ res: {
8532
+ /**
8533
+ * Prices created successfully
8534
+ */
8535
+ 201: Array<PriceResponseDto>;
8536
+ };
8537
+ };
8538
+ };
7500
8539
  '/api/v1/{region}/bean/recurring-rules': {
7501
8540
  post: {
7502
8541
  req: RecurringRuleControllerCreateData;
@@ -7747,397 +8786,469 @@ export type $OpenApiTs = {
7747
8786
  };
7748
8787
  };
7749
8788
  };
7750
- '/api/v1/{region}/bean/transaction-rules': {
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': {
7751
8820
  post: {
7752
- req: TransactionRuleControllerCreateData;
8821
+ req: ReportingControllerGenerateSnapshotData;
7753
8822
  res: {
7754
8823
  /**
7755
- * Rule updated successfully (upsert mode)
8824
+ * Snapshot generated successfully
7756
8825
  */
7757
- 200: TransactionRuleResponseDto;
8826
+ 200: GenerateSnapshotResponse;
7758
8827
  /**
7759
- * Validation failed
8828
+ * Invalid date format
7760
8829
  */
7761
- 400: ApiProblemResponseDto;
8830
+ 400: unknown;
7762
8831
  /**
7763
- * Unauthorized
8832
+ * User not authenticated
7764
8833
  */
7765
- 401: ApiProblemResponseDto;
8834
+ 401: unknown;
8835
+ };
8836
+ };
8837
+ };
8838
+ '/api/v1/{region}/reporting/snapshots/backfill': {
8839
+ post: {
8840
+ req: ReportingControllerBackfillSnapshotsData;
8841
+ res: {
7766
8842
  /**
7767
- * Resource conflict - another process is updating this rule
8843
+ * Backfill completed successfully
8844
+ */
8845
+ 200: BackfillSnapshotsResponse;
8846
+ /**
8847
+ * Invalid date format or range
8848
+ */
8849
+ 400: unknown;
8850
+ /**
8851
+ * User not authenticated
8852
+ */
8853
+ 401: unknown;
8854
+ /**
8855
+ * Backfill already in progress for this user
8856
+ */
8857
+ 409: unknown;
8858
+ };
8859
+ };
8860
+ };
8861
+ '/api/v1/users': {
8862
+ delete: {
8863
+ req: UserControllerDeleteOwnUserData;
8864
+ res: {
8865
+ /**
8866
+ * User deleted successfully
8867
+ */
8868
+ 204: void;
8869
+ /**
8870
+ * Invalid access token
8871
+ */
8872
+ 403: unknown;
8873
+ };
8874
+ };
8875
+ get: {
8876
+ req: UserControllerGetUserData;
8877
+ res: {
8878
+ /**
8879
+ * User retrieved successfully
8880
+ */
8881
+ 200: unknown;
8882
+ };
8883
+ };
8884
+ post: {
8885
+ req: UserControllerSignupUserData;
8886
+ res: {
8887
+ /**
8888
+ * User created successfully
8889
+ */
8890
+ 201: SignupResponseDto;
8891
+ /**
8892
+ * Invalid Turnstile token (when Turnstile is enabled)
8893
+ */
8894
+ 400: unknown;
8895
+ /**
8896
+ * User signup is disabled
7768
8897
  */
7769
- 409: ApiProblemResponseDto;
8898
+ 403: unknown;
7770
8899
  };
7771
8900
  };
7772
- get: {
7773
- req: TransactionRuleControllerListData;
8901
+ };
8902
+ '/api/v1/users/{id}': {
8903
+ delete: {
8904
+ req: UserControllerDeleteUserData;
7774
8905
  res: {
7775
8906
  /**
7776
- * List of rules
8907
+ * User deleted successfully
7777
8908
  */
7778
- 200: TransactionRuleListResponseDto;
8909
+ 204: void;
7779
8910
  /**
7780
- * Unauthorized
8911
+ * Cannot delete own account or insufficient permissions
7781
8912
  */
7782
- 401: ApiProblemResponseDto;
8913
+ 403: unknown;
7783
8914
  };
7784
8915
  };
7785
8916
  };
7786
- '/api/v1/{region}/bean/transaction-rules/validate': {
7787
- post: {
7788
- req: TransactionRuleControllerValidateData;
8917
+ '/api/v1/users/{id}/info': {
8918
+ get: {
8919
+ req: UserControllerGetUserInfoData;
7789
8920
  res: {
7790
8921
  /**
7791
- * Validation result
7792
- */
7793
- 200: ValidateRuleResponseDto;
7794
- /**
7795
- * Validation failed
8922
+ * User info retrieved successfully
7796
8923
  */
7797
- 400: ApiProblemResponseDto;
8924
+ 200: unknown;
7798
8925
  /**
7799
- * Unauthorized
8926
+ * Cannot access other user info without admin permission
7800
8927
  */
7801
- 401: ApiProblemResponseDto;
8928
+ 403: unknown;
7802
8929
  };
7803
8930
  };
7804
8931
  };
7805
- '/api/v1/{region}/bean/transaction-rules/bulk': {
7806
- post: {
7807
- req: TransactionRuleControllerBulkCreateData;
8932
+ '/api/v1/users/setting': {
8933
+ put: {
8934
+ req: UserControllerUpdateUserSettingData;
7808
8935
  res: {
7809
8936
  /**
7810
- * Bulk create completed
7811
- */
7812
- 201: BulkCreateRulesResponseDto;
7813
- /**
7814
- * Invalid bulk create data
8937
+ * Settings updated successfully
7815
8938
  */
7816
- 400: ApiProblemResponseDto;
8939
+ 200: unknown;
7817
8940
  /**
7818
- * Unauthorized
8941
+ * Insufficient permissions
7819
8942
  */
7820
- 401: ApiProblemResponseDto;
8943
+ 403: unknown;
7821
8944
  };
7822
8945
  };
7823
8946
  };
7824
- '/api/v1/{region}/bean/transaction-rules/export/{format}': {
8947
+ '/api/v1/users/settings-by-page': {
7825
8948
  get: {
7826
- req: TransactionRuleControllerExportData;
8949
+ req: UserControllerGetAllUserSettingsByPageData;
7827
8950
  res: {
7828
8951
  /**
7829
- * Exported rules
7830
- */
7831
- 200: ExportRulesResponseDto;
7832
- /**
7833
- * Unsupported format
8952
+ * Settings list retrieved successfully
7834
8953
  */
7835
- 400: ApiProblemResponseDto;
8954
+ 200: unknown;
8955
+ };
8956
+ };
8957
+ };
8958
+ '/api/v1/users/asset-liability-summary': {
8959
+ get: {
8960
+ res: {
7836
8961
  /**
7837
- * Unauthorized
8962
+ * Summary retrieved successfully
7838
8963
  */
7839
- 401: ApiProblemResponseDto;
8964
+ 200: unknown;
7840
8965
  };
7841
8966
  };
7842
8967
  };
7843
- '/api/v1/{region}/bean/transaction-rules/statistics/{period}': {
8968
+ '/api/v1/admin/properties': {
7844
8969
  get: {
7845
- req: TransactionRuleControllerGetStatisticsData;
7846
8970
  res: {
7847
8971
  /**
7848
- * Rule statistics
8972
+ * Properties retrieved successfully
7849
8973
  */
7850
- 200: RuleStatisticsResponseDto;
8974
+ 200: unknown;
7851
8975
  /**
7852
8976
  * Unauthorized
7853
8977
  */
7854
- 401: ApiProblemResponseDto;
8978
+ 401: unknown;
8979
+ /**
8980
+ * Forbidden - insufficient permissions
8981
+ */
8982
+ 403: unknown;
7855
8983
  };
7856
8984
  };
7857
8985
  };
7858
- '/api/v1/{region}/bean/transaction-rules/{ruleId}': {
8986
+ '/api/v1/admin/properties/{key}': {
7859
8987
  get: {
7860
- req: TransactionRuleControllerGetDetailData;
8988
+ req: PropertyControllerGetByKeyData;
7861
8989
  res: {
7862
8990
  /**
7863
- * Rule details
8991
+ * Property retrieved successfully
7864
8992
  */
7865
- 200: TransactionRuleResponseDto;
8993
+ 200: unknown;
7866
8994
  /**
7867
8995
  * Unauthorized
7868
8996
  */
7869
- 401: ApiProblemResponseDto;
8997
+ 401: unknown;
7870
8998
  /**
7871
- * Forbidden - not owner of rule
8999
+ * Forbidden - insufficient permissions
7872
9000
  */
7873
- 403: ApiProblemResponseDto;
9001
+ 403: unknown;
7874
9002
  /**
7875
- * Rule not found
9003
+ * Property not found
7876
9004
  */
7877
- 404: ApiProblemResponseDto;
9005
+ 404: unknown;
7878
9006
  };
7879
9007
  };
7880
9008
  put: {
7881
- req: TransactionRuleControllerUpdateData;
9009
+ req: PropertyControllerUpdateData;
7882
9010
  res: {
7883
9011
  /**
7884
- * Rule updated successfully
7885
- */
7886
- 200: TransactionRuleResponseDto;
7887
- /**
7888
- * Validation failed
9012
+ * Property updated successfully
7889
9013
  */
7890
- 400: ApiProblemResponseDto;
9014
+ 200: unknown;
7891
9015
  /**
7892
9016
  * Unauthorized
7893
9017
  */
7894
- 401: ApiProblemResponseDto;
7895
- /**
7896
- * Forbidden - not owner of rule
7897
- */
7898
- 403: ApiProblemResponseDto;
7899
- /**
7900
- * Rule not found
7901
- */
7902
- 404: ApiProblemResponseDto;
9018
+ 401: unknown;
7903
9019
  /**
7904
- * Resource conflict - rule is being modified by another process
9020
+ * Forbidden - insufficient permissions
7905
9021
  */
7906
- 409: ApiProblemResponseDto;
9022
+ 403: unknown;
7907
9023
  };
7908
9024
  };
7909
9025
  delete: {
7910
- req: TransactionRuleControllerDeleteData;
9026
+ req: PropertyControllerDeleteData;
7911
9027
  res: {
7912
9028
  /**
7913
- * Rule deleted successfully
9029
+ * Property deleted successfully
7914
9030
  */
7915
9031
  204: void;
7916
9032
  /**
7917
9033
  * Unauthorized
7918
9034
  */
7919
- 401: ApiProblemResponseDto;
7920
- /**
7921
- * Forbidden - not owner of rule
7922
- */
7923
- 403: ApiProblemResponseDto;
9035
+ 401: unknown;
7924
9036
  /**
7925
- * Rule not found
9037
+ * Forbidden - insufficient permissions
7926
9038
  */
7927
- 404: ApiProblemResponseDto;
9039
+ 403: unknown;
7928
9040
  /**
7929
- * Resource conflict - rule is being modified by another process
9041
+ * Property not found
7930
9042
  */
7931
- 409: ApiProblemResponseDto;
9043
+ 404: unknown;
7932
9044
  };
7933
9045
  };
7934
9046
  };
7935
- '/api/v1/{region}/bean/transaction-rules/{ruleId}/test': {
9047
+ '/api/v1/{region}/bean/transaction-rules': {
7936
9048
  post: {
7937
- req: TransactionRuleControllerTestData;
9049
+ req: TransactionRuleControllerCreateData;
7938
9050
  res: {
7939
9051
  /**
7940
- * Test result
9052
+ * Rule updated successfully (upsert mode)
7941
9053
  */
7942
- 200: TestRuleResponseDto;
9054
+ 200: TransactionRuleResponseDto;
7943
9055
  /**
7944
- * Unauthorized
9056
+ * Validation failed
7945
9057
  */
7946
- 401: ApiProblemResponseDto;
9058
+ 400: ApiProblemResponseDto;
7947
9059
  /**
7948
- * Forbidden - not owner of rule
9060
+ * Unauthorized
7949
9061
  */
7950
- 403: ApiProblemResponseDto;
9062
+ 401: ApiProblemResponseDto;
7951
9063
  /**
7952
- * Rule not found
9064
+ * Resource conflict - another process is updating this rule
7953
9065
  */
7954
- 404: ApiProblemResponseDto;
9066
+ 409: ApiProblemResponseDto;
7955
9067
  };
7956
9068
  };
7957
- };
7958
- '/api/v1/users': {
7959
- delete: {
7960
- req: UserControllerDeleteOwnUserData;
9069
+ get: {
9070
+ req: TransactionRuleControllerListData;
7961
9071
  res: {
7962
9072
  /**
7963
- * User deleted successfully
7964
- */
7965
- 204: void;
7966
- /**
7967
- * Invalid access token
9073
+ * List of rules
7968
9074
  */
7969
- 403: unknown;
7970
- };
7971
- };
7972
- get: {
7973
- req: UserControllerGetUserData;
7974
- res: {
9075
+ 200: TransactionRuleListResponseDto;
7975
9076
  /**
7976
- * User retrieved successfully
9077
+ * Unauthorized
7977
9078
  */
7978
- 200: unknown;
9079
+ 401: ApiProblemResponseDto;
7979
9080
  };
7980
9081
  };
9082
+ };
9083
+ '/api/v1/{region}/bean/transaction-rules/validate': {
7981
9084
  post: {
7982
- req: UserControllerSignupUserData;
9085
+ req: TransactionRuleControllerValidateData;
7983
9086
  res: {
7984
9087
  /**
7985
- * User created successfully
9088
+ * Validation result
7986
9089
  */
7987
- 201: unknown;
9090
+ 200: ValidateRuleResponseDto;
7988
9091
  /**
7989
- * Invalid Turnstile token (when Turnstile is enabled)
9092
+ * Validation failed
7990
9093
  */
7991
- 400: unknown;
9094
+ 400: ApiProblemResponseDto;
7992
9095
  /**
7993
- * User signup is disabled
9096
+ * Unauthorized
7994
9097
  */
7995
- 403: unknown;
9098
+ 401: ApiProblemResponseDto;
7996
9099
  };
7997
9100
  };
7998
9101
  };
7999
- '/api/v1/users/{id}': {
8000
- delete: {
8001
- req: UserControllerDeleteUserData;
9102
+ '/api/v1/{region}/bean/transaction-rules/bulk': {
9103
+ post: {
9104
+ req: TransactionRuleControllerBulkCreateData;
8002
9105
  res: {
8003
9106
  /**
8004
- * User deleted successfully
8005
- */
8006
- 204: void;
8007
- /**
8008
- * Cannot delete own account or insufficient permissions
9107
+ * Bulk create completed
8009
9108
  */
8010
- 403: unknown;
8011
- };
8012
- };
8013
- };
8014
- '/api/v1/users/{id}/info': {
8015
- get: {
8016
- req: UserControllerGetUserInfoData;
8017
- res: {
9109
+ 201: BulkCreateRulesResponseDto;
8018
9110
  /**
8019
- * User info retrieved successfully
9111
+ * Invalid bulk create data
8020
9112
  */
8021
- 200: unknown;
9113
+ 400: ApiProblemResponseDto;
8022
9114
  /**
8023
- * Cannot access other user info without admin permission
9115
+ * Unauthorized
8024
9116
  */
8025
- 403: unknown;
9117
+ 401: ApiProblemResponseDto;
8026
9118
  };
8027
9119
  };
8028
9120
  };
8029
- '/api/v1/users/setting': {
8030
- put: {
8031
- req: UserControllerUpdateUserSettingData;
9121
+ '/api/v1/{region}/bean/transaction-rules/export/{format}': {
9122
+ get: {
9123
+ req: TransactionRuleControllerExportData;
8032
9124
  res: {
8033
9125
  /**
8034
- * Settings updated successfully
8035
- */
8036
- 200: unknown;
8037
- /**
8038
- * Insufficient permissions
9126
+ * Exported rules
8039
9127
  */
8040
- 403: unknown;
8041
- };
8042
- };
8043
- };
8044
- '/api/v1/users/settings-by-page': {
8045
- get: {
8046
- req: UserControllerGetAllUserSettingsByPageData;
8047
- res: {
9128
+ 200: ExportRulesResponseDto;
8048
9129
  /**
8049
- * Settings list retrieved successfully
9130
+ * Unsupported format
8050
9131
  */
8051
- 200: unknown;
9132
+ 400: ApiProblemResponseDto;
9133
+ /**
9134
+ * Unauthorized
9135
+ */
9136
+ 401: ApiProblemResponseDto;
8052
9137
  };
8053
9138
  };
8054
9139
  };
8055
- '/api/v1/users/asset-liability-summary': {
9140
+ '/api/v1/{region}/bean/transaction-rules/statistics/{period}': {
8056
9141
  get: {
9142
+ req: TransactionRuleControllerGetStatisticsData;
8057
9143
  res: {
8058
9144
  /**
8059
- * Summary retrieved successfully
9145
+ * Rule statistics
8060
9146
  */
8061
- 200: unknown;
9147
+ 200: RuleStatisticsResponseDto;
9148
+ /**
9149
+ * Unauthorized
9150
+ */
9151
+ 401: ApiProblemResponseDto;
8062
9152
  };
8063
9153
  };
8064
9154
  };
8065
- '/api/v1/admin/properties': {
9155
+ '/api/v1/{region}/bean/transaction-rules/{ruleId}': {
8066
9156
  get: {
9157
+ req: TransactionRuleControllerGetDetailData;
8067
9158
  res: {
8068
9159
  /**
8069
- * Properties retrieved successfully
9160
+ * Rule details
8070
9161
  */
8071
- 200: unknown;
9162
+ 200: TransactionRuleResponseDto;
8072
9163
  /**
8073
9164
  * Unauthorized
8074
9165
  */
8075
- 401: unknown;
9166
+ 401: ApiProblemResponseDto;
8076
9167
  /**
8077
- * Forbidden - insufficient permissions
9168
+ * Forbidden - not owner of rule
8078
9169
  */
8079
- 403: unknown;
9170
+ 403: ApiProblemResponseDto;
9171
+ /**
9172
+ * Rule not found
9173
+ */
9174
+ 404: ApiProblemResponseDto;
8080
9175
  };
8081
9176
  };
8082
- };
8083
- '/api/v1/admin/properties/{key}': {
8084
- get: {
8085
- req: PropertyControllerGetByKeyData;
9177
+ put: {
9178
+ req: TransactionRuleControllerUpdateData;
8086
9179
  res: {
8087
9180
  /**
8088
- * Property retrieved successfully
9181
+ * Rule updated successfully
8089
9182
  */
8090
- 200: unknown;
9183
+ 200: TransactionRuleResponseDto;
9184
+ /**
9185
+ * Validation failed
9186
+ */
9187
+ 400: ApiProblemResponseDto;
8091
9188
  /**
8092
9189
  * Unauthorized
8093
9190
  */
8094
- 401: unknown;
9191
+ 401: ApiProblemResponseDto;
8095
9192
  /**
8096
- * Forbidden - insufficient permissions
9193
+ * Forbidden - not owner of rule
8097
9194
  */
8098
- 403: unknown;
9195
+ 403: ApiProblemResponseDto;
8099
9196
  /**
8100
- * Property not found
9197
+ * Rule not found
8101
9198
  */
8102
- 404: unknown;
9199
+ 404: ApiProblemResponseDto;
9200
+ /**
9201
+ * Resource conflict - rule is being modified by another process
9202
+ */
9203
+ 409: ApiProblemResponseDto;
8103
9204
  };
8104
9205
  };
8105
- put: {
8106
- req: PropertyControllerUpdateData;
9206
+ delete: {
9207
+ req: TransactionRuleControllerDeleteData;
8107
9208
  res: {
8108
9209
  /**
8109
- * Property updated successfully
9210
+ * Rule deleted successfully
8110
9211
  */
8111
- 200: unknown;
9212
+ 204: void;
8112
9213
  /**
8113
9214
  * Unauthorized
8114
9215
  */
8115
- 401: unknown;
9216
+ 401: ApiProblemResponseDto;
8116
9217
  /**
8117
- * Forbidden - insufficient permissions
9218
+ * Forbidden - not owner of rule
8118
9219
  */
8119
- 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;
8120
9229
  };
8121
9230
  };
8122
- delete: {
8123
- req: PropertyControllerDeleteData;
9231
+ };
9232
+ '/api/v1/{region}/bean/transaction-rules/{ruleId}/test': {
9233
+ post: {
9234
+ req: TransactionRuleControllerTestData;
8124
9235
  res: {
8125
9236
  /**
8126
- * Property deleted successfully
9237
+ * Test result
8127
9238
  */
8128
- 204: void;
9239
+ 200: TestRuleResponseDto;
8129
9240
  /**
8130
9241
  * Unauthorized
8131
9242
  */
8132
- 401: unknown;
9243
+ 401: ApiProblemResponseDto;
8133
9244
  /**
8134
- * Forbidden - insufficient permissions
9245
+ * Forbidden - not owner of rule
8135
9246
  */
8136
- 403: unknown;
9247
+ 403: ApiProblemResponseDto;
8137
9248
  /**
8138
- * Property not found
9249
+ * Rule not found
8139
9250
  */
8140
- 404: unknown;
9251
+ 404: ApiProblemResponseDto;
8141
9252
  };
8142
9253
  };
8143
9254
  };
@@ -8218,6 +9329,104 @@ export type $OpenApiTs = {
8218
9329
  };
8219
9330
  };
8220
9331
  };
9332
+ '/api/v1/{region}/bean/events/{id}/slice': {
9333
+ get: {
9334
+ req: EventControllerGetSliceData;
9335
+ res: {
9336
+ /**
9337
+ * Time-series sliced by the life event range
9338
+ */
9339
+ 200: unknown;
9340
+ /**
9341
+ * accountPattern query param is empty
9342
+ */
9343
+ 400: unknown;
9344
+ /**
9345
+ * Life event not found
9346
+ */
9347
+ 404: unknown;
9348
+ };
9349
+ };
9350
+ };
9351
+ '/api/v1/{region}/bean/onboarding': {
9352
+ post: {
9353
+ req: OnboardingControllerBootstrapData;
9354
+ res: {
9355
+ /**
9356
+ * Onboarding bootstrap result.
9357
+ */
9358
+ 201: unknown;
9359
+ /**
9360
+ * Invalid region/account path/duplicate paths.
9361
+ */
9362
+ 422: unknown;
9363
+ };
9364
+ };
9365
+ };
9366
+ '/api/v1/{region}/bean/reconciliations': {
9367
+ post: {
9368
+ req: ReconciliationControllerComputeData;
9369
+ res: {
9370
+ /**
9371
+ * Reconciliation preview
9372
+ */
9373
+ 200: ReconciliationComputeResultDto;
9374
+ /**
9375
+ * Account not found
9376
+ */
9377
+ 404: unknown;
9378
+ };
9379
+ };
9380
+ };
9381
+ '/api/v1/{region}/bean/reconciliations/assert': {
9382
+ post: {
9383
+ req: ReconciliationControllerAssertData;
9384
+ res: {
9385
+ /**
9386
+ * Balance assertion recorded
9387
+ */
9388
+ 201: ReconciliationRecordDto;
9389
+ /**
9390
+ * Account not found
9391
+ */
9392
+ 404: unknown;
9393
+ };
9394
+ };
9395
+ };
9396
+ '/api/v1/{region}/bean/reconciliations/pad': {
9397
+ post: {
9398
+ req: ReconciliationControllerPadData;
9399
+ res: {
9400
+ /**
9401
+ * Pad adjusting entry generated
9402
+ */
9403
+ 201: PadResultDto;
9404
+ /**
9405
+ * Book already within tolerance — no pad needed
9406
+ */
9407
+ 400: unknown;
9408
+ /**
9409
+ * Account not found
9410
+ */
9411
+ 404: unknown;
9412
+ };
9413
+ };
9414
+ };
9415
+ '/api/v1/{region}/bean/accounts/{accountId}/reconciliations': {
9416
+ get: {
9417
+ req: ReconciliationControllerHistoryData;
9418
+ res: {
9419
+ /**
9420
+ * Reconciliation history
9421
+ */
9422
+ 200: Array<ReconciliationRecordDto>;
9423
+ /**
9424
+ * Account not found
9425
+ */
9426
+ 404: unknown;
9427
+ };
9428
+ };
9429
+ };
8221
9430
  '/api/v1/{region}/bean/export/beancount': {
8222
9431
  get: {
8223
9432
  res: {
@@ -8327,116 +9536,44 @@ export type $OpenApiTs = {
8327
9536
  200: ImporterConfigDto;
8328
9537
  /**
8329
9538
  * Invalid input - Unsupported importer
8330
- */
8331
- 400: ApiProblemResponseDto;
8332
- /**
8333
- * Unauthorized - Authentication required
8334
- */
8335
- 401: ApiProblemResponseDto;
8336
- };
8337
- };
8338
- put: {
8339
- req: ImporterConfigControllerUpdateConfigData;
8340
- res: {
8341
- /**
8342
- * Configuration updated successfully
8343
- */
8344
- 200: ImporterConfigDto;
8345
- /**
8346
- * Invalid input - Validation failed
8347
- */
8348
- 400: ApiProblemResponseDto;
8349
- /**
8350
- * Configuration not found
8351
- */
8352
- 404: ApiProblemResponseDto;
8353
- };
8354
- };
8355
- };
8356
- '/api/v1/{region}/bean/import/config/{importerId}/reset': {
8357
- post: {
8358
- req: ImporterConfigControllerResetConfigData;
8359
- res: {
8360
- /**
8361
- * Configuration reset successfully
8362
- */
8363
- 200: ImporterConfigDto;
8364
- /**
8365
- * Invalid input - Unsupported importer
8366
- */
8367
- 400: ApiProblemResponseDto;
8368
- };
8369
- };
8370
- };
8371
- '/api/v1/bean/platforms': {
8372
- get: {
8373
- res: {
8374
- /**
8375
- * List of platforms with binding and account counts
8376
- */
8377
- 200: unknown;
8378
- };
8379
- };
8380
- post: {
8381
- req: PlatformControllerCreateData;
8382
- res: {
8383
- /**
8384
- * Platform created successfully
8385
- */
8386
- 201: unknown;
8387
- /**
8388
- * Platform already exists
8389
- */
8390
- 409: unknown;
8391
- };
8392
- };
8393
- };
8394
- '/api/v1/bean/platforms/list': {
8395
- get: {
8396
- res: {
8397
- /**
8398
- * List of platforms with user binding status
8399
- */
8400
- 200: unknown;
8401
- };
8402
- };
8403
- };
8404
- '/api/v1/bean/platforms/match': {
8405
- get: {
8406
- req: PlatformControllerMatchPlatformsData;
8407
- res: {
9539
+ */
9540
+ 400: ApiProblemResponseDto;
8408
9541
  /**
8409
- * List of matching platforms with suggested segment names
9542
+ * Unauthorized - Authentication required
8410
9543
  */
8411
- 200: unknown;
9544
+ 401: ApiProblemResponseDto;
8412
9545
  };
8413
9546
  };
8414
- };
8415
- '/api/v1/bean/platforms/{id}': {
8416
9547
  put: {
8417
- req: PlatformControllerUpdateData;
9548
+ req: ImporterConfigControllerUpdateConfigData;
8418
9549
  res: {
8419
9550
  /**
8420
- * Platform updated successfully
9551
+ * Configuration updated successfully
8421
9552
  */
8422
- 200: unknown;
9553
+ 200: ImporterConfigDto;
8423
9554
  /**
8424
- * Platform not found
9555
+ * Invalid input - Validation failed
8425
9556
  */
8426
- 404: unknown;
9557
+ 400: ApiProblemResponseDto;
9558
+ /**
9559
+ * Configuration not found
9560
+ */
9561
+ 404: ApiProblemResponseDto;
8427
9562
  };
8428
9563
  };
8429
- delete: {
8430
- req: PlatformControllerDeleteData;
9564
+ };
9565
+ '/api/v1/{region}/bean/import/config/{importerId}/reset': {
9566
+ post: {
9567
+ req: ImporterConfigControllerResetConfigData;
8431
9568
  res: {
8432
9569
  /**
8433
- * Platform deleted successfully
9570
+ * Configuration reset successfully
8434
9571
  */
8435
- 204: void;
9572
+ 200: ImporterConfigDto;
8436
9573
  /**
8437
- * Platform not found
9574
+ * Invalid input - Unsupported importer
8438
9575
  */
8439
- 404: unknown;
9576
+ 400: ApiProblemResponseDto;
8440
9577
  };
8441
9578
  };
8442
9579
  };
@@ -8493,6 +9630,54 @@ export type $OpenApiTs = {
8493
9630
  };
8494
9631
  };
8495
9632
  };
9633
+ '/api/v1/{region}/bean/external-account-links': {
9634
+ post: {
9635
+ req: ExternalAccountLinkControllerCreateData;
9636
+ res: {
9637
+ /**
9638
+ * Link created.
9639
+ */
9640
+ 201: ExternalAccountLinkResponseDto;
9641
+ /**
9642
+ * beanAccountId not owned, or an active link already exists.
9643
+ */
9644
+ 422: unknown;
9645
+ };
9646
+ };
9647
+ get: {
9648
+ req: ExternalAccountLinkControllerFindAllData;
9649
+ res: {
9650
+ /**
9651
+ * Links retrieved.
9652
+ */
9653
+ 200: ExternalAccountLinkListResponseDto;
9654
+ };
9655
+ };
9656
+ };
9657
+ '/api/v1/{region}/bean/external-account-links/{id}': {
9658
+ get: {
9659
+ req: ExternalAccountLinkControllerFindOneData;
9660
+ res: {
9661
+ /**
9662
+ * Link retrieved.
9663
+ */
9664
+ 200: ExternalAccountLinkResponseDto;
9665
+ /**
9666
+ * Link not found or not owned by the user.
9667
+ */
9668
+ 422: unknown;
9669
+ };
9670
+ };
9671
+ delete: {
9672
+ req: ExternalAccountLinkControllerRemoveData;
9673
+ res: {
9674
+ /**
9675
+ * Link soft-deleted; historical transactions are unaffected.
9676
+ */
9677
+ 204: void;
9678
+ };
9679
+ };
9680
+ };
8496
9681
  '/api/v1/{region}/bean/import/parser-telemetry': {
8497
9682
  post: {
8498
9683
  req: TelemetryControllerReportTelemetryData;
@@ -8581,169 +9766,123 @@ export type $OpenApiTs = {
8581
9766
  };
8582
9767
  };
8583
9768
  };
8584
- '/api/v1/{region}/dashboard/net-worth': {
9769
+ '/api/v1/bean/platforms': {
8585
9770
  get: {
8586
- req: DashboardControllerGetNetWorthData;
8587
9771
  res: {
8588
9772
  /**
8589
- * Net worth retrieved successfully
8590
- */
8591
- 200: NetWorthResponseDto;
8592
- /**
8593
- * User not authenticated
9773
+ * List of platforms with binding and account counts
8594
9774
  */
8595
- 401: unknown;
9775
+ 200: unknown;
8596
9776
  };
8597
9777
  };
8598
- };
8599
- '/api/v1/{region}/dashboard/accounts': {
8600
- get: {
8601
- req: DashboardControllerGetAccountsData;
9778
+ post: {
9779
+ req: PlatformControllerCreateData;
8602
9780
  res: {
8603
9781
  /**
8604
- * Accounts retrieved successfully. Response type depends on groupBy parameter.
9782
+ * Platform created successfully
8605
9783
  */
8606
- 200:
8607
- | AccountsResponseDto
8608
- | AssetClassAccountsResponseDto
8609
- | HoldingAssetClassCrossAccountResponseDto;
9784
+ 201: unknown;
8610
9785
  /**
8611
- * User not authenticated
9786
+ * Platform already exists
8612
9787
  */
8613
- 401: unknown;
9788
+ 409: unknown;
8614
9789
  };
8615
9790
  };
8616
9791
  };
8617
- '/api/v1/{region}/dashboard/cash-flow': {
9792
+ '/api/v1/bean/platforms/list': {
8618
9793
  get: {
8619
- req: DashboardControllerGetCashFlowData;
8620
9794
  res: {
8621
9795
  /**
8622
- * Cash flow retrieved successfully
8623
- */
8624
- 200: CashFlowResponseDto;
8625
- /**
8626
- * Invalid period format
8627
- */
8628
- 400: unknown;
8629
- /**
8630
- * User not authenticated
9796
+ * List of platforms with user binding status
8631
9797
  */
8632
- 401: unknown;
9798
+ 200: Array<PlatformListItemDto>;
8633
9799
  };
8634
9800
  };
8635
9801
  };
8636
- '/api/v1/{region}/investment/holdings/pnl': {
9802
+ '/api/v1/bean/platforms/match': {
8637
9803
  get: {
8638
- req: HoldingPnlControllerGetHoldingPnlData;
9804
+ req: PlatformControllerMatchPlatformsData;
8639
9805
  res: {
8640
9806
  /**
8641
- * Holding P&L retrieved successfully
8642
- */
8643
- 200: HoldingPnlResponseDto;
8644
- /**
8645
- * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
8646
- */
8647
- 400: unknown;
8648
- /**
8649
- * User not authenticated
9807
+ * Matching platforms with overall match type and truncation flag
8650
9808
  */
8651
- 401: unknown;
9809
+ 200: PlatformMatchResponseDto;
8652
9810
  };
8653
9811
  };
8654
9812
  };
8655
- '/api/v1/{region}/bean/prices': {
8656
- post: {
8657
- req: PriceControllerCreateData;
9813
+ '/api/v1/bean/platforms/{id}': {
9814
+ put: {
9815
+ req: PlatformControllerUpdateData;
8658
9816
  res: {
8659
9817
  /**
8660
- * Price created successfully
9818
+ * Platform updated successfully
8661
9819
  */
8662
- 201: PriceResponseDto;
9820
+ 200: unknown;
8663
9821
  /**
8664
- * Currency or quoteCurrency commodity not found
9822
+ * Platform not found
8665
9823
  */
8666
9824
  404: unknown;
8667
- /**
8668
- * Price already exists for this currency pair and date
8669
- */
8670
- 409: unknown;
8671
- };
8672
- };
8673
- get: {
8674
- req: PriceControllerFindAllData;
8675
- res: {
8676
- /**
8677
- * Prices retrieved successfully
8678
- */
8679
- 200: PriceListResponseDto;
8680
9825
  };
8681
9826
  };
8682
- };
8683
- '/api/v1/{region}/bean/prices/{id}': {
8684
- get: {
8685
- req: PriceControllerFindOneData;
9827
+ delete: {
9828
+ req: PlatformControllerDeleteData;
8686
9829
  res: {
8687
9830
  /**
8688
- * Price retrieved successfully
9831
+ * Platform deleted successfully
8689
9832
  */
8690
- 200: PriceResponseDto;
9833
+ 204: void;
8691
9834
  /**
8692
- * Price not found
9835
+ * Platform not found
8693
9836
  */
8694
9837
  404: unknown;
8695
9838
  };
8696
9839
  };
8697
- put: {
8698
- req: PriceControllerUpdateData;
9840
+ };
9841
+ '/api/v1/{region}/dashboard/net-worth': {
9842
+ get: {
9843
+ req: DashboardControllerGetNetWorthData;
8699
9844
  res: {
8700
9845
  /**
8701
- * Price updated successfully
8702
- */
8703
- 200: PriceResponseDto;
8704
- /**
8705
- * Price not found
9846
+ * Net worth retrieved successfully
8706
9847
  */
8707
- 404: unknown;
9848
+ 200: NetWorthResponseDto;
8708
9849
  /**
8709
- * Updated price conflicts with existing price
9850
+ * User not authenticated
8710
9851
  */
8711
- 409: unknown;
9852
+ 401: unknown;
8712
9853
  };
8713
9854
  };
8714
- delete: {
8715
- req: PriceControllerDeleteData;
9855
+ };
9856
+ '/api/v1/{region}/dashboard/accounts': {
9857
+ get: {
9858
+ req: DashboardControllerGetAccountsData;
8716
9859
  res: {
8717
9860
  /**
8718
- * Price deleted successfully
9861
+ * Accounts retrieved successfully. Response type depends on groupBy parameter.
8719
9862
  */
8720
- 204: void;
9863
+ 200:
9864
+ | AccountsResponseDto
9865
+ | AssetClassAccountsResponseDto
9866
+ | HoldingAssetClassCrossAccountResponseDto;
8721
9867
  /**
8722
- * Price not found
9868
+ * User not authenticated
8723
9869
  */
8724
- 404: unknown;
9870
+ 401: unknown;
8725
9871
  };
8726
9872
  };
8727
9873
  };
8728
- '/api/v1/{region}/bean/prices/bulk': {
8729
- post: {
8730
- req: PriceControllerBulkCreateData;
9874
+ '/api/v1/{region}/dashboard/cash-flow': {
9875
+ get: {
9876
+ req: DashboardControllerGetCashFlowData;
8731
9877
  res: {
8732
9878
  /**
8733
- * Prices created successfully
9879
+ * Cash flow retrieved successfully
8734
9880
  */
8735
- 201: Array<PriceResponseDto>;
8736
- };
8737
- };
8738
- };
8739
- '/api/v1/{region}/reporting/portfolio/trends': {
8740
- get: {
8741
- req: ReportingControllerGetPortfolioTrendsData;
8742
- res: {
9881
+ 200: CashFlowResponseDto;
8743
9882
  /**
8744
- * Trends retrieved successfully
9883
+ * Invalid period format
8745
9884
  */
8746
- 200: PortfolioTrendsResponseDto;
9885
+ 400: unknown;
8747
9886
  /**
8748
9887
  * User not authenticated
8749
9888
  */
@@ -8751,16 +9890,16 @@ export type $OpenApiTs = {
8751
9890
  };
8752
9891
  };
8753
9892
  };
8754
- '/api/v1/{region}/reporting/snapshots/generate': {
8755
- post: {
8756
- req: ReportingControllerGenerateSnapshotData;
9893
+ '/api/v1/{region}/dashboard/expenses': {
9894
+ get: {
9895
+ req: DashboardControllerGetExpensesData;
8757
9896
  res: {
8758
9897
  /**
8759
- * Snapshot generated successfully
9898
+ * Expenses retrieved successfully
8760
9899
  */
8761
- 200: GenerateSnapshotResponse;
9900
+ 200: ExpensesByCategoryResponseDto;
8762
9901
  /**
8763
- * Invalid date format
9902
+ * Invalid groupBy or period
8764
9903
  */
8765
9904
  400: unknown;
8766
9905
  /**
@@ -8770,26 +9909,22 @@ export type $OpenApiTs = {
8770
9909
  };
8771
9910
  };
8772
9911
  };
8773
- '/api/v1/{region}/reporting/snapshots/backfill': {
8774
- post: {
8775
- req: ReportingControllerBackfillSnapshotsData;
9912
+ '/api/v1/{region}/investment/holdings/pnl': {
9913
+ get: {
9914
+ req: HoldingPnlControllerGetHoldingPnlData;
8776
9915
  res: {
8777
9916
  /**
8778
- * Backfill completed successfully
9917
+ * Holding P&L retrieved successfully
8779
9918
  */
8780
- 200: BackfillSnapshotsResponse;
9919
+ 200: HoldingPnlResponseDto;
8781
9920
  /**
8782
- * Invalid date format or range
9921
+ * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
8783
9922
  */
8784
9923
  400: unknown;
8785
9924
  /**
8786
9925
  * User not authenticated
8787
9926
  */
8788
9927
  401: unknown;
8789
- /**
8790
- * Backfill already in progress for this user
8791
- */
8792
- 409: unknown;
8793
9928
  };
8794
9929
  };
8795
9930
  };
@@ -8814,7 +9949,7 @@ export type $OpenApiTs = {
8814
9949
  /**
8815
9950
  * Login successful
8816
9951
  */
8817
- 200: unknown;
9952
+ 200: AnonymousLoginResponseDto;
8818
9953
  /**
8819
9954
  * Invalid access token
8820
9955
  */
@@ -8961,4 +10096,30 @@ export type $OpenApiTs = {
8961
10096
  };
8962
10097
  };
8963
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
+ };
8964
10125
  };