@firela/api-types 0.0.0-canary.45a6cc23 → 0.0.0-canary.4cf7f99a

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,511 +2775,705 @@ 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
2617
- */
2618
- description?: string;
2619
- /**
2620
- * Keywords to match in transaction narration
2621
- */
2622
- narrationKeywords: Array<string>;
2623
- /**
2624
- * Keywords to match in payee name
2828
+ * Total change over period
2625
2829
  */
2626
- payeeKeywords: Array<string>;
2830
+ totalChange: string;
2627
2831
  /**
2628
- * Keywords to match in category
2832
+ * Total change percentage
2629
2833
  */
2630
- categoryKeywords: Array<string>;
2834
+ totalChangePercentage: string;
2835
+ };
2836
+
2837
+ export type MultiCurrencyPointDto = {
2631
2838
  /**
2632
- * Keywords to match in payment method
2839
+ * Date in YYYY-MM-DD format
2633
2840
  */
2634
- methodKeywords: Array<string>;
2841
+ date: string;
2635
2842
  /**
2636
- * Destination account for categorization
2843
+ * Balances by currency
2637
2844
  */
2638
- categoryAccount?: string;
2845
+ byCurrency: Array<CurrencyBalanceDto>;
2846
+ };
2847
+
2848
+ export type PortfolioTrendsResponseDto = {
2639
2849
  /**
2640
- * Keyword matching logic
2850
+ * Time series data points
2641
2851
  */
2642
- matchLogic: 'OR' | 'AND';
2852
+ series: Array<TimeSeriesPointDto>;
2643
2853
  /**
2644
- * Amount range for matching
2854
+ * Period summary
2645
2855
  */
2646
- amountRange?: AmountRangeDto;
2856
+ summary: TrendSummaryDto;
2647
2857
  /**
2648
- * Rule priority (0-1000, higher = first match)
2858
+ * Period requested
2649
2859
  */
2650
- priority: number;
2860
+ period: string;
2651
2861
  /**
2652
- * Whether the rule is enabled
2862
+ * Data granularity
2653
2863
  */
2654
- enabled: boolean;
2864
+ granularity: string;
2655
2865
  /**
2656
- * Learning source: NLP, REVIEW_CENTER, or null for manual
2866
+ * Base currency for converted values
2657
2867
  */
2658
- learningSource?: 'NLP' | 'REVIEW_CENTER' | null;
2868
+ currency: string;
2659
2869
  /**
2660
- * Whether auto-apply is enabled for this rule
2870
+ * Multi-currency time series (each point has currency breakdown)
2661
2871
  */
2662
- autoApplyEnabled: boolean;
2872
+ byCurrency?: Array<MultiCurrencyPointDto>;
2663
2873
  /**
2664
- * Number of confirmations for NLP-learned rules
2874
+ * Exchange rate warnings
2665
2875
  */
2666
- confirmationCount: number;
2876
+ warnings?: Array<ExchangeRateWarningDto>;
2877
+ };
2878
+
2879
+ export type CashFlowPointDto = {
2667
2880
  /**
2668
- * Additional tags
2881
+ * Month key (YYYY-MM)
2669
2882
  */
2670
- additionalTags: Array<string>;
2883
+ month: string;
2671
2884
  /**
2672
- * Additional metadata
2885
+ * Income in base currency (absolute, converted)
2673
2886
  */
2674
- additionalMetadata?: {
2675
- [key: string]: string;
2676
- };
2887
+ income: string;
2677
2888
  /**
2678
- * Created timestamp
2889
+ * Expense in base currency (absolute, converted)
2679
2890
  */
2680
- createdAt: string;
2891
+ expense: string;
2681
2892
  /**
2682
- * Updated timestamp
2893
+ * netSavings = income − expense (savings positive)
2683
2894
  */
2684
- updatedAt: string;
2895
+ netSavings: string;
2685
2896
  };
2686
2897
 
2687
- /**
2688
- * Learning source: NLP, REVIEW_CENTER, or null for manual
2689
- */
2690
- export type learningSource = 'NLP' | 'REVIEW_CENTER';
2691
-
2692
- export type TransactionRuleListResponseDto = {
2693
- data: Array<TransactionRuleResponseDto>;
2898
+ export type CashFlowTrendSummaryDto = {
2694
2899
  /**
2695
- * Total count of rules
2900
+ * Total income across the period
2696
2901
  */
2697
- total: number;
2902
+ totalIncome: string;
2698
2903
  /**
2699
- * Results per page
2904
+ * Total expense across the period
2700
2905
  */
2701
- limit: number;
2906
+ totalExpense: string;
2702
2907
  /**
2703
- * Pagination offset
2908
+ * income − expense across the period
2704
2909
  */
2705
- offset: number;
2910
+ totalNetSavings: string;
2911
+ /**
2912
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
2913
+ */
2914
+ averageMonthlyNetSavings: string;
2706
2915
  };
2707
2916
 
2708
- export type ValidateRuleDto = {
2709
- name: string;
2710
- description?: string;
2711
- narrationKeywords?: Array<unknown[]>;
2712
- payeeKeywords?: Array<unknown[]>;
2713
- categoryKeywords?: Array<unknown[]>;
2917
+ export type CashFlowTrendsResponseDto = {
2714
2918
  /**
2715
- * Payment method keywords (e.g., HuaBei, YuEBao)
2919
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
2716
2920
  */
2717
- methodKeywords?: Array<unknown[]>;
2921
+ series: Array<CashFlowPointDto>;
2718
2922
  /**
2719
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2923
+ * Period totals
2720
2924
  */
2721
- categoryAccount?: string;
2722
- matchLogic: 'OR' | 'AND';
2925
+ summary: CashFlowTrendSummaryDto;
2723
2926
  /**
2724
- * Minimum transaction amount (inclusive)
2927
+ * Period requested
2725
2928
  */
2726
- amountMin?: number;
2929
+ period: string;
2727
2930
  /**
2728
- * Maximum transaction amount (inclusive)
2931
+ * Data granularity (v1 returns month buckets)
2729
2932
  */
2730
- amountMax?: number;
2731
- priority: number;
2732
- additionalTags?: Array<unknown[]>;
2733
- additionalMetadata?: {
2734
- [key: string]: unknown;
2735
- };
2933
+ granularity: string;
2736
2934
  /**
2737
- * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
2935
+ * Base currency for converted values
2738
2936
  */
2739
- upsertByPayee?: boolean;
2740
- };
2741
-
2742
- export type ValidateRuleResponseDto = {
2937
+ currency: string;
2743
2938
  /**
2744
- * Whether the rule configuration is valid
2939
+ * Exchange rate warnings (e.g. missing rate for a currency)
2745
2940
  */
2746
- valid: boolean;
2941
+ warnings?: Array<ExchangeRateWarningDto>;
2942
+ };
2943
+
2944
+ export type GenerateSnapshotBody = unknown;
2945
+
2946
+ export type GenerateSnapshotResponse = unknown;
2947
+
2948
+ export type BackfillSnapshotsBody = unknown;
2949
+
2950
+ export type BackfillSnapshotsResponse = unknown;
2951
+
2952
+ export type DeleteOwnUserDto = {
2747
2953
  /**
2748
- * List of validation errors (empty if valid)
2954
+ * Access token for user verification
2749
2955
  */
2750
- errors: Array<unknown[]>;
2956
+ accessToken: string;
2957
+ };
2958
+
2959
+ export type SignupDto = {
2751
2960
  /**
2752
- * List of validation warnings (non-blocking issues)
2961
+ * Cloudflare Turnstile verification token (optional when Turnstile disabled)
2753
2962
  */
2754
- warnings: Array<unknown[]>;
2963
+ turnstileToken?: string;
2755
2964
  };
2756
2965
 
2757
- export type BulkCreateRulesDto = {
2966
+ export type SignupResponseDto = {
2758
2967
  /**
2759
- * Array of rules to import
2968
+ * JWT auth token
2760
2969
  */
2761
- rules: Array<unknown[]>;
2970
+ authToken: string;
2762
2971
  /**
2763
- * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
2972
+ * Auto-generated access token
2764
2973
  */
2765
- conflictStrategy: 'replace' | 'skip';
2974
+ accessToken: string;
2975
+ /**
2976
+ * Assigned user role
2977
+ */
2978
+ role: 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2766
2979
  };
2767
2980
 
2768
2981
  /**
2769
- * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
2982
+ * Assigned user role
2770
2983
  */
2771
- export type conflictStrategy = 'replace' | 'skip';
2984
+ export type role = 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2772
2985
 
2773
- export type BulkCreateRulesResponseDto = {
2986
+ export type UpdateUserSettingDto = {
2774
2987
  /**
2775
- * Number of successfully created rules
2988
+ * Security ID
2776
2989
  */
2777
- successCount: number;
2990
+ secId?: number;
2778
2991
  /**
2779
- * Number of failed rules
2992
+ * Annual interest rate
2780
2993
  */
2781
- failureCount: number;
2994
+ annualInterestRate?: number;
2782
2995
  /**
2783
- * Error details for failed rules
2996
+ * Currency code
2784
2997
  */
2785
- errors: Array<{
2786
- index?: number;
2787
- message?: string;
2788
- }>;
2998
+ currency?: string;
2789
2999
  /**
2790
- * IDs of successfully created rules
3000
+ * Base currency code
2791
3001
  */
2792
- createdRuleIds: Array<string>;
2793
- };
2794
-
2795
- export type ExportRulesResponseDto = {
3002
+ baseCurrency?: string;
2796
3003
  /**
2797
- * Export timestamp
3004
+ * Benchmark symbol
2798
3005
  */
2799
- exportedAt: string;
3006
+ benchmark?: string;
2800
3007
  /**
2801
- * User ID
3008
+ * Color scheme
2802
3009
  */
2803
- userId: string;
3010
+ colorScheme?: 'DARK' | 'LIGHT';
2804
3011
  /**
2805
- * Number of exported rules
3012
+ * Date range filter
2806
3013
  */
2807
- ruleCount: number;
3014
+ dateRange?: string;
2808
3015
  /**
2809
- * Exported rules
3016
+ * Emergency fund amount
2810
3017
  */
2811
- rules: unknown[];
2812
- };
2813
-
2814
- export type RuleStatisticsResponseDto = {
3018
+ emergencyFund?: number;
2815
3019
  /**
2816
- * Statistics time period
3020
+ * Account filter IDs
2817
3021
  */
2818
- period: '7d' | '30d' | '90d';
3022
+ 'filters.accounts'?: Array<string>;
2819
3023
  /**
2820
- * Total number of rules
3024
+ * Asset class filters
2821
3025
  */
2822
- totalRules: number;
3026
+ 'filters.assetClasses'?: Array<string>;
2823
3027
  /**
2824
- * Number of rules with at least one match
3028
+ * Data source filter
2825
3029
  */
2826
- rulesWithMatches: number;
3030
+ 'filters.dataSource'?: string;
2827
3031
  /**
2828
- * Total number of matches across all rules
3032
+ * Symbol filter
2829
3033
  */
2830
- totalMatches: number;
3034
+ 'filters.symbol'?: string;
2831
3035
  /**
2832
- * Average confidence score across all matches
3036
+ * Tag filters
2833
3037
  */
2834
- averageConfidence: number;
3038
+ 'filters.tags'?: Array<string>;
2835
3039
  /**
2836
- * Per-rule statistics
3040
+ * Enable experimental features
2837
3041
  */
2838
- ruleStats: Array<{
2839
- ruleId?: string;
2840
- ruleName?: string;
2841
- matchCount?: number;
2842
- averageConfidence?: number;
2843
- }>;
2844
- };
2845
-
2846
- /**
2847
- * Statistics time period
2848
- */
2849
- export type period = '7d' | '30d' | '90d';
2850
-
2851
- export type UpdateTransactionRuleDto = {
2852
- name?: string;
2853
- description?: string;
2854
- narrationKeywords?: Array<unknown[]>;
2855
- payeeKeywords?: Array<unknown[]>;
2856
- categoryKeywords?: Array<unknown[]>;
3042
+ isExperimentalFeatures?: boolean;
2857
3043
  /**
2858
- * Payment method keywords (e.g., HuaBei, YuEBao)
3044
+ * Enable restricted view mode
2859
3045
  */
2860
- methodKeywords?: Array<unknown[]>;
3046
+ isRestrictedView?: boolean;
2861
3047
  /**
2862
- * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
3048
+ * Language code
2863
3049
  */
2864
- categoryAccount?: string;
2865
- matchLogic?: 'OR' | 'AND';
3050
+ language?: string;
2866
3051
  /**
2867
- * Minimum transaction amount (inclusive)
3052
+ * Locale code
2868
3053
  */
2869
- amountMin?: number;
3054
+ locale?: string;
2870
3055
  /**
2871
- * Maximum transaction amount (inclusive)
3056
+ * Projected total amount
2872
3057
  */
2873
- amountMax?: number;
2874
- priority?: number;
3058
+ projectedTotalAmount?: number;
2875
3059
  /**
2876
- * Enable or disable the rule
3060
+ * Retirement date in ISO 8601 format
2877
3061
  */
2878
- enabled?: boolean;
2879
- additionalTags?: Array<unknown[]>;
2880
- additionalMetadata?: {
2881
- [key: string]: unknown;
2882
- };
3062
+ retirementDate?: string;
3063
+ /**
3064
+ * Savings rate percentage
3065
+ */
3066
+ savingsRate?: number;
3067
+ /**
3068
+ * View mode
3069
+ */
3070
+ viewMode?: 'DEFAULT' | 'ZEN';
2883
3071
  };
2884
3072
 
2885
- export type TestRuleDto = {
2886
- narration: string;
2887
- payee?: string;
2888
- categoryAccount?: string;
2889
- amount?: number;
2890
- currency?: string;
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;
2891
3088
  };
2892
3089
 
2893
- export type TestRuleResponseDto = {
3090
+ export type CreateTransactionRuleDto = {
3091
+ name: string;
3092
+ description?: string;
3093
+ narrationKeywords?: Array<unknown[]>;
3094
+ payeeKeywords?: Array<unknown[]>;
3095
+ categoryKeywords?: Array<unknown[]>;
2894
3096
  /**
2895
- * Rule ID that was tested
3097
+ * Payment method keywords (e.g., HuaBei, YuEBao)
2896
3098
  */
2897
- ruleId: string;
3099
+ methodKeywords?: Array<unknown[]>;
2898
3100
  /**
2899
- * Whether the rule matched the test data
3101
+ * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
2900
3102
  */
2901
- matches: boolean;
3103
+ categoryAccount?: string;
3104
+ matchLogic: 'OR' | 'AND';
2902
3105
  /**
2903
- * Match confidence score (0-1)
3106
+ * Minimum transaction amount (inclusive)
2904
3107
  */
2905
- confidence: number;
3108
+ amountMin?: number;
2906
3109
  /**
2907
- * Details of which fields matched
3110
+ * Maximum transaction amount (inclusive)
2908
3111
  */
2909
- matchDetails: {
3112
+ amountMax?: number;
3113
+ priority: number;
3114
+ additionalTags?: Array<unknown[]>;
3115
+ additionalMetadata?: {
2910
3116
  [key: string]: unknown;
2911
3117
  };
2912
- };
2913
-
2914
- export type DeleteOwnUserDto = {
2915
3118
  /**
2916
- * Access token for user verification
3119
+ * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
2917
3120
  */
2918
- accessToken: string;
3121
+ upsertByPayee?: boolean;
2919
3122
  };
2920
3123
 
2921
- export type SignupDto = {
2922
- /**
2923
- * Cloudflare Turnstile verification token (optional when Turnstile disabled)
2924
- */
2925
- turnstileToken?: string;
2926
- };
3124
+ export type matchLogic = 'OR' | 'AND';
2927
3125
 
2928
- export type UpdateUserSettingDto = {
3126
+ export type AmountRangeDto = {
2929
3127
  /**
2930
- * Security ID
3128
+ * Minimum amount
2931
3129
  */
2932
- secId?: number;
3130
+ min?: number;
2933
3131
  /**
2934
- * Annual interest rate
3132
+ * Maximum amount
2935
3133
  */
2936
- annualInterestRate?: number;
3134
+ max?: number;
3135
+ };
3136
+
3137
+ export type TransactionRuleResponseDto = {
2937
3138
  /**
2938
- * Currency code
3139
+ * Rule ID
2939
3140
  */
2940
- currency?: string;
3141
+ id: string;
2941
3142
  /**
2942
- * Base currency code
3143
+ * Rule name
2943
3144
  */
2944
- baseCurrency?: string;
3145
+ name: string;
2945
3146
  /**
2946
- * Benchmark symbol
3147
+ * Rule description
2947
3148
  */
2948
- benchmark?: string;
3149
+ description?: string;
2949
3150
  /**
2950
- * Color scheme
3151
+ * Keywords to match in transaction narration
2951
3152
  */
2952
- colorScheme?: 'DARK' | 'LIGHT';
3153
+ narrationKeywords: Array<string>;
2953
3154
  /**
2954
- * Date range filter
3155
+ * Keywords to match in payee name
2955
3156
  */
2956
- dateRange?: string;
3157
+ payeeKeywords: Array<string>;
2957
3158
  /**
2958
- * Emergency fund amount
3159
+ * Keywords to match in category
2959
3160
  */
2960
- emergencyFund?: number;
3161
+ categoryKeywords: Array<string>;
2961
3162
  /**
2962
- * Account filter IDs
3163
+ * Keywords to match in payment method
2963
3164
  */
2964
- 'filters.accounts'?: Array<string>;
3165
+ methodKeywords: Array<string>;
2965
3166
  /**
2966
- * Asset class filters
3167
+ * Destination account for categorization
2967
3168
  */
2968
- 'filters.assetClasses'?: Array<string>;
3169
+ categoryAccount?: string;
2969
3170
  /**
2970
- * Data source filter
3171
+ * Keyword matching logic
2971
3172
  */
2972
- 'filters.dataSource'?: string;
3173
+ matchLogic: 'OR' | 'AND';
2973
3174
  /**
2974
- * Symbol filter
3175
+ * Amount range for matching
2975
3176
  */
2976
- 'filters.symbol'?: string;
3177
+ amountRange?: AmountRangeDto;
2977
3178
  /**
2978
- * Tag filters
3179
+ * Rule priority (0-1000, higher = first match)
2979
3180
  */
2980
- 'filters.tags'?: Array<string>;
3181
+ priority: number;
2981
3182
  /**
2982
- * Enable experimental features
3183
+ * Whether the rule is enabled
2983
3184
  */
2984
- isExperimentalFeatures?: boolean;
3185
+ enabled: boolean;
2985
3186
  /**
2986
- * Enable restricted view mode
3187
+ * Learning source: NLP, REVIEW_CENTER, or null for manual
2987
3188
  */
2988
- isRestrictedView?: boolean;
3189
+ learningSource?: 'NLP' | 'REVIEW_CENTER' | null;
2989
3190
  /**
2990
- * Language code
3191
+ * Whether auto-apply is enabled for this rule
2991
3192
  */
2992
- language?: string;
3193
+ autoApplyEnabled: boolean;
2993
3194
  /**
2994
- * Locale code
3195
+ * Number of confirmations for NLP-learned rules
2995
3196
  */
2996
- locale?: string;
3197
+ confirmationCount: number;
2997
3198
  /**
2998
- * Projected total amount
3199
+ * Additional tags
2999
3200
  */
3000
- projectedTotalAmount?: number;
3201
+ additionalTags: Array<string>;
3001
3202
  /**
3002
- * Retirement date in ISO 8601 format
3203
+ * Additional metadata
3003
3204
  */
3004
- retirementDate?: string;
3205
+ additionalMetadata?: {
3206
+ [key: string]: string;
3207
+ };
3005
3208
  /**
3006
- * Savings rate percentage
3209
+ * Created timestamp
3007
3210
  */
3008
- savingsRate?: number;
3211
+ createdAt: string;
3009
3212
  /**
3010
- * View mode
3213
+ * Updated timestamp
3011
3214
  */
3012
- viewMode?: 'DEFAULT' | 'ZEN';
3215
+ updatedAt: string;
3013
3216
  };
3014
3217
 
3015
3218
  /**
3016
- * Color scheme
3017
- */
3018
- export type colorScheme = 'DARK' | 'LIGHT';
3019
-
3020
- /**
3021
- * View mode
3219
+ * Learning source: NLP, REVIEW_CENTER, or null for manual
3022
3220
  */
3023
- export type viewMode = 'DEFAULT' | 'ZEN';
3221
+ export type learningSource = 'NLP' | 'REVIEW_CENTER';
3024
3222
 
3025
- export type UpdatePropertyDto = {
3223
+ export type TransactionRuleListResponseDto = {
3224
+ data: Array<TransactionRuleResponseDto>;
3026
3225
  /**
3027
- * Property value
3226
+ * Total count of rules
3028
3227
  */
3029
- value: string;
3228
+ total: number;
3229
+ /**
3230
+ * Results per page
3231
+ */
3232
+ limit: number;
3233
+ /**
3234
+ * Pagination offset
3235
+ */
3236
+ offset: number;
3030
3237
  };
3031
3238
 
3032
- export type CreateBeanEventDto = {
3239
+ export type ValidateRuleDto = {
3240
+ name: string;
3241
+ description?: string;
3242
+ narrationKeywords?: Array<unknown[]>;
3243
+ payeeKeywords?: Array<unknown[]>;
3244
+ categoryKeywords?: Array<unknown[]>;
3033
3245
  /**
3034
- * Life event date (ISO 8601)
3246
+ * Payment method keywords (e.g., HuaBei, YuEBao)
3035
3247
  */
3036
- date: string;
3248
+ methodKeywords?: Array<unknown[]>;
3037
3249
  /**
3038
- * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3250
+ * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
3039
3251
  */
3040
- type: string;
3252
+ categoryAccount?: string;
3253
+ matchLogic: 'OR' | 'AND';
3041
3254
  /**
3042
- * Life event description. Empty string is a VALID value (distinct from absence).
3255
+ * Minimum transaction amount (inclusive)
3043
3256
  */
3044
- description: string;
3257
+ amountMin?: number;
3045
3258
  /**
3046
- * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3259
+ * Maximum transaction amount (inclusive)
3047
3260
  */
3048
- meta?: {
3261
+ amountMax?: number;
3262
+ priority: number;
3263
+ additionalTags?: Array<unknown[]>;
3264
+ additionalMetadata?: {
3049
3265
  [key: string]: unknown;
3050
3266
  };
3267
+ /**
3268
+ * If true, update existing rule with matching payeeKeywords[0] instead of creating new rule
3269
+ */
3270
+ upsertByPayee?: boolean;
3051
3271
  };
3052
3272
 
3053
- export type EventResponseDto = {
3273
+ export type ValidateRuleResponseDto = {
3054
3274
  /**
3055
- * Unique identifier
3275
+ * Whether the rule configuration is valid
3056
3276
  */
3057
- id: string;
3277
+ valid: boolean;
3058
3278
  /**
3059
- * User ID (owner of the life event)
3279
+ * List of validation errors (empty if valid)
3060
3280
  */
3061
- userId: string;
3281
+ errors: Array<unknown[]>;
3062
3282
  /**
3063
- * Life event date (ISO 8601 format)
3283
+ * List of validation warnings (non-blocking issues)
3284
+ */
3285
+ warnings: Array<unknown[]>;
3286
+ };
3287
+
3288
+ export type BulkCreateRulesDto = {
3289
+ /**
3290
+ * Array of rules to import
3291
+ */
3292
+ rules: Array<unknown[]>;
3293
+ /**
3294
+ * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
3295
+ */
3296
+ conflictStrategy: 'replace' | 'skip';
3297
+ };
3298
+
3299
+ /**
3300
+ * Conflict handling strategy: skip (default) ignores duplicates, replace soft-deletes existing rule
3301
+ */
3302
+ export type conflictStrategy = 'replace' | 'skip';
3303
+
3304
+ export type BulkCreateRulesResponseDto = {
3305
+ /**
3306
+ * Number of successfully created rules
3307
+ */
3308
+ successCount: number;
3309
+ /**
3310
+ * Number of failed rules
3311
+ */
3312
+ failureCount: number;
3313
+ /**
3314
+ * Error details for failed rules
3315
+ */
3316
+ errors: Array<{
3317
+ index?: number;
3318
+ message?: string;
3319
+ }>;
3320
+ /**
3321
+ * IDs of successfully created rules
3322
+ */
3323
+ createdRuleIds: Array<string>;
3324
+ };
3325
+
3326
+ export type ExportRulesResponseDto = {
3327
+ /**
3328
+ * Export timestamp
3329
+ */
3330
+ exportedAt: string;
3331
+ /**
3332
+ * User ID
3333
+ */
3334
+ userId: string;
3335
+ /**
3336
+ * Number of exported rules
3337
+ */
3338
+ ruleCount: number;
3339
+ /**
3340
+ * Exported rules
3341
+ */
3342
+ rules: unknown[];
3343
+ };
3344
+
3345
+ export type RuleStatisticsResponseDto = {
3346
+ /**
3347
+ * Statistics time period
3348
+ */
3349
+ period: '7d' | '30d' | '90d';
3350
+ /**
3351
+ * Total number of rules
3352
+ */
3353
+ totalRules: number;
3354
+ /**
3355
+ * Number of rules with at least one match
3356
+ */
3357
+ rulesWithMatches: number;
3358
+ /**
3359
+ * Total number of matches across all rules
3360
+ */
3361
+ totalMatches: number;
3362
+ /**
3363
+ * Average confidence score across all matches
3364
+ */
3365
+ averageConfidence: number;
3366
+ /**
3367
+ * Per-rule statistics
3368
+ */
3369
+ ruleStats: Array<{
3370
+ ruleId?: string;
3371
+ ruleName?: string;
3372
+ matchCount?: number;
3373
+ averageConfidence?: number;
3374
+ }>;
3375
+ };
3376
+
3377
+ /**
3378
+ * Statistics time period
3379
+ */
3380
+ export type period = '7d' | '30d' | '90d';
3381
+
3382
+ export type UpdateTransactionRuleDto = {
3383
+ name?: string;
3384
+ description?: string;
3385
+ narrationKeywords?: Array<unknown[]>;
3386
+ payeeKeywords?: Array<unknown[]>;
3387
+ categoryKeywords?: Array<unknown[]>;
3388
+ /**
3389
+ * Payment method keywords (e.g., HuaBei, YuEBao)
3390
+ */
3391
+ methodKeywords?: Array<unknown[]>;
3392
+ /**
3393
+ * Destination account for expenses/income (e.g., Expenses:Food:Coffee)
3394
+ */
3395
+ categoryAccount?: string;
3396
+ matchLogic?: 'OR' | 'AND';
3397
+ /**
3398
+ * Minimum transaction amount (inclusive)
3399
+ */
3400
+ amountMin?: number;
3401
+ /**
3402
+ * Maximum transaction amount (inclusive)
3403
+ */
3404
+ amountMax?: number;
3405
+ priority?: number;
3406
+ /**
3407
+ * Enable or disable the rule
3408
+ */
3409
+ enabled?: boolean;
3410
+ additionalTags?: Array<unknown[]>;
3411
+ additionalMetadata?: {
3412
+ [key: string]: unknown;
3413
+ };
3414
+ };
3415
+
3416
+ export type TestRuleDto = {
3417
+ narration: string;
3418
+ payee?: string;
3419
+ categoryAccount?: string;
3420
+ amount?: number;
3421
+ currency?: string;
3422
+ };
3423
+
3424
+ export type TestRuleResponseDto = {
3425
+ /**
3426
+ * Rule ID that was tested
3427
+ */
3428
+ ruleId: string;
3429
+ /**
3430
+ * Whether the rule matched the test data
3431
+ */
3432
+ matches: boolean;
3433
+ /**
3434
+ * Match confidence score (0-1)
3435
+ */
3436
+ confidence: number;
3437
+ /**
3438
+ * Details of which fields matched
3439
+ */
3440
+ matchDetails: {
3441
+ [key: string]: unknown;
3442
+ };
3443
+ };
3444
+
3445
+ export type CreateBeanEventDto = {
3446
+ /**
3447
+ * Life event date (ISO 8601)
3448
+ */
3449
+ date: string;
3450
+ /**
3451
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3452
+ */
3453
+ type: string;
3454
+ /**
3455
+ * Life event description. Empty string is a VALID value (distinct from absence).
3456
+ */
3457
+ description: string;
3458
+ /**
3459
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3460
+ */
3461
+ meta?: {
3462
+ [key: string]: unknown;
3463
+ };
3464
+ };
3465
+
3466
+ export type EventResponseDto = {
3467
+ /**
3468
+ * Unique identifier
3469
+ */
3470
+ id: string;
3471
+ /**
3472
+ * User ID (owner of the life event)
3473
+ */
3474
+ userId: string;
3475
+ /**
3476
+ * Life event date (ISO 8601 format)
3064
3477
  */
3065
3478
  date: string;
3066
3479
  /**
@@ -3119,81 +3532,235 @@ export type UpdateBeanEventDto = {
3119
3532
  };
3120
3533
  };
3121
3534
 
3122
- export type FileImportDto = {
3535
+ export type OnboardingAccountDto = {
3123
3536
  /**
3124
- * Bill file to import (CSV, PDF, OFX, etc.)
3537
+ * Account path (Assets/Liabilities only; format validated by the account service)
3125
3538
  */
3126
- file: Blob | File;
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;
3127
3552
  };
3128
3553
 
3129
- export type ImportErrorDto = {
3554
+ export type OnboardingDto = {
3130
3555
  /**
3131
- * Index of failed transaction in the file
3556
+ * Asset/Liability accounts to register with opening balances
3132
3557
  */
3133
- index: number;
3558
+ accounts?: Array<OnboardingAccountDto>;
3134
3559
  /**
3135
- * Error message
3560
+ * Skip asset registration; only bootstrap the core account set
3136
3561
  */
3137
- error: string;
3562
+ skipAssetRegistration?: boolean;
3138
3563
  };
3139
3564
 
3140
- export type ReviewItemPreviewDto = {
3565
+ export type ActualBalanceDto = {
3141
3566
  /**
3142
- * Index in the import batch (for tracking)
3567
+ * Actual balance amount as a decimal string (preserves precision for tolerance inference).
3143
3568
  */
3144
- index: number;
3569
+ amount: string;
3145
3570
  /**
3146
- * Transaction date (ISO format)
3571
+ * Currency code (ISO 4217 or commodity ticker).
3147
3572
  */
3148
- date: string;
3573
+ ccy: string;
3574
+ };
3575
+
3576
+ export type ComputeReconciliationDto = {
3149
3577
  /**
3150
- * Transaction amount (absolute value)
3578
+ * BeanAccount id to reconcile.
3151
3579
  */
3152
- amount?: number;
3580
+ accountId: string;
3153
3581
  /**
3154
- * Currency code
3582
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3155
3583
  */
3156
- currency?: string;
3584
+ asOfDate: string;
3157
3585
  /**
3158
- * Transaction narration/description
3586
+ * Actual balance from the external statement.
3159
3587
  */
3160
- narration: string;
3588
+ actualBalance: ActualBalanceDto;
3589
+ };
3590
+
3591
+ export type ReconciliationComputeResultDto = {
3592
+ accountId: string;
3593
+ asOfDate: string;
3161
3594
  /**
3162
- * Payee name
3595
+ * System-computed book balance (decimal string).
3163
3596
  */
3164
- payee?: string;
3597
+ bookBalance: string;
3165
3598
  /**
3166
- * Inferred category from rule matching
3599
+ * User-entered actual balance (decimal string).
3167
3600
  */
3168
- category?: string;
3601
+ actualBalance: string;
3602
+ currency: string;
3169
3603
  /**
3170
- * Confidence score for the match (0-1)
3604
+ * Diff = book − actual (decimal string).
3171
3605
  */
3172
- confidence?: number;
3606
+ diff: string;
3173
3607
  /**
3174
- * Type of branch requiring review
3608
+ * Applied tolerance (decimal string).
3175
3609
  */
3176
- branchType?:
3177
- | 'DUPLICATE'
3178
- | 'PAYEE_MATCH'
3179
- | 'RULE_MATCH'
3180
- | 'ACCOUNT_VALIDATION'
3181
- | 'PIPELINE_ERROR';
3610
+ tolerance: string;
3182
3611
  /**
3183
- * Human-readable reasons for requiring review
3612
+ * true when |diff| ≤ tolerance.
3184
3613
  */
3185
- reasons?: Array<string>;
3614
+ withinTolerance: boolean;
3615
+ /**
3616
+ * Suggested next action: assert when within tolerance, pad otherwise.
3617
+ */
3618
+ suggestedAction: 'assert' | 'pad';
3186
3619
  };
3187
3620
 
3188
3621
  /**
3189
- * Type of branch requiring review
3622
+ * Suggested next action: assert when within tolerance, pad otherwise.
3190
3623
  */
3191
- export type branchType =
3192
- | 'DUPLICATE'
3193
- | 'PAYEE_MATCH'
3194
- | 'RULE_MATCH'
3195
- | 'ACCOUNT_VALIDATION'
3196
- | 'PIPELINE_ERROR';
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
+
3689
+ export type FileImportDto = {
3690
+ /**
3691
+ * Bill file to import (CSV, PDF, OFX, etc.)
3692
+ */
3693
+ file: Blob | File;
3694
+ };
3695
+
3696
+ export type ImportErrorDto = {
3697
+ /**
3698
+ * Index of failed transaction in the file
3699
+ */
3700
+ index: number;
3701
+ /**
3702
+ * Error message
3703
+ */
3704
+ error: string;
3705
+ };
3706
+
3707
+ export type ReviewItemPreviewDto = {
3708
+ /**
3709
+ * Index in the import batch (for tracking)
3710
+ */
3711
+ index: number;
3712
+ /**
3713
+ * Transaction date (ISO format)
3714
+ */
3715
+ date: string;
3716
+ /**
3717
+ * Transaction amount (absolute value)
3718
+ */
3719
+ amount?: number;
3720
+ /**
3721
+ * Currency code
3722
+ */
3723
+ currency?: string;
3724
+ /**
3725
+ * Transaction narration/description
3726
+ */
3727
+ narration: string;
3728
+ /**
3729
+ * Payee name
3730
+ */
3731
+ payee?: string;
3732
+ /**
3733
+ * Inferred category from rule matching
3734
+ */
3735
+ category?: string;
3736
+ /**
3737
+ * Confidence score for the match (0-1)
3738
+ */
3739
+ confidence?: number;
3740
+ /**
3741
+ * Type of branch requiring review
3742
+ */
3743
+ branchType?:
3744
+ | 'DUPLICATE'
3745
+ | 'PAYEE_MATCH'
3746
+ | 'RULE_MATCH'
3747
+ | 'ACCOUNT_VALIDATION'
3748
+ | 'PIPELINE_ERROR';
3749
+ /**
3750
+ * Human-readable reasons for requiring review
3751
+ */
3752
+ reasons?: Array<string>;
3753
+ };
3754
+
3755
+ /**
3756
+ * Type of branch requiring review
3757
+ */
3758
+ export type branchType =
3759
+ | 'DUPLICATE'
3760
+ | 'PAYEE_MATCH'
3761
+ | 'RULE_MATCH'
3762
+ | 'ACCOUNT_VALIDATION'
3763
+ | 'PIPELINE_ERROR';
3197
3764
 
3198
3765
  export type ImportResultDto = {
3199
3766
  /**
@@ -3417,94 +3984,6 @@ export type UpdateImporterConfigDto = {
3417
3984
  data?: UpdateConfigDataDto;
3418
3985
  };
3419
3986
 
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;
3502
- /**
3503
- * Whether the platform is active
3504
- */
3505
- isActive?: boolean;
3506
- };
3507
-
3508
3987
  export type ProviderSyncConfigDto = {
3509
3988
  /**
3510
3989
  * Source account for the first posting
@@ -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
  */
@@ -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
  */
@@ -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,22 +4708,208 @@ 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;
4172
- };
4173
-
4174
- export type NetWorthByCurrencyDto = {
4719
+ name: string;
4175
4720
  /**
4176
- * Net worth by currency
4721
+ * Platform URL
4177
4722
  */
4178
- netWorth: Array<BalanceByCurrencyDto>;
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;
4906
+ };
4907
+
4908
+ export type NetWorthByCurrencyDto = {
4909
+ /**
4910
+ * Net worth by currency
4911
+ */
4912
+ netWorth: Array<BalanceByCurrencyDto>;
4179
4913
  /**
4180
4914
  * Assets by currency
4181
4915
  */
@@ -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)
@@ -4290,6 +5009,10 @@ export type AccountItemDto = {
4290
5009
  * Currency code
4291
5010
  */
4292
5011
  currency: string;
5012
+ /**
5013
+ * FX-converted balance in base currency; omitted when not convertible
5014
+ */
5015
+ convertedBalance?: string;
4293
5016
  };
4294
5017
 
4295
5018
  export type PlatformGroupDto = {
@@ -4306,9 +5029,40 @@ export type PlatformGroupDto = {
4306
5029
  */
4307
5030
  accounts: Array<AccountItemDto>;
4308
5031
  /**
4309
- * Total balance across all accounts in platform
5032
+ * FX-converted total balance in base currency
4310
5033
  */
4311
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)
5041
+ */
5042
+ convertedBalance?: string;
5043
+ /**
5044
+ * Share of the grand converted total (0-100); 0 when grand total is 0
5045
+ */
5046
+ sharePct: number;
5047
+ };
5048
+
5049
+ export type AccountExchangeRateWarningDto = {
5050
+ /**
5051
+ * Warning type
5052
+ */
5053
+ type: string;
5054
+ /**
5055
+ * Currency without exchange rate
5056
+ */
5057
+ currency: string;
5058
+ /**
5059
+ * Affected account paths
5060
+ */
5061
+ accounts: Array<string>;
5062
+ /**
5063
+ * Total amount in this currency
5064
+ */
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
@@ -4625,7 +5372,7 @@ export type CategoryGroupDto = {
4625
5372
  */
4626
5373
  category: string;
4627
5374
  /**
4628
- * Converted total expense in base currency
5375
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
4629
5376
  */
4630
5377
  totalExpense: string;
4631
5378
  /**
@@ -4644,7 +5391,7 @@ export type CategoryGroupDto = {
4644
5391
 
4645
5392
  export type ExpensesByCategorySummaryDto = {
4646
5393
  /**
4647
- * Total expense across all categories (converted; convertible categories only)
5394
+ * Total across all categories, converted (convertible categories only); expense totals when flow=expense, income totals when flow=income
4648
5395
  */
4649
5396
  totalExpense: string;
4650
5397
  /**
@@ -4871,287 +5618,146 @@ export type HoldingPnlResponseDto = {
4871
5618
  */
4872
5619
  export type method = 'average' | 'FIFO';
4873
5620
 
4874
- export type CreateBeanPriceDto = {
5621
+ export type AnonymousLoginDto = {
4875
5622
  /**
4876
- * Currency being priced (e.g., USD, AAPL, BTC)
5623
+ * Access token for anonymous login
4877
5624
  */
4878
- currency: string;
5625
+ accessToken: string;
5626
+ };
5627
+
5628
+ export type AnonymousLoginResponseDto = {
4879
5629
  /**
4880
- * Quote currency (pricing currency, e.g., CNY, EUR)
5630
+ * JWT auth token
4881
5631
  */
4882
- quoteCurrency: string;
5632
+ authToken: string;
5633
+ };
5634
+
5635
+ export type SymbolSearchResultDto = {
5636
+ symbol: string;
5637
+ name?: {
5638
+ [key: string]: unknown;
5639
+ } | null;
5640
+ exchange?: {
5641
+ [key: string]: unknown;
5642
+ } | null;
4883
5643
  /**
4884
- * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
4885
- */
4886
- amount: number;
4887
- /**
4888
- * Price date (ISO 8601 format)
4889
- */
4890
- date: string;
4891
- /**
4892
- * Metadata (validated by Zod schema, max field lengths enforced)
5644
+ * OpenBB asset_type (e.g. stock, etf)
4893
5645
  */
4894
- metadata?: {
5646
+ assetType?: {
4895
5647
  [key: string]: unknown;
4896
- };
4897
- };
4898
-
4899
- export type PriceResponseDto = {
4900
- /**
4901
- * Unique identifier
4902
- */
4903
- id: string;
4904
- /**
4905
- * User ID (owner of the price)
4906
- */
4907
- userId: string;
4908
- /**
4909
- * Currency being priced (e.g., USD, AAPL, BTC)
4910
- */
4911
- currency: string;
4912
- /**
4913
- * Quote currency (pricing currency, e.g., USD, CNY)
4914
- */
4915
- quoteCurrency: string;
4916
- /**
4917
- * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
4918
- */
4919
- amount: number;
5648
+ } | null;
4920
5649
  /**
4921
- * Price date (ISO 8601 format). Represents the date this price was valid.
5650
+ * IGN asset class (region.types.ts ASSET_CLASSES)
4922
5651
  */
4923
- date: string;
4924
- /**
4925
- * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
4926
- */
4927
- meta: {
5652
+ assetClass?: {
4928
5653
  [key: string]: unknown;
4929
- };
4930
- /**
4931
- * Creation timestamp
4932
- */
4933
- createdAt: string;
4934
- /**
4935
- * Last update timestamp
4936
- */
4937
- updatedAt: string;
4938
- };
4939
-
4940
- export type PriceListResponseDto = {
4941
- /**
4942
- * List of prices
4943
- */
4944
- items: Array<PriceResponseDto>;
4945
- /**
4946
- * Total number of prices
4947
- */
4948
- total: number;
4949
- };
4950
-
4951
- export type UpdateBeanPriceDto = {
4952
- /**
4953
- * Currency being priced
4954
- */
4955
- currency?: string;
4956
- /**
4957
- * Quote currency (pricing currency)
4958
- */
4959
- quoteCurrency?: string;
4960
- /**
4961
- * Price amount (MUST be >= 0 per Beancount spec)
4962
- */
4963
- amount?: number;
4964
- /**
4965
- * Price date (ISO 8601 format)
4966
- */
4967
- date?: string;
5654
+ } | null;
4968
5655
  /**
4969
- * Metadata
5656
+ * IGN asset sub-class (region.types.ts ASSET_SUB_CLASSES)
4970
5657
  */
4971
- metadata?: {
5658
+ assetSubClass?: {
4972
5659
  [key: string]: unknown;
4973
- };
4974
- };
4975
-
4976
- export type CurrencyBalanceDto = {
4977
- /**
4978
- * ISO 4217 currency code
4979
- */
4980
- currency: string;
4981
- /**
4982
- * Balance amount
4983
- */
4984
- balance: string;
4985
- };
4986
-
4987
- export type TimeSeriesPointDto = {
4988
- /**
4989
- * Date in YYYY-MM-DD format
4990
- */
4991
- date: string;
4992
- /**
4993
- * Value at this date (in base currency)
4994
- */
4995
- value: string;
5660
+ } | null;
4996
5661
  /**
4997
- * Change from previous point
5662
+ * Trading currency (extra_data or inferred from exchange)
4998
5663
  */
4999
- change?: {
5664
+ currency?: {
5000
5665
  [key: string]: unknown;
5001
- };
5002
- /**
5003
- * Total assets at this date (in base currency)
5004
- */
5005
- assets?: string;
5006
- /**
5007
- * Total liabilities at this date (in base currency)
5008
- */
5009
- liabilities?: string;
5010
- /**
5011
- * Multi-currency breakdown for this point
5012
- */
5013
- byCurrency?: Array<CurrencyBalanceDto>;
5014
- };
5015
-
5016
- export type TrendSummaryDto = {
5017
- /**
5018
- * Value at start of period
5019
- */
5020
- startValue: string;
5021
- /**
5022
- * Value at end of period
5023
- */
5024
- endValue: string;
5025
- /**
5026
- * Total change over period
5027
- */
5028
- totalChange: string;
5029
- /**
5030
- * Total change percentage
5031
- */
5032
- totalChangePercentage: string;
5033
- };
5034
-
5035
- export type MultiCurrencyPointDto = {
5036
- /**
5037
- * Date in YYYY-MM-DD format
5038
- */
5039
- date: string;
5040
- /**
5041
- * Balances by currency
5042
- */
5043
- byCurrency: Array<CurrencyBalanceDto>;
5044
- };
5045
-
5046
- export type PortfolioTrendsResponseDto = {
5047
- /**
5048
- * Time series data points
5049
- */
5050
- series: Array<TimeSeriesPointDto>;
5051
- /**
5052
- * Period summary
5053
- */
5054
- summary: TrendSummaryDto;
5055
- /**
5056
- * Period requested
5057
- */
5058
- period: string;
5059
- /**
5060
- * Data granularity
5061
- */
5062
- granularity: string;
5063
- /**
5064
- * Base currency for converted values
5065
- */
5066
- currency: string;
5067
- /**
5068
- * Multi-currency time series (each point has currency breakdown)
5069
- */
5070
- byCurrency?: Array<MultiCurrencyPointDto>;
5071
- /**
5072
- * Exchange rate warnings
5073
- */
5074
- warnings?: Array<ExchangeRateWarningDto>;
5075
- };
5076
-
5077
- export type CashFlowPointDto = {
5078
- /**
5079
- * Month key (YYYY-MM)
5080
- */
5081
- month: string;
5082
- /**
5083
- * Income in base currency (absolute, converted)
5084
- */
5085
- income: string;
5086
- /**
5087
- * Expense in base currency (absolute, converted)
5088
- */
5089
- expense: string;
5090
- /**
5091
- * netSavings = income − expense (savings positive)
5092
- */
5093
- netSavings: string;
5666
+ } | null;
5094
5667
  };
5095
5668
 
5096
- export type CashFlowTrendSummaryDto = {
5669
+ export type SymbolQuoteDto = {
5670
+ symbol?: string;
5671
+ name?: {
5672
+ [key: string]: unknown;
5673
+ } | null;
5674
+ exchange?: {
5675
+ [key: string]: unknown;
5676
+ } | null;
5097
5677
  /**
5098
- * Total income across the period
5678
+ * OpenBB asset_type
5099
5679
  */
5100
- totalIncome: string;
5680
+ assetType?: {
5681
+ [key: string]: unknown;
5682
+ } | null;
5101
5683
  /**
5102
- * Total expense across the period
5684
+ * IGN asset class
5103
5685
  */
5104
- totalExpense: string;
5686
+ assetClass?: {
5687
+ [key: string]: unknown;
5688
+ } | null;
5105
5689
  /**
5106
- * income − expense across the period
5690
+ * IGN asset sub-class
5107
5691
  */
5108
- totalNetSavings: string;
5692
+ assetSubClass?: {
5693
+ [key: string]: unknown;
5694
+ } | null;
5109
5695
  /**
5110
- * totalNetSavings divided by the window length (N months, incl. zero-filled)
5696
+ * Trading currency (extra_data or inferred from exchange)
5111
5697
  */
5112
- averageMonthlyNetSavings: string;
5113
- };
5114
-
5115
- export type CashFlowTrendsResponseDto = {
5698
+ currency?: {
5699
+ [key: string]: unknown;
5700
+ } | null;
5116
5701
  /**
5117
- * Monthly cash-flow series (fixed N-month window, zero-filled)
5702
+ * Latest price (Decimal string)
5118
5703
  */
5119
- series: Array<CashFlowPointDto>;
5704
+ price?: {
5705
+ [key: string]: unknown;
5706
+ } | null;
5120
5707
  /**
5121
- * Period totals
5708
+ * Date the price was observed (ISO yyyy-MM-dd)
5122
5709
  */
5123
- summary: CashFlowTrendSummaryDto;
5710
+ priceDate?: {
5711
+ [key: string]: unknown;
5712
+ } | null;
5124
5713
  /**
5125
- * Period requested
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.
5126
5715
  */
5127
- period: string;
5716
+ changePercent?: {
5717
+ [key: string]: unknown;
5718
+ } | null;
5128
5719
  /**
5129
- * Data granularity (v1 returns month buckets)
5720
+ * Previous close (Decimal string)
5130
5721
  */
5131
- granularity: string;
5722
+ prevClose?: {
5723
+ [key: string]: unknown;
5724
+ } | null;
5132
5725
  /**
5133
- * Base currency for converted values
5726
+ * Day open (Decimal string)
5134
5727
  */
5135
- currency: string;
5728
+ open?: {
5729
+ [key: string]: unknown;
5730
+ } | null;
5136
5731
  /**
5137
- * Exchange rate warnings (e.g. missing rate for a currency)
5732
+ * Day high (Decimal string)
5138
5733
  */
5139
- warnings?: Array<ExchangeRateWarningDto>;
5140
- };
5141
-
5142
- export type GenerateSnapshotBody = unknown;
5143
-
5144
- export type GenerateSnapshotResponse = unknown;
5145
-
5146
- export type BackfillSnapshotsBody = unknown;
5147
-
5148
- export type BackfillSnapshotsResponse = unknown;
5149
-
5150
- export type AnonymousLoginDto = {
5734
+ high?: {
5735
+ [key: string]: unknown;
5736
+ } | null;
5151
5737
  /**
5152
- * Access token for anonymous login
5738
+ * Day low (Decimal string)
5153
5739
  */
5154
- accessToken: string;
5740
+ low?: {
5741
+ [key: string]: unknown;
5742
+ } | null;
5743
+ /**
5744
+ * Day volume (Decimal string)
5745
+ */
5746
+ volume?: {
5747
+ [key: string]: unknown;
5748
+ } | null;
5749
+ /**
5750
+ * 52-week high (Decimal string)
5751
+ */
5752
+ yearHigh?: {
5753
+ [key: string]: unknown;
5754
+ } | null;
5755
+ /**
5756
+ * 52-week low (Decimal string)
5757
+ */
5758
+ yearLow?: {
5759
+ [key: string]: unknown;
5760
+ } | null;
5155
5761
  };
5156
5762
 
5157
5763
  export type AccountControllerCreateData = {
@@ -5182,7 +5788,7 @@ export type AccountControllerFindAllData = {
5182
5788
  */
5183
5789
  region: 'cn' | 'us' | 'de' | 'gb';
5184
5790
  /**
5185
- * Search term for path or i18nKey
5791
+ * Search term for account path
5186
5792
  */
5187
5793
  search?: string;
5188
5794
  /**
@@ -5265,6 +5871,21 @@ export type AccountControllerReopenData = {
5265
5871
 
5266
5872
  export type AccountControllerReopenResponse = AccountResponseDto;
5267
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
+
5268
5889
  export type AccountStandardsControllerGetTemplatesData = {
5269
5890
  /**
5270
5891
  * Region code (cn, us, de)
@@ -5453,7 +6074,7 @@ export type TransactionControllerDeleteResponse = void;
5453
6074
 
5454
6075
  export type BalanceControllerGetBalanceData = {
5455
6076
  /**
5456
- * Account name (e.g., "Assets:Bank:Checking")
6077
+ * Account name (e.g., "Assets:Checking")
5457
6078
  */
5458
6079
  account: string;
5459
6080
  /**
@@ -5855,6 +6476,103 @@ export type CommodityControllerBulkCreateData = {
5855
6476
 
5856
6477
  export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
5857
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
+
5858
6576
  export type RecurringRuleControllerCreateData = {
5859
6577
  /**
5860
6578
  * Region code for tenant context
@@ -5989,104 +6707,252 @@ export type ExpectedTransactionControllerFindOverdueData = {
5989
6707
  region: 'cn' | 'us' | 'de' | 'gb';
5990
6708
  };
5991
6709
 
5992
- export type ExpectedTransactionControllerFindOverdueResponse =
5993
- ExpectedTransactionListResponseDto;
6710
+ export type ExpectedTransactionControllerFindOverdueResponse =
6711
+ ExpectedTransactionListResponseDto;
6712
+
6713
+ export type ExpectedTransactionControllerFindOneData = {
6714
+ /**
6715
+ * Expected transaction ID
6716
+ */
6717
+ id: string;
6718
+ /**
6719
+ * Region code for tenant context
6720
+ */
6721
+ region: 'cn' | 'us' | 'de' | 'gb';
6722
+ };
6723
+
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;
6826
+
6827
+ export type ReportingControllerGetCashFlowTrendsData = {
6828
+ /**
6829
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6830
+ */
6831
+ granularity?: 'day' | 'week' | 'month';
6832
+ /**
6833
+ * Time period
6834
+ */
6835
+ period?: '1m' | '3m' | '6m' | '1y';
6836
+ /**
6837
+ * Region code for tenant context
6838
+ */
6839
+ region: 'cn' | 'us' | 'de' | 'gb';
6840
+ };
6841
+
6842
+ export type ReportingControllerGetCashFlowTrendsResponse =
6843
+ CashFlowTrendsResponseDto;
5994
6844
 
5995
- export type ExpectedTransactionControllerFindOneData = {
5996
- /**
5997
- * Expected transaction ID
5998
- */
5999
- id: string;
6845
+ export type ReportingControllerGenerateSnapshotData = {
6000
6846
  /**
6001
6847
  * Region code for tenant context
6002
6848
  */
6003
6849
  region: 'cn' | 'us' | 'de' | 'gb';
6850
+ /**
6851
+ * Optional date (defaults to today)
6852
+ */
6853
+ requestBody: GenerateSnapshotBody;
6004
6854
  };
6005
6855
 
6006
- export type ExpectedTransactionControllerFindOneResponse =
6007
- ExpectedTransactionResponseDto;
6856
+ export type ReportingControllerGenerateSnapshotResponse =
6857
+ GenerateSnapshotResponse;
6008
6858
 
6009
- export type ExpectedTransactionControllerSkipData = {
6010
- /**
6011
- * Expected transaction ID
6012
- */
6013
- id: string;
6859
+ export type ReportingControllerBackfillSnapshotsData = {
6014
6860
  /**
6015
6861
  * Region code for tenant context
6016
6862
  */
6017
6863
  region: 'cn' | 'us' | 'de' | 'gb';
6864
+ requestBody: BackfillSnapshotsBody;
6018
6865
  };
6019
6866
 
6020
- export type ExpectedTransactionControllerSkipResponse =
6021
- ExpectedTransactionResponseDto;
6867
+ export type ReportingControllerBackfillSnapshotsResponse =
6868
+ BackfillSnapshotsResponse;
6022
6869
 
6023
- export type ExpectedTransactionControllerUndoSkipData = {
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 = {
6024
6889
  /**
6025
- * Expected transaction ID
6890
+ * User ID to delete
6026
6891
  */
6027
6892
  id: string;
6028
- /**
6029
- * Region code for tenant context
6030
- */
6031
- region: 'cn' | 'us' | 'de' | 'gb';
6032
6893
  };
6033
6894
 
6034
- export type ExpectedTransactionControllerUndoSkipResponse =
6035
- ExpectedTransactionResponseDto;
6895
+ export type UserControllerDeleteUserResponse = void;
6036
6896
 
6037
- export type ExpectedTransactionControllerConfirmMatchData = {
6897
+ export type UserControllerGetUserInfoData = {
6038
6898
  /**
6039
- * Expected transaction ID
6899
+ * User ID
6040
6900
  */
6041
6901
  id: string;
6042
- /**
6043
- * Region code for tenant context
6044
- */
6045
- region: 'cn' | 'us' | 'de' | 'gb';
6046
- requestBody: ConfirmMatchDto;
6047
6902
  };
6048
6903
 
6049
- export type ExpectedTransactionControllerConfirmMatchResponse = unknown;
6904
+ export type UserControllerGetUserInfoResponse = unknown;
6050
6905
 
6051
- export type ExpectedTransactionControllerUnmatchData = {
6906
+ export type UserControllerUpdateUserSettingData = {
6907
+ requestBody: UpdateUserSettingDto;
6908
+ };
6909
+
6910
+ export type UserControllerUpdateUserSettingResponse = unknown;
6911
+
6912
+ export type UserControllerGetAllUserSettingsByPageData = {
6052
6913
  /**
6053
- * Expected transaction ID
6914
+ * Page number
6054
6915
  */
6055
- id: string;
6916
+ pageNo: number;
6056
6917
  /**
6057
- * Region code for tenant context
6918
+ * Page size
6058
6919
  */
6059
- region: 'cn' | 'us' | 'de' | 'gb';
6920
+ pageSize: number;
6060
6921
  };
6061
6922
 
6062
- export type ExpectedTransactionControllerUnmatchResponse = unknown;
6923
+ export type UserControllerGetAllUserSettingsByPageResponse = unknown;
6063
6924
 
6064
- export type ExpectedTransactionControllerEnterNowData = {
6065
- /**
6066
- * Expected transaction ID
6067
- */
6068
- id: string;
6925
+ export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
6926
+
6927
+ export type PropertyControllerGetAllResponse = unknown;
6928
+
6929
+ export type PropertyControllerGetByKeyData = {
6069
6930
  /**
6070
- * Region code for tenant context
6931
+ * Property key
6071
6932
  */
6072
- region: 'cn' | 'us' | 'de' | 'gb';
6073
- requestBody: EnterNowDto;
6933
+ key: string;
6074
6934
  };
6075
6935
 
6076
- export type ExpectedTransactionControllerEnterNowResponse = unknown;
6936
+ export type PropertyControllerGetByKeyResponse = unknown;
6077
6937
 
6078
- export type ForecastControllerGetForecastData = {
6938
+ export type PropertyControllerUpdateData = {
6079
6939
  /**
6080
- * Number of months to forecast (1-12, default 3)
6940
+ * Property key
6081
6941
  */
6082
- months?: number;
6942
+ key: string;
6943
+ requestBody: UpdatePropertyDto;
6944
+ };
6945
+
6946
+ export type PropertyControllerUpdateResponse = unknown;
6947
+
6948
+ export type PropertyControllerDeleteData = {
6083
6949
  /**
6084
- * Region code for tenant context
6950
+ * Property key
6085
6951
  */
6086
- region: 'cn' | 'us' | 'de' | 'gb';
6952
+ key: string;
6087
6953
  };
6088
6954
 
6089
- export type ForecastControllerGetForecastResponse = ForecastResponseDto;
6955
+ export type PropertyControllerDeleteResponse = void;
6090
6956
 
6091
6957
  export type TransactionRuleControllerCreateData = {
6092
6958
  /**
@@ -6233,93 +7099,6 @@ export type TransactionRuleControllerTestData = {
6233
7099
 
6234
7100
  export type TransactionRuleControllerTestResponse = TestRuleResponseDto;
6235
7101
 
6236
- export type UserControllerDeleteOwnUserData = {
6237
- requestBody: DeleteOwnUserDto;
6238
- };
6239
-
6240
- export type UserControllerDeleteOwnUserResponse = void;
6241
-
6242
- export type UserControllerGetUserData = {
6243
- acceptLanguage: string;
6244
- };
6245
-
6246
- export type UserControllerGetUserResponse = unknown;
6247
-
6248
- export type UserControllerSignupUserData = {
6249
- requestBody: SignupDto;
6250
- };
6251
-
6252
- export type UserControllerSignupUserResponse = unknown;
6253
-
6254
- export type UserControllerDeleteUserData = {
6255
- /**
6256
- * User ID to delete
6257
- */
6258
- id: string;
6259
- };
6260
-
6261
- export type UserControllerDeleteUserResponse = void;
6262
-
6263
- export type UserControllerGetUserInfoData = {
6264
- /**
6265
- * User ID
6266
- */
6267
- id: string;
6268
- };
6269
-
6270
- export type UserControllerGetUserInfoResponse = unknown;
6271
-
6272
- export type UserControllerUpdateUserSettingData = {
6273
- requestBody: UpdateUserSettingDto;
6274
- };
6275
-
6276
- export type UserControllerUpdateUserSettingResponse = unknown;
6277
-
6278
- export type UserControllerGetAllUserSettingsByPageData = {
6279
- /**
6280
- * Page number
6281
- */
6282
- pageNo: number;
6283
- /**
6284
- * Page size
6285
- */
6286
- pageSize: number;
6287
- };
6288
-
6289
- export type UserControllerGetAllUserSettingsByPageResponse = unknown;
6290
-
6291
- export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
6292
-
6293
- export type PropertyControllerGetAllResponse = unknown;
6294
-
6295
- export type PropertyControllerGetByKeyData = {
6296
- /**
6297
- * Property key
6298
- */
6299
- key: string;
6300
- };
6301
-
6302
- export type PropertyControllerGetByKeyResponse = unknown;
6303
-
6304
- export type PropertyControllerUpdateData = {
6305
- /**
6306
- * Property key
6307
- */
6308
- key: string;
6309
- requestBody: UpdatePropertyDto;
6310
- };
6311
-
6312
- export type PropertyControllerUpdateResponse = unknown;
6313
-
6314
- export type PropertyControllerDeleteData = {
6315
- /**
6316
- * Property key
6317
- */
6318
- key: string;
6319
- };
6320
-
6321
- export type PropertyControllerDeleteResponse = void;
6322
-
6323
7102
  export type EventControllerCreateData = {
6324
7103
  /**
6325
7104
  * Region code for tenant context (decorative for life events)
@@ -6388,35 +7167,90 @@ export type EventControllerUpdateData = {
6388
7167
  requestBody: UpdateBeanEventDto;
6389
7168
  };
6390
7169
 
6391
- export type EventControllerUpdateResponse = EventResponseDto;
7170
+ export type EventControllerUpdateResponse = EventResponseDto;
7171
+
7172
+ export type EventControllerDeleteData = {
7173
+ /**
7174
+ * Life event ID
7175
+ */
7176
+ id: string;
7177
+ /**
7178
+ * Region code for tenant context (decorative for life events)
7179
+ */
7180
+ region: 'cn' | 'us' | 'de' | 'gb';
7181
+ };
7182
+
7183
+ export type EventControllerDeleteResponse = void;
7184
+
7185
+ export type EventControllerGetSliceData = {
7186
+ accountPattern: string;
7187
+ granularity: string;
7188
+ /**
7189
+ * Life event ID
7190
+ */
7191
+ id: string;
7192
+ /**
7193
+ * Region code for tenant context (decorative for life events)
7194
+ */
7195
+ region: 'cn' | 'us' | 'de' | 'gb';
7196
+ };
7197
+
7198
+ export type EventControllerGetSliceResponse = unknown;
7199
+
7200
+ export type OnboardingControllerBootstrapData = {
7201
+ /**
7202
+ * Region code for tenant context
7203
+ */
7204
+ region: 'cn' | 'us' | 'de' | 'gb';
7205
+ requestBody: OnboardingDto;
7206
+ };
7207
+
7208
+ export type OnboardingControllerBootstrapResponse = unknown;
7209
+
7210
+ export type ReconciliationControllerComputeData = {
7211
+ /**
7212
+ * Region code for tenant context (decorative for reconciliation)
7213
+ */
7214
+ region: 'cn' | 'us' | 'de' | 'gb';
7215
+ requestBody: ComputeReconciliationDto;
7216
+ };
7217
+
7218
+ export type ReconciliationControllerComputeResponse =
7219
+ ReconciliationComputeResultDto;
7220
+
7221
+ export type ReconciliationControllerAssertData = {
7222
+ /**
7223
+ * Region code for tenant context (decorative for reconciliation)
7224
+ */
7225
+ region: 'cn' | 'us' | 'de' | 'gb';
7226
+ requestBody: AssertReconciliationDto;
7227
+ };
7228
+
7229
+ export type ReconciliationControllerAssertResponse = ReconciliationRecordDto;
6392
7230
 
6393
- export type EventControllerDeleteData = {
6394
- /**
6395
- * Life event ID
6396
- */
6397
- id: string;
7231
+ export type ReconciliationControllerPadData = {
6398
7232
  /**
6399
- * Region code for tenant context (decorative for life events)
7233
+ * Region code for tenant context (decorative for reconciliation)
6400
7234
  */
6401
7235
  region: 'cn' | 'us' | 'de' | 'gb';
7236
+ requestBody: PadReconciliationDto;
6402
7237
  };
6403
7238
 
6404
- export type EventControllerDeleteResponse = void;
7239
+ export type ReconciliationControllerPadResponse = PadResultDto;
6405
7240
 
6406
- export type EventControllerGetSliceData = {
6407
- accountPattern: string;
6408
- granularity: string;
7241
+ export type ReconciliationControllerHistoryData = {
6409
7242
  /**
6410
- * Life event ID
7243
+ * BeanAccount id
6411
7244
  */
6412
- id: string;
7245
+ accountId: string;
6413
7246
  /**
6414
- * Region code for tenant context (decorative for life events)
7247
+ * Region code for tenant context (decorative for reconciliation)
6415
7248
  */
6416
7249
  region: 'cn' | 'us' | 'de' | 'gb';
6417
7250
  };
6418
7251
 
6419
- export type EventControllerGetSliceResponse = unknown;
7252
+ export type ReconciliationControllerHistoryResponse =
7253
+ Array<ReconciliationRecordDto>;
6420
7254
 
6421
7255
  export type ExportControllerExportBeancountResponse = unknown;
6422
7256
 
@@ -6510,48 +7344,6 @@ export type ImporterConfigControllerResetConfigData = {
6510
7344
 
6511
7345
  export type ImporterConfigControllerResetConfigResponse = ImporterConfigDto;
6512
7346
 
6513
- export type PlatformControllerFindAllResponse = unknown;
6514
-
6515
- export type PlatformControllerCreateData = {
6516
- requestBody: CreatePlatformDto;
6517
- };
6518
-
6519
- export type PlatformControllerCreateResponse = unknown;
6520
-
6521
- export type PlatformControllerGetPlatformListResponse = unknown;
6522
-
6523
- export type PlatformControllerMatchPlatformsData = {
6524
- /**
6525
- * Search query — Chinese name, English name, or abbreviation
6526
- */
6527
- q: string;
6528
- /**
6529
- * Region code for category override lookup
6530
- */
6531
- region?: string;
6532
- };
6533
-
6534
- export type PlatformControllerMatchPlatformsResponse = unknown;
6535
-
6536
- export type PlatformControllerUpdateData = {
6537
- /**
6538
- * Platform ID
6539
- */
6540
- id: string;
6541
- requestBody: UpdatePlatformDto;
6542
- };
6543
-
6544
- export type PlatformControllerUpdateResponse = unknown;
6545
-
6546
- export type PlatformControllerDeleteData = {
6547
- /**
6548
- * Platform ID
6549
- */
6550
- id: string;
6551
- };
6552
-
6553
- export type PlatformControllerDeleteResponse = void;
6554
-
6555
7347
  export type ProviderSyncControllerSyncData = {
6556
7348
  /**
6557
7349
  * Provider name
@@ -6597,6 +7389,49 @@ export type ProviderSyncControllerIsProviderSupportedData = {
6597
7389
 
6598
7390
  export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
6599
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
+
6600
7435
  export type TelemetryControllerReportTelemetryData = {
6601
7436
  /**
6602
7437
  * Region code for tenant context
@@ -6669,221 +7504,114 @@ export type NlpControllerGetSessionData = {
6669
7504
 
6670
7505
  export type NlpControllerGetSessionResponse = unknown;
6671
7506
 
6672
- export type DashboardControllerGetNetWorthData = {
6673
- /**
6674
- * Date for balance calculation (ISO 8601 format)
6675
- */
6676
- date?: string;
6677
- /**
6678
- * Region code for tenant context
6679
- */
6680
- region: 'cn' | 'us' | 'de' | 'gb';
6681
- };
6682
-
6683
- export type DashboardControllerGetNetWorthResponse = NetWorthResponseDto;
6684
-
6685
- export type DashboardControllerGetAccountsData = {
6686
- /**
6687
- * Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
6688
- */
6689
- accountId?: string;
6690
- /**
6691
- * Date for balance calculation (ISO 8601 format)
6692
- */
6693
- date?: string;
6694
- /**
6695
- * Grouping strategy
6696
- */
6697
- groupBy?:
6698
- | 'platform'
6699
- | 'assetClass'
6700
- | 'holdingAssetClass'
6701
- | 'holdingAssetClassByAccount';
6702
- /**
6703
- * Region code for tenant context
6704
- */
6705
- region: 'cn' | 'us' | 'de' | 'gb';
6706
- };
6707
-
6708
- export type DashboardControllerGetAccountsResponse =
6709
- | AccountsResponseDto
6710
- | AssetClassAccountsResponseDto
6711
- | HoldingAssetClassCrossAccountResponseDto;
7507
+ export type PlatformControllerFindAllResponse = unknown;
6712
7508
 
6713
- export type DashboardControllerGetCashFlowData = {
6714
- /**
6715
- * Period in YYYY-MM format
6716
- */
6717
- period: string;
6718
- /**
6719
- * Region code for tenant context
6720
- */
6721
- region: 'cn' | 'us' | 'de' | 'gb';
7509
+ export type PlatformControllerCreateData = {
7510
+ requestBody: CreatePlatformDto;
6722
7511
  };
6723
7512
 
6724
- export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
6725
-
6726
- export type DashboardControllerGetExpensesData = {
6727
- /**
6728
- * Grouping strategy
6729
- */
6730
- groupBy?: 'category';
6731
- /**
6732
- * Time window (1m = current calendar month)
6733
- */
6734
- period?: '1m' | '3m' | '6m' | '1y';
6735
- /**
6736
- * Region code for tenant context
6737
- */
6738
- region: 'cn' | 'us' | 'de' | 'gb';
6739
- };
7513
+ export type PlatformControllerCreateResponse = unknown;
6740
7514
 
6741
- export type DashboardControllerGetExpensesResponse =
6742
- ExpensesByCategoryResponseDto;
7515
+ export type PlatformControllerGetPlatformListResponse =
7516
+ Array<PlatformListItemDto>;
6743
7517
 
6744
- export type HoldingPnlControllerGetHoldingPnlData = {
6745
- /**
6746
- * Scope to a single account
6747
- */
6748
- accountId?: string;
6749
- /**
6750
- * As-of date (ISO 8601), defaults to today
6751
- */
6752
- asOf?: string;
6753
- /**
6754
- * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
6755
- */
6756
- method?: 'FIFO' | 'average';
7518
+ export type PlatformControllerMatchPlatformsData = {
6757
7519
  /**
6758
- * Region code for tenant context
7520
+ * Search query — Chinese name, English name, or abbreviation
6759
7521
  */
6760
- region: 'cn' | 'us' | 'de' | 'gb';
6761
- };
6762
-
6763
- export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
6764
-
6765
- export type PriceControllerCreateData = {
7522
+ q: string;
6766
7523
  /**
6767
- * Region code for tenant context
7524
+ * Region code for category override lookup
6768
7525
  */
6769
- region: 'cn' | 'us' | 'de' | 'gb';
6770
- requestBody: CreateBeanPriceDto;
7526
+ region?: string;
6771
7527
  };
6772
7528
 
6773
- export type PriceControllerCreateResponse = PriceResponseDto;
7529
+ export type PlatformControllerMatchPlatformsResponse = PlatformMatchResponseDto;
6774
7530
 
6775
- export type PriceControllerFindAllData = {
6776
- /**
6777
- * Filter by currency (e.g., BTC, AAPL, USD)
6778
- */
6779
- currency?: string;
6780
- /**
6781
- * Filter prices from this date (ISO 8601 format)
6782
- */
6783
- dateFrom?: string;
6784
- /**
6785
- * Filter prices to this date (ISO 8601 format)
6786
- */
6787
- dateTo?: string;
6788
- /**
6789
- * Number of items per page (default: 20, max: 100)
6790
- */
6791
- limit?: number;
6792
- /**
6793
- * Page number for pagination (default: 1)
6794
- */
6795
- page?: number;
6796
- /**
6797
- * Filter by quote currency (pricing currency, e.g., USD, CNY)
6798
- */
6799
- quoteCurrency?: string;
6800
- /**
6801
- * Region code for tenant context
6802
- */
6803
- region: 'cn' | 'us' | 'de' | 'gb';
7531
+ export type PlatformControllerUpdateData = {
6804
7532
  /**
6805
- * Search term for currency or quoteCurrency (case-insensitive partial match)
7533
+ * Platform ID
6806
7534
  */
6807
- search?: string;
7535
+ id: string;
7536
+ requestBody: UpdatePlatformDto;
6808
7537
  };
6809
7538
 
6810
- export type PriceControllerFindAllResponse = PriceListResponseDto;
7539
+ export type PlatformControllerUpdateResponse = unknown;
6811
7540
 
6812
- export type PriceControllerFindOneData = {
7541
+ export type PlatformControllerDeleteData = {
6813
7542
  /**
6814
- * Price ID
7543
+ * Platform ID
6815
7544
  */
6816
7545
  id: string;
6817
- /**
6818
- * Region code for tenant context
6819
- */
6820
- region: 'cn' | 'us' | 'de' | 'gb';
6821
7546
  };
6822
7547
 
6823
- export type PriceControllerFindOneResponse = PriceResponseDto;
7548
+ export type PlatformControllerDeleteResponse = void;
6824
7549
 
6825
- export type PriceControllerUpdateData = {
7550
+ export type DashboardControllerGetNetWorthData = {
6826
7551
  /**
6827
- * Price ID
7552
+ * Date for balance calculation (ISO 8601 format)
6828
7553
  */
6829
- id: string;
7554
+ date?: string;
6830
7555
  /**
6831
7556
  * Region code for tenant context
6832
7557
  */
6833
7558
  region: 'cn' | 'us' | 'de' | 'gb';
6834
- requestBody: UpdateBeanPriceDto;
6835
7559
  };
6836
7560
 
6837
- export type PriceControllerUpdateResponse = PriceResponseDto;
7561
+ export type DashboardControllerGetNetWorthResponse = NetWorthResponseDto;
6838
7562
 
6839
- export type PriceControllerDeleteData = {
7563
+ export type DashboardControllerGetAccountsData = {
6840
7564
  /**
6841
- * Price ID
7565
+ * Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
6842
7566
  */
6843
- id: string;
7567
+ accountId?: string;
6844
7568
  /**
6845
- * Region code for tenant context
7569
+ * Date for balance calculation (ISO 8601 format)
6846
7570
  */
6847
- region: 'cn' | 'us' | 'de' | 'gb';
6848
- };
6849
-
6850
- export type PriceControllerDeleteResponse = void;
6851
-
6852
- export type PriceControllerBulkCreateData = {
7571
+ date?: string;
7572
+ /**
7573
+ * Grouping strategy
7574
+ */
7575
+ groupBy?:
7576
+ | 'platform'
7577
+ | 'assetClass'
7578
+ | 'holdingAssetClass'
7579
+ | 'holdingAssetClassByAccount';
6853
7580
  /**
6854
7581
  * Region code for tenant context
6855
7582
  */
6856
7583
  region: 'cn' | 'us' | 'de' | 'gb';
6857
- requestBody: Array<string>;
6858
7584
  };
6859
7585
 
6860
- export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
7586
+ export type DashboardControllerGetAccountsResponse =
7587
+ | AccountsResponseDto
7588
+ | AssetClassAccountsResponseDto
7589
+ | HoldingAssetClassCrossAccountResponseDto;
6861
7590
 
6862
- export type ReportingControllerGetPortfolioTrendsData = {
6863
- /**
6864
- * Data granularity
6865
- */
6866
- granularity?: 'day' | 'week' | 'month';
7591
+ export type DashboardControllerGetCashFlowData = {
6867
7592
  /**
6868
- * Time period
7593
+ * Period in YYYY-MM format
6869
7594
  */
6870
- period?: '1m' | '3m' | '6m' | '1y';
7595
+ period: string;
6871
7596
  /**
6872
7597
  * Region code for tenant context
6873
7598
  */
6874
7599
  region: 'cn' | 'us' | 'de' | 'gb';
6875
7600
  };
6876
7601
 
6877
- export type ReportingControllerGetPortfolioTrendsResponse =
6878
- PortfolioTrendsResponseDto;
7602
+ export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
6879
7603
 
6880
- export type ReportingControllerGetCashFlowTrendsData = {
7604
+ export type DashboardControllerGetExpensesData = {
6881
7605
  /**
6882
- * Data granularity (accepted for API symmetry; v1 returns month buckets)
7606
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
6883
7607
  */
6884
- granularity?: 'day' | 'week' | 'month';
7608
+ flow?: 'expense' | 'income';
6885
7609
  /**
6886
- * Time period
7610
+ * Grouping strategy
7611
+ */
7612
+ groupBy?: 'category';
7613
+ /**
7614
+ * Time window (1m = current calendar month)
6887
7615
  */
6888
7616
  period?: '1m' | '3m' | '6m' | '1y';
6889
7617
  /**
@@ -6892,33 +7620,29 @@ export type ReportingControllerGetCashFlowTrendsData = {
6892
7620
  region: 'cn' | 'us' | 'de' | 'gb';
6893
7621
  };
6894
7622
 
6895
- export type ReportingControllerGetCashFlowTrendsResponse =
6896
- CashFlowTrendsResponseDto;
7623
+ export type DashboardControllerGetExpensesResponse =
7624
+ ExpensesByCategoryResponseDto;
6897
7625
 
6898
- export type ReportingControllerGenerateSnapshotData = {
7626
+ export type HoldingPnlControllerGetHoldingPnlData = {
6899
7627
  /**
6900
- * Region code for tenant context
7628
+ * Scope to a single account
6901
7629
  */
6902
- region: 'cn' | 'us' | 'de' | 'gb';
7630
+ accountId?: string;
6903
7631
  /**
6904
- * Optional date (defaults to today)
7632
+ * As-of date (ISO 8601), defaults to today
6905
7633
  */
6906
- requestBody: GenerateSnapshotBody;
6907
- };
6908
-
6909
- export type ReportingControllerGenerateSnapshotResponse =
6910
- GenerateSnapshotResponse;
6911
-
6912
- 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';
6913
7639
  /**
6914
7640
  * Region code for tenant context
6915
7641
  */
6916
7642
  region: 'cn' | 'us' | 'de' | 'gb';
6917
- requestBody: BackfillSnapshotsBody;
6918
7643
  };
6919
7644
 
6920
- export type ReportingControllerBackfillSnapshotsResponse =
6921
- BackfillSnapshotsResponse;
7645
+ export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
6922
7646
 
6923
7647
  export type ApiKeysControllerCreateApiKeyResponse = unknown;
6924
7648
 
@@ -6926,7 +7650,7 @@ export type AuthControllerAccessTokenLoginData = {
6926
7650
  requestBody: AnonymousLoginDto;
6927
7651
  };
6928
7652
 
6929
- export type AuthControllerAccessTokenLoginResponse = unknown;
7653
+ export type AuthControllerAccessTokenLoginResponse = AnonymousLoginResponseDto;
6930
7654
 
6931
7655
  export type CacheControllerFlushCacheResponse = unknown;
6932
7656
 
@@ -6966,6 +7690,33 @@ export type HealthControllerGetMetricsResponse = unknown;
6966
7690
 
6967
7691
  export type InfoControllerGetInfoResponse = unknown;
6968
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
+
6969
7720
  export type $OpenApiTs = {
6970
7721
  '/api/v1/{region}/bean/accounts': {
6971
7722
  post: {
@@ -7074,6 +7825,25 @@ export type $OpenApiTs = {
7074
7825
  };
7075
7826
  };
7076
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
+ };
7077
7847
  '/api/v1/{region}/bean/account-standards': {
7078
7848
  get: {
7079
7849
  req: AccountStandardsControllerGetTemplatesData;
@@ -7682,6 +8452,90 @@ export type $OpenApiTs = {
7682
8452
  };
7683
8453
  };
7684
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
+ };
7685
8539
  '/api/v1/{region}/bean/recurring-rules': {
7686
8540
  post: {
7687
8541
  req: RecurringRuleControllerCreateData;
@@ -7932,397 +8786,469 @@ export type $OpenApiTs = {
7932
8786
  };
7933
8787
  };
7934
8788
  };
7935
- '/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': {
7936
8820
  post: {
7937
- req: TransactionRuleControllerCreateData;
8821
+ req: ReportingControllerGenerateSnapshotData;
7938
8822
  res: {
7939
8823
  /**
7940
- * Rule updated successfully (upsert mode)
8824
+ * Snapshot generated successfully
7941
8825
  */
7942
- 200: TransactionRuleResponseDto;
8826
+ 200: GenerateSnapshotResponse;
7943
8827
  /**
7944
- * Validation failed
8828
+ * Invalid date format
7945
8829
  */
7946
- 400: ApiProblemResponseDto;
8830
+ 400: unknown;
8831
+ /**
8832
+ * User not authenticated
8833
+ */
8834
+ 401: unknown;
8835
+ };
8836
+ };
8837
+ };
8838
+ '/api/v1/{region}/reporting/snapshots/backfill': {
8839
+ post: {
8840
+ req: ReportingControllerBackfillSnapshotsData;
8841
+ res: {
8842
+ /**
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: {
7947
8865
  /**
7948
- * Unauthorized
8866
+ * User deleted successfully
7949
8867
  */
7950
- 401: ApiProblemResponseDto;
8868
+ 204: void;
7951
8869
  /**
7952
- * Resource conflict - another process is updating this rule
8870
+ * Invalid access token
7953
8871
  */
7954
- 409: ApiProblemResponseDto;
8872
+ 403: unknown;
7955
8873
  };
7956
8874
  };
7957
8875
  get: {
7958
- req: TransactionRuleControllerListData;
8876
+ req: UserControllerGetUserData;
7959
8877
  res: {
7960
8878
  /**
7961
- * List of rules
7962
- */
7963
- 200: TransactionRuleListResponseDto;
7964
- /**
7965
- * Unauthorized
8879
+ * User retrieved successfully
7966
8880
  */
7967
- 401: ApiProblemResponseDto;
8881
+ 200: unknown;
7968
8882
  };
7969
8883
  };
7970
- };
7971
- '/api/v1/{region}/bean/transaction-rules/validate': {
7972
8884
  post: {
7973
- req: TransactionRuleControllerValidateData;
8885
+ req: UserControllerSignupUserData;
7974
8886
  res: {
7975
8887
  /**
7976
- * Validation result
8888
+ * User created successfully
7977
8889
  */
7978
- 200: ValidateRuleResponseDto;
8890
+ 201: SignupResponseDto;
7979
8891
  /**
7980
- * Validation failed
8892
+ * Invalid Turnstile token (when Turnstile is enabled)
7981
8893
  */
7982
- 400: ApiProblemResponseDto;
8894
+ 400: unknown;
7983
8895
  /**
7984
- * Unauthorized
8896
+ * User signup is disabled
7985
8897
  */
7986
- 401: ApiProblemResponseDto;
8898
+ 403: unknown;
7987
8899
  };
7988
8900
  };
7989
8901
  };
7990
- '/api/v1/{region}/bean/transaction-rules/bulk': {
7991
- post: {
7992
- req: TransactionRuleControllerBulkCreateData;
8902
+ '/api/v1/users/{id}': {
8903
+ delete: {
8904
+ req: UserControllerDeleteUserData;
7993
8905
  res: {
7994
8906
  /**
7995
- * Bulk create completed
7996
- */
7997
- 201: BulkCreateRulesResponseDto;
7998
- /**
7999
- * Invalid bulk create data
8907
+ * User deleted successfully
8000
8908
  */
8001
- 400: ApiProblemResponseDto;
8909
+ 204: void;
8002
8910
  /**
8003
- * Unauthorized
8911
+ * Cannot delete own account or insufficient permissions
8004
8912
  */
8005
- 401: ApiProblemResponseDto;
8913
+ 403: unknown;
8006
8914
  };
8007
8915
  };
8008
8916
  };
8009
- '/api/v1/{region}/bean/transaction-rules/export/{format}': {
8917
+ '/api/v1/users/{id}/info': {
8010
8918
  get: {
8011
- req: TransactionRuleControllerExportData;
8919
+ req: UserControllerGetUserInfoData;
8012
8920
  res: {
8013
8921
  /**
8014
- * Exported rules
8015
- */
8016
- 200: ExportRulesResponseDto;
8017
- /**
8018
- * Unsupported format
8922
+ * User info retrieved successfully
8019
8923
  */
8020
- 400: ApiProblemResponseDto;
8924
+ 200: unknown;
8021
8925
  /**
8022
- * Unauthorized
8926
+ * Cannot access other user info without admin permission
8023
8927
  */
8024
- 401: ApiProblemResponseDto;
8928
+ 403: unknown;
8025
8929
  };
8026
8930
  };
8027
8931
  };
8028
- '/api/v1/{region}/bean/transaction-rules/statistics/{period}': {
8029
- get: {
8030
- req: TransactionRuleControllerGetStatisticsData;
8932
+ '/api/v1/users/setting': {
8933
+ put: {
8934
+ req: UserControllerUpdateUserSettingData;
8031
8935
  res: {
8032
8936
  /**
8033
- * Rule statistics
8937
+ * Settings updated successfully
8034
8938
  */
8035
- 200: RuleStatisticsResponseDto;
8939
+ 200: unknown;
8036
8940
  /**
8037
- * Unauthorized
8941
+ * Insufficient permissions
8038
8942
  */
8039
- 401: ApiProblemResponseDto;
8943
+ 403: unknown;
8040
8944
  };
8041
8945
  };
8042
8946
  };
8043
- '/api/v1/{region}/bean/transaction-rules/{ruleId}': {
8947
+ '/api/v1/users/settings-by-page': {
8044
8948
  get: {
8045
- req: TransactionRuleControllerGetDetailData;
8949
+ req: UserControllerGetAllUserSettingsByPageData;
8046
8950
  res: {
8047
8951
  /**
8048
- * Rule details
8049
- */
8050
- 200: TransactionRuleResponseDto;
8051
- /**
8052
- * Unauthorized
8053
- */
8054
- 401: ApiProblemResponseDto;
8055
- /**
8056
- * Forbidden - not owner of rule
8057
- */
8058
- 403: ApiProblemResponseDto;
8059
- /**
8060
- * Rule not found
8952
+ * Settings list retrieved successfully
8061
8953
  */
8062
- 404: ApiProblemResponseDto;
8954
+ 200: unknown;
8063
8955
  };
8064
8956
  };
8065
- put: {
8066
- req: TransactionRuleControllerUpdateData;
8957
+ };
8958
+ '/api/v1/users/asset-liability-summary': {
8959
+ get: {
8067
8960
  res: {
8068
8961
  /**
8069
- * Rule updated successfully
8962
+ * Summary retrieved successfully
8070
8963
  */
8071
- 200: TransactionRuleResponseDto;
8964
+ 200: unknown;
8965
+ };
8966
+ };
8967
+ };
8968
+ '/api/v1/admin/properties': {
8969
+ get: {
8970
+ res: {
8072
8971
  /**
8073
- * Validation failed
8972
+ * Properties retrieved successfully
8074
8973
  */
8075
- 400: ApiProblemResponseDto;
8974
+ 200: unknown;
8076
8975
  /**
8077
8976
  * Unauthorized
8078
8977
  */
8079
- 401: ApiProblemResponseDto;
8080
- /**
8081
- * Forbidden - not owner of rule
8082
- */
8083
- 403: ApiProblemResponseDto;
8084
- /**
8085
- * Rule not found
8086
- */
8087
- 404: ApiProblemResponseDto;
8978
+ 401: unknown;
8088
8979
  /**
8089
- * Resource conflict - rule is being modified by another process
8980
+ * Forbidden - insufficient permissions
8090
8981
  */
8091
- 409: ApiProblemResponseDto;
8982
+ 403: unknown;
8092
8983
  };
8093
8984
  };
8094
- delete: {
8095
- req: TransactionRuleControllerDeleteData;
8985
+ };
8986
+ '/api/v1/admin/properties/{key}': {
8987
+ get: {
8988
+ req: PropertyControllerGetByKeyData;
8096
8989
  res: {
8097
8990
  /**
8098
- * Rule deleted successfully
8991
+ * Property retrieved successfully
8099
8992
  */
8100
- 204: void;
8993
+ 200: unknown;
8101
8994
  /**
8102
8995
  * Unauthorized
8103
8996
  */
8104
- 401: ApiProblemResponseDto;
8105
- /**
8106
- * Forbidden - not owner of rule
8107
- */
8108
- 403: ApiProblemResponseDto;
8997
+ 401: unknown;
8109
8998
  /**
8110
- * Rule not found
8999
+ * Forbidden - insufficient permissions
8111
9000
  */
8112
- 404: ApiProblemResponseDto;
9001
+ 403: unknown;
8113
9002
  /**
8114
- * Resource conflict - rule is being modified by another process
9003
+ * Property not found
8115
9004
  */
8116
- 409: ApiProblemResponseDto;
9005
+ 404: unknown;
8117
9006
  };
8118
9007
  };
8119
- };
8120
- '/api/v1/{region}/bean/transaction-rules/{ruleId}/test': {
8121
- post: {
8122
- req: TransactionRuleControllerTestData;
9008
+ put: {
9009
+ req: PropertyControllerUpdateData;
8123
9010
  res: {
8124
9011
  /**
8125
- * Test result
9012
+ * Property updated successfully
8126
9013
  */
8127
- 200: TestRuleResponseDto;
9014
+ 200: unknown;
8128
9015
  /**
8129
9016
  * Unauthorized
8130
9017
  */
8131
- 401: ApiProblemResponseDto;
8132
- /**
8133
- * Forbidden - not owner of rule
8134
- */
8135
- 403: ApiProblemResponseDto;
9018
+ 401: unknown;
8136
9019
  /**
8137
- * Rule not found
9020
+ * Forbidden - insufficient permissions
8138
9021
  */
8139
- 404: ApiProblemResponseDto;
9022
+ 403: unknown;
8140
9023
  };
8141
9024
  };
8142
- };
8143
- '/api/v1/users': {
8144
9025
  delete: {
8145
- req: UserControllerDeleteOwnUserData;
9026
+ req: PropertyControllerDeleteData;
8146
9027
  res: {
8147
9028
  /**
8148
- * User deleted successfully
9029
+ * Property deleted successfully
8149
9030
  */
8150
9031
  204: void;
8151
9032
  /**
8152
- * Invalid access token
9033
+ * Unauthorized
9034
+ */
9035
+ 401: unknown;
9036
+ /**
9037
+ * Forbidden - insufficient permissions
8153
9038
  */
8154
9039
  403: unknown;
8155
- };
8156
- };
8157
- get: {
8158
- req: UserControllerGetUserData;
8159
- res: {
8160
9040
  /**
8161
- * User retrieved successfully
9041
+ * Property not found
8162
9042
  */
8163
- 200: unknown;
9043
+ 404: unknown;
8164
9044
  };
8165
9045
  };
9046
+ };
9047
+ '/api/v1/{region}/bean/transaction-rules': {
8166
9048
  post: {
8167
- req: UserControllerSignupUserData;
9049
+ req: TransactionRuleControllerCreateData;
8168
9050
  res: {
8169
9051
  /**
8170
- * User created successfully
9052
+ * Rule updated successfully (upsert mode)
8171
9053
  */
8172
- 201: unknown;
9054
+ 200: TransactionRuleResponseDto;
8173
9055
  /**
8174
- * Invalid Turnstile token (when Turnstile is enabled)
9056
+ * Validation failed
8175
9057
  */
8176
- 400: unknown;
9058
+ 400: ApiProblemResponseDto;
8177
9059
  /**
8178
- * User signup is disabled
9060
+ * Unauthorized
8179
9061
  */
8180
- 403: unknown;
9062
+ 401: ApiProblemResponseDto;
9063
+ /**
9064
+ * Resource conflict - another process is updating this rule
9065
+ */
9066
+ 409: ApiProblemResponseDto;
8181
9067
  };
8182
9068
  };
8183
- };
8184
- '/api/v1/users/{id}': {
8185
- delete: {
8186
- req: UserControllerDeleteUserData;
9069
+ get: {
9070
+ req: TransactionRuleControllerListData;
8187
9071
  res: {
8188
9072
  /**
8189
- * User deleted successfully
9073
+ * List of rules
8190
9074
  */
8191
- 204: void;
9075
+ 200: TransactionRuleListResponseDto;
8192
9076
  /**
8193
- * Cannot delete own account or insufficient permissions
9077
+ * Unauthorized
8194
9078
  */
8195
- 403: unknown;
9079
+ 401: ApiProblemResponseDto;
8196
9080
  };
8197
9081
  };
8198
9082
  };
8199
- '/api/v1/users/{id}/info': {
8200
- get: {
8201
- req: UserControllerGetUserInfoData;
9083
+ '/api/v1/{region}/bean/transaction-rules/validate': {
9084
+ post: {
9085
+ req: TransactionRuleControllerValidateData;
8202
9086
  res: {
8203
9087
  /**
8204
- * User info retrieved successfully
9088
+ * Validation result
8205
9089
  */
8206
- 200: unknown;
9090
+ 200: ValidateRuleResponseDto;
8207
9091
  /**
8208
- * Cannot access other user info without admin permission
9092
+ * Validation failed
8209
9093
  */
8210
- 403: unknown;
9094
+ 400: ApiProblemResponseDto;
9095
+ /**
9096
+ * Unauthorized
9097
+ */
9098
+ 401: ApiProblemResponseDto;
8211
9099
  };
8212
9100
  };
8213
9101
  };
8214
- '/api/v1/users/setting': {
8215
- put: {
8216
- req: UserControllerUpdateUserSettingData;
9102
+ '/api/v1/{region}/bean/transaction-rules/bulk': {
9103
+ post: {
9104
+ req: TransactionRuleControllerBulkCreateData;
8217
9105
  res: {
8218
9106
  /**
8219
- * Settings updated successfully
9107
+ * Bulk create completed
8220
9108
  */
8221
- 200: unknown;
9109
+ 201: BulkCreateRulesResponseDto;
8222
9110
  /**
8223
- * Insufficient permissions
9111
+ * Invalid bulk create data
8224
9112
  */
8225
- 403: unknown;
9113
+ 400: ApiProblemResponseDto;
9114
+ /**
9115
+ * Unauthorized
9116
+ */
9117
+ 401: ApiProblemResponseDto;
8226
9118
  };
8227
9119
  };
8228
9120
  };
8229
- '/api/v1/users/settings-by-page': {
9121
+ '/api/v1/{region}/bean/transaction-rules/export/{format}': {
8230
9122
  get: {
8231
- req: UserControllerGetAllUserSettingsByPageData;
9123
+ req: TransactionRuleControllerExportData;
8232
9124
  res: {
8233
9125
  /**
8234
- * Settings list retrieved successfully
9126
+ * Exported rules
8235
9127
  */
8236
- 200: unknown;
9128
+ 200: ExportRulesResponseDto;
9129
+ /**
9130
+ * Unsupported format
9131
+ */
9132
+ 400: ApiProblemResponseDto;
9133
+ /**
9134
+ * Unauthorized
9135
+ */
9136
+ 401: ApiProblemResponseDto;
8237
9137
  };
8238
9138
  };
8239
9139
  };
8240
- '/api/v1/users/asset-liability-summary': {
9140
+ '/api/v1/{region}/bean/transaction-rules/statistics/{period}': {
8241
9141
  get: {
9142
+ req: TransactionRuleControllerGetStatisticsData;
8242
9143
  res: {
8243
9144
  /**
8244
- * Summary retrieved successfully
9145
+ * Rule statistics
8245
9146
  */
8246
- 200: unknown;
9147
+ 200: RuleStatisticsResponseDto;
9148
+ /**
9149
+ * Unauthorized
9150
+ */
9151
+ 401: ApiProblemResponseDto;
8247
9152
  };
8248
9153
  };
8249
9154
  };
8250
- '/api/v1/admin/properties': {
9155
+ '/api/v1/{region}/bean/transaction-rules/{ruleId}': {
8251
9156
  get: {
9157
+ req: TransactionRuleControllerGetDetailData;
8252
9158
  res: {
8253
9159
  /**
8254
- * Properties retrieved successfully
9160
+ * Rule details
8255
9161
  */
8256
- 200: unknown;
9162
+ 200: TransactionRuleResponseDto;
8257
9163
  /**
8258
9164
  * Unauthorized
8259
9165
  */
8260
- 401: unknown;
9166
+ 401: ApiProblemResponseDto;
8261
9167
  /**
8262
- * Forbidden - insufficient permissions
9168
+ * Forbidden - not owner of rule
8263
9169
  */
8264
- 403: unknown;
9170
+ 403: ApiProblemResponseDto;
9171
+ /**
9172
+ * Rule not found
9173
+ */
9174
+ 404: ApiProblemResponseDto;
8265
9175
  };
8266
9176
  };
8267
- };
8268
- '/api/v1/admin/properties/{key}': {
8269
- get: {
8270
- req: PropertyControllerGetByKeyData;
9177
+ put: {
9178
+ req: TransactionRuleControllerUpdateData;
8271
9179
  res: {
8272
9180
  /**
8273
- * Property retrieved successfully
9181
+ * Rule updated successfully
8274
9182
  */
8275
- 200: unknown;
9183
+ 200: TransactionRuleResponseDto;
9184
+ /**
9185
+ * Validation failed
9186
+ */
9187
+ 400: ApiProblemResponseDto;
8276
9188
  /**
8277
9189
  * Unauthorized
8278
9190
  */
8279
- 401: unknown;
9191
+ 401: ApiProblemResponseDto;
8280
9192
  /**
8281
- * Forbidden - insufficient permissions
9193
+ * Forbidden - not owner of rule
8282
9194
  */
8283
- 403: unknown;
9195
+ 403: ApiProblemResponseDto;
8284
9196
  /**
8285
- * Property not found
9197
+ * Rule not found
8286
9198
  */
8287
- 404: unknown;
9199
+ 404: ApiProblemResponseDto;
9200
+ /**
9201
+ * Resource conflict - rule is being modified by another process
9202
+ */
9203
+ 409: ApiProblemResponseDto;
8288
9204
  };
8289
9205
  };
8290
- put: {
8291
- req: PropertyControllerUpdateData;
9206
+ delete: {
9207
+ req: TransactionRuleControllerDeleteData;
8292
9208
  res: {
8293
9209
  /**
8294
- * Property updated successfully
9210
+ * Rule deleted successfully
8295
9211
  */
8296
- 200: unknown;
9212
+ 204: void;
8297
9213
  /**
8298
9214
  * Unauthorized
8299
9215
  */
8300
- 401: unknown;
9216
+ 401: ApiProblemResponseDto;
8301
9217
  /**
8302
- * Forbidden - insufficient permissions
9218
+ * Forbidden - not owner of rule
8303
9219
  */
8304
- 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;
8305
9229
  };
8306
9230
  };
8307
- delete: {
8308
- req: PropertyControllerDeleteData;
9231
+ };
9232
+ '/api/v1/{region}/bean/transaction-rules/{ruleId}/test': {
9233
+ post: {
9234
+ req: TransactionRuleControllerTestData;
8309
9235
  res: {
8310
9236
  /**
8311
- * Property deleted successfully
9237
+ * Test result
8312
9238
  */
8313
- 204: void;
9239
+ 200: TestRuleResponseDto;
8314
9240
  /**
8315
9241
  * Unauthorized
8316
9242
  */
8317
- 401: unknown;
9243
+ 401: ApiProblemResponseDto;
8318
9244
  /**
8319
- * Forbidden - insufficient permissions
9245
+ * Forbidden - not owner of rule
8320
9246
  */
8321
- 403: unknown;
9247
+ 403: ApiProblemResponseDto;
8322
9248
  /**
8323
- * Property not found
9249
+ * Rule not found
8324
9250
  */
8325
- 404: unknown;
9251
+ 404: ApiProblemResponseDto;
8326
9252
  };
8327
9253
  };
8328
9254
  };
@@ -8422,6 +9348,85 @@ export type $OpenApiTs = {
8422
9348
  };
8423
9349
  };
8424
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
+ };
8425
9430
  '/api/v1/{region}/bean/export/beancount': {
8426
9431
  get: {
8427
9432
  res: {
@@ -8564,83 +9569,11 @@ export type $OpenApiTs = {
8564
9569
  /**
8565
9570
  * Configuration reset successfully
8566
9571
  */
8567
- 200: ImporterConfigDto;
8568
- /**
8569
- * Invalid input - Unsupported importer
8570
- */
8571
- 400: ApiProblemResponseDto;
8572
- };
8573
- };
8574
- };
8575
- '/api/v1/bean/platforms': {
8576
- get: {
8577
- res: {
8578
- /**
8579
- * List of platforms with binding and account counts
8580
- */
8581
- 200: unknown;
8582
- };
8583
- };
8584
- post: {
8585
- req: PlatformControllerCreateData;
8586
- res: {
8587
- /**
8588
- * Platform created successfully
8589
- */
8590
- 201: unknown;
8591
- /**
8592
- * Platform already exists
8593
- */
8594
- 409: unknown;
8595
- };
8596
- };
8597
- };
8598
- '/api/v1/bean/platforms/list': {
8599
- get: {
8600
- res: {
8601
- /**
8602
- * List of platforms with user binding status
8603
- */
8604
- 200: unknown;
8605
- };
8606
- };
8607
- };
8608
- '/api/v1/bean/platforms/match': {
8609
- get: {
8610
- req: PlatformControllerMatchPlatformsData;
8611
- res: {
8612
- /**
8613
- * List of matching platforms with suggested segment names
8614
- */
8615
- 200: unknown;
8616
- };
8617
- };
8618
- };
8619
- '/api/v1/bean/platforms/{id}': {
8620
- put: {
8621
- req: PlatformControllerUpdateData;
8622
- res: {
8623
- /**
8624
- * Platform updated successfully
8625
- */
8626
- 200: unknown;
8627
- /**
8628
- * Platform not found
8629
- */
8630
- 404: unknown;
8631
- };
8632
- };
8633
- delete: {
8634
- req: PlatformControllerDeleteData;
8635
- res: {
8636
- /**
8637
- * Platform deleted successfully
8638
- */
8639
- 204: void;
9572
+ 200: ImporterConfigDto;
8640
9573
  /**
8641
- * Platform not found
9574
+ * Invalid input - Unsupported importer
8642
9575
  */
8643
- 404: unknown;
9576
+ 400: ApiProblemResponseDto;
8644
9577
  };
8645
9578
  };
8646
9579
  };
@@ -8697,6 +9630,54 @@ export type $OpenApiTs = {
8697
9630
  };
8698
9631
  };
8699
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
+ };
8700
9681
  '/api/v1/{region}/bean/import/parser-telemetry': {
8701
9682
  post: {
8702
9683
  req: TelemetryControllerReportTelemetryData;
@@ -8785,188 +9766,104 @@ export type $OpenApiTs = {
8785
9766
  };
8786
9767
  };
8787
9768
  };
8788
- '/api/v1/{region}/dashboard/net-worth': {
8789
- get: {
8790
- req: DashboardControllerGetNetWorthData;
8791
- res: {
8792
- /**
8793
- * Net worth retrieved successfully
8794
- */
8795
- 200: NetWorthResponseDto;
8796
- /**
8797
- * User not authenticated
8798
- */
8799
- 401: unknown;
8800
- };
8801
- };
8802
- };
8803
- '/api/v1/{region}/dashboard/accounts': {
8804
- get: {
8805
- req: DashboardControllerGetAccountsData;
8806
- res: {
8807
- /**
8808
- * Accounts retrieved successfully. Response type depends on groupBy parameter.
8809
- */
8810
- 200:
8811
- | AccountsResponseDto
8812
- | AssetClassAccountsResponseDto
8813
- | HoldingAssetClassCrossAccountResponseDto;
8814
- /**
8815
- * User not authenticated
8816
- */
8817
- 401: unknown;
8818
- };
8819
- };
8820
- };
8821
- '/api/v1/{region}/dashboard/cash-flow': {
8822
- get: {
8823
- req: DashboardControllerGetCashFlowData;
8824
- res: {
8825
- /**
8826
- * Cash flow retrieved successfully
8827
- */
8828
- 200: CashFlowResponseDto;
8829
- /**
8830
- * Invalid period format
8831
- */
8832
- 400: unknown;
8833
- /**
8834
- * User not authenticated
8835
- */
8836
- 401: unknown;
8837
- };
8838
- };
8839
- };
8840
- '/api/v1/{region}/dashboard/expenses': {
8841
- get: {
8842
- req: DashboardControllerGetExpensesData;
8843
- res: {
8844
- /**
8845
- * Expenses retrieved successfully
8846
- */
8847
- 200: ExpensesByCategoryResponseDto;
8848
- /**
8849
- * Invalid groupBy or period
8850
- */
8851
- 400: unknown;
8852
- /**
8853
- * User not authenticated
8854
- */
8855
- 401: unknown;
8856
- };
8857
- };
8858
- };
8859
- '/api/v1/{region}/investment/holdings/pnl': {
9769
+ '/api/v1/bean/platforms': {
8860
9770
  get: {
8861
- req: HoldingPnlControllerGetHoldingPnlData;
8862
9771
  res: {
8863
9772
  /**
8864
- * Holding P&L retrieved successfully
8865
- */
8866
- 200: HoldingPnlResponseDto;
8867
- /**
8868
- * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
8869
- */
8870
- 400: unknown;
8871
- /**
8872
- * User not authenticated
9773
+ * List of platforms with binding and account counts
8873
9774
  */
8874
- 401: unknown;
9775
+ 200: unknown;
8875
9776
  };
8876
9777
  };
8877
- };
8878
- '/api/v1/{region}/bean/prices': {
8879
9778
  post: {
8880
- req: PriceControllerCreateData;
9779
+ req: PlatformControllerCreateData;
8881
9780
  res: {
8882
9781
  /**
8883
- * Price created successfully
8884
- */
8885
- 201: PriceResponseDto;
8886
- /**
8887
- * Currency or quoteCurrency commodity not found
9782
+ * Platform created successfully
8888
9783
  */
8889
- 404: unknown;
9784
+ 201: unknown;
8890
9785
  /**
8891
- * Price already exists for this currency pair and date
9786
+ * Platform already exists
8892
9787
  */
8893
9788
  409: unknown;
8894
9789
  };
8895
9790
  };
9791
+ };
9792
+ '/api/v1/bean/platforms/list': {
8896
9793
  get: {
8897
- req: PriceControllerFindAllData;
8898
9794
  res: {
8899
9795
  /**
8900
- * Prices retrieved successfully
9796
+ * List of platforms with user binding status
8901
9797
  */
8902
- 200: PriceListResponseDto;
9798
+ 200: Array<PlatformListItemDto>;
8903
9799
  };
8904
9800
  };
8905
9801
  };
8906
- '/api/v1/{region}/bean/prices/{id}': {
9802
+ '/api/v1/bean/platforms/match': {
8907
9803
  get: {
8908
- req: PriceControllerFindOneData;
9804
+ req: PlatformControllerMatchPlatformsData;
8909
9805
  res: {
8910
9806
  /**
8911
- * Price retrieved successfully
8912
- */
8913
- 200: PriceResponseDto;
8914
- /**
8915
- * Price not found
9807
+ * Matching platforms with overall match type and truncation flag
8916
9808
  */
8917
- 404: unknown;
9809
+ 200: PlatformMatchResponseDto;
8918
9810
  };
8919
9811
  };
9812
+ };
9813
+ '/api/v1/bean/platforms/{id}': {
8920
9814
  put: {
8921
- req: PriceControllerUpdateData;
9815
+ req: PlatformControllerUpdateData;
8922
9816
  res: {
8923
9817
  /**
8924
- * Price updated successfully
9818
+ * Platform updated successfully
8925
9819
  */
8926
- 200: PriceResponseDto;
9820
+ 200: unknown;
8927
9821
  /**
8928
- * Price not found
9822
+ * Platform not found
8929
9823
  */
8930
9824
  404: unknown;
8931
- /**
8932
- * Updated price conflicts with existing price
8933
- */
8934
- 409: unknown;
8935
9825
  };
8936
9826
  };
8937
9827
  delete: {
8938
- req: PriceControllerDeleteData;
9828
+ req: PlatformControllerDeleteData;
8939
9829
  res: {
8940
9830
  /**
8941
- * Price deleted successfully
9831
+ * Platform deleted successfully
8942
9832
  */
8943
9833
  204: void;
8944
9834
  /**
8945
- * Price not found
9835
+ * Platform not found
8946
9836
  */
8947
9837
  404: unknown;
8948
9838
  };
8949
9839
  };
8950
9840
  };
8951
- '/api/v1/{region}/bean/prices/bulk': {
8952
- post: {
8953
- req: PriceControllerBulkCreateData;
9841
+ '/api/v1/{region}/dashboard/net-worth': {
9842
+ get: {
9843
+ req: DashboardControllerGetNetWorthData;
8954
9844
  res: {
8955
9845
  /**
8956
- * Prices created successfully
9846
+ * Net worth retrieved successfully
8957
9847
  */
8958
- 201: Array<PriceResponseDto>;
9848
+ 200: NetWorthResponseDto;
9849
+ /**
9850
+ * User not authenticated
9851
+ */
9852
+ 401: unknown;
8959
9853
  };
8960
9854
  };
8961
9855
  };
8962
- '/api/v1/{region}/reporting/portfolio/trends': {
9856
+ '/api/v1/{region}/dashboard/accounts': {
8963
9857
  get: {
8964
- req: ReportingControllerGetPortfolioTrendsData;
9858
+ req: DashboardControllerGetAccountsData;
8965
9859
  res: {
8966
9860
  /**
8967
- * Trends retrieved successfully
9861
+ * Accounts retrieved successfully. Response type depends on groupBy parameter.
8968
9862
  */
8969
- 200: PortfolioTrendsResponseDto;
9863
+ 200:
9864
+ | AccountsResponseDto
9865
+ | AssetClassAccountsResponseDto
9866
+ | HoldingAssetClassCrossAccountResponseDto;
8970
9867
  /**
8971
9868
  * User not authenticated
8972
9869
  */
@@ -8974,14 +9871,18 @@ export type $OpenApiTs = {
8974
9871
  };
8975
9872
  };
8976
9873
  };
8977
- '/api/v1/{region}/reporting/cash-flow/trends': {
9874
+ '/api/v1/{region}/dashboard/cash-flow': {
8978
9875
  get: {
8979
- req: ReportingControllerGetCashFlowTrendsData;
9876
+ req: DashboardControllerGetCashFlowData;
8980
9877
  res: {
8981
9878
  /**
8982
- * Cash-flow trends retrieved successfully
9879
+ * Cash flow retrieved successfully
8983
9880
  */
8984
- 200: CashFlowTrendsResponseDto;
9881
+ 200: CashFlowResponseDto;
9882
+ /**
9883
+ * Invalid period format
9884
+ */
9885
+ 400: unknown;
8985
9886
  /**
8986
9887
  * User not authenticated
8987
9888
  */
@@ -8989,16 +9890,16 @@ export type $OpenApiTs = {
8989
9890
  };
8990
9891
  };
8991
9892
  };
8992
- '/api/v1/{region}/reporting/snapshots/generate': {
8993
- post: {
8994
- req: ReportingControllerGenerateSnapshotData;
9893
+ '/api/v1/{region}/dashboard/expenses': {
9894
+ get: {
9895
+ req: DashboardControllerGetExpensesData;
8995
9896
  res: {
8996
9897
  /**
8997
- * Snapshot generated successfully
9898
+ * Expenses retrieved successfully
8998
9899
  */
8999
- 200: GenerateSnapshotResponse;
9900
+ 200: ExpensesByCategoryResponseDto;
9000
9901
  /**
9001
- * Invalid date format
9902
+ * Invalid groupBy or period
9002
9903
  */
9003
9904
  400: unknown;
9004
9905
  /**
@@ -9008,26 +9909,22 @@ export type $OpenApiTs = {
9008
9909
  };
9009
9910
  };
9010
9911
  };
9011
- '/api/v1/{region}/reporting/snapshots/backfill': {
9012
- post: {
9013
- req: ReportingControllerBackfillSnapshotsData;
9912
+ '/api/v1/{region}/investment/holdings/pnl': {
9913
+ get: {
9914
+ req: HoldingPnlControllerGetHoldingPnlData;
9014
9915
  res: {
9015
9916
  /**
9016
- * Backfill completed successfully
9917
+ * Holding P&L retrieved successfully
9017
9918
  */
9018
- 200: BackfillSnapshotsResponse;
9919
+ 200: HoldingPnlResponseDto;
9019
9920
  /**
9020
- * Invalid date format or range
9921
+ * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
9021
9922
  */
9022
9923
  400: unknown;
9023
9924
  /**
9024
9925
  * User not authenticated
9025
9926
  */
9026
9927
  401: unknown;
9027
- /**
9028
- * Backfill already in progress for this user
9029
- */
9030
- 409: unknown;
9031
9928
  };
9032
9929
  };
9033
9930
  };
@@ -9052,7 +9949,7 @@ export type $OpenApiTs = {
9052
9949
  /**
9053
9950
  * Login successful
9054
9951
  */
9055
- 200: unknown;
9952
+ 200: AnonymousLoginResponseDto;
9056
9953
  /**
9057
9954
  * Invalid access token
9058
9955
  */
@@ -9199,4 +10096,30 @@ export type $OpenApiTs = {
9199
10096
  };
9200
10097
  };
9201
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
+ };
9202
10125
  };