@firela/api-types 0.0.0-canary.32edff08 → 0.0.0-canary.3d558482

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,10 +69,6 @@ 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
  */
@@ -121,17 +109,17 @@ export type AccountResponseDto = {
121
109
  */
122
110
  isCustom: boolean;
123
111
  /**
124
- * i18n key for display name
112
+ * Localized display name (ADR-0114, read-time projection)
125
113
  */
126
- i18nKey?: string;
114
+ displayName?: string;
127
115
  /**
128
116
  * Icon identifier
129
117
  */
130
118
  icon?: string;
131
119
  /**
132
- * Account metadata
120
+ * Open directive metadata (ADR-0115 Decision 9)
133
121
  */
134
- openMeta?: {
122
+ openDirectiveMeta?: {
135
123
  [key: string]: unknown;
136
124
  };
137
125
  /**
@@ -178,10 +166,6 @@ export type AccountListResponseDto = {
178
166
  };
179
167
 
180
168
  export type UpdateAccountDto = {
181
- /**
182
- * Display name to distinguish accounts at the same path
183
- */
184
- displayName?: string;
185
169
  /**
186
170
  * Allowed currencies (null = no restriction)
187
171
  */
@@ -197,18 +181,14 @@ export type UpdateAccountDto = {
197
181
  | 'STRICT'
198
182
  | 'STRICT_WITH_SIZE'
199
183
  | 'NONE';
200
- /**
201
- * i18n key for display name
202
- */
203
- i18nKey?: string;
204
184
  /**
205
185
  * Icon identifier
206
186
  */
207
187
  icon?: string;
208
188
  /**
209
- * Additional metadata (merged with existing)
189
+ * Open directive metadata (merged with existing; NOT an opening-balance amount)
210
190
  */
211
- openMeta?: {
191
+ openDirectiveMeta?: {
212
192
  [key: string]: unknown;
213
193
  };
214
194
  /**
@@ -237,6 +217,28 @@ export type ReopenAccountDto = {
237
217
  reopenDate?: string;
238
218
  };
239
219
 
220
+ export type CreateOpeningBalanceDto = {
221
+ /**
222
+ * Opening balance amount (non-negative)
223
+ */
224
+ amount: number;
225
+ /**
226
+ * Currency code
227
+ */
228
+ currency: string;
229
+ /**
230
+ * Opening-balance date (defaults to now)
231
+ */
232
+ date?: string;
233
+ };
234
+
235
+ export type OpeningBalanceResultDto = {
236
+ /**
237
+ * Created opening-balance transaction id.
238
+ */
239
+ transactionId: string;
240
+ };
241
+
240
242
  export type AccountStandardResponseDto = {
241
243
  /**
242
244
  * Account path (hierarchical, colon-separated)
@@ -246,10 +248,6 @@ export type AccountStandardResponseDto = {
246
248
  * Account type in Beancount hierarchy
247
249
  */
248
250
  type: 'Assets' | 'Liabilities' | 'Income' | 'Expenses' | 'Equity';
249
- /**
250
- * i18n key for localized display name
251
- */
252
- i18nKey: string;
253
251
  /**
254
252
  * Short localized display name
255
253
  */
@@ -284,10 +282,6 @@ export type AccountStandardListResponseDto = {
284
282
  };
285
283
 
286
284
  export type TemplateMetadataDto = {
287
- /**
288
- * Whether this path can be extended
289
- */
290
- extendable: boolean;
291
285
  /**
292
286
  * Root account type
293
287
  */
@@ -316,6 +310,53 @@ export type RegionsMetadataResponseDto = {
316
310
  regions: Array<RegionInfoDto>;
317
311
  };
318
312
 
313
+ export type CostSpecDto = {
314
+ /**
315
+ * Cost specification mode (mirrors engine CostSpec)
316
+ */
317
+ mode: 'per-unit' | 'total' | 'date' | 'label' | 'auto';
318
+ /**
319
+ * Per-unit cost (required when mode is "per-unit")
320
+ */
321
+ numberPerUnit?: string;
322
+ /**
323
+ * Total cost for all units (required when mode is "total")
324
+ */
325
+ totalNumber?: string;
326
+ /**
327
+ * Cost currency (required in all modes)
328
+ */
329
+ currency: string;
330
+ /**
331
+ * Lot acquisition date, ISO 8601 (required when mode is "date")
332
+ */
333
+ date?: string;
334
+ /**
335
+ * Lot label (required when mode is "label"; optional tag in buy modes)
336
+ */
337
+ label?: string;
338
+ /**
339
+ * Merge lots for AVERAGE booking (mode: auto)
340
+ */
341
+ merge?: boolean;
342
+ };
343
+
344
+ /**
345
+ * Cost specification mode (mirrors engine CostSpec)
346
+ */
347
+ export type mode = 'per-unit' | 'total' | 'date' | 'label' | 'auto';
348
+
349
+ export type AmountDto = {
350
+ /**
351
+ * Amount as decimal string (max 15 integer + 15 decimal digits)
352
+ */
353
+ number: string;
354
+ /**
355
+ * Currency/commodity code
356
+ */
357
+ currency: string;
358
+ };
359
+
319
360
  export type CreatePostingDto = {
320
361
  /**
321
362
  * Account name in Beancount format (must start with uppercase, colon-separated)
@@ -335,6 +376,14 @@ export type CreatePostingDto = {
335
376
  meta?: {
336
377
  [key: string]: unknown;
337
378
  };
379
+ /**
380
+ * Cost basis (Beancount `{...}`). Maps to engine costSpec. Required for commodity holdings so they carry a monetary weight that can balance.
381
+ */
382
+ cost?: CostSpecDto;
383
+ /**
384
+ * Price annotation (Beancount `@...`). Maps to engine price. Used for valuation; cost takes priority for balance weight.
385
+ */
386
+ price?: AmountDto;
338
387
  };
339
388
 
340
389
  export type CreateTransactionDto = {
@@ -387,6 +436,25 @@ export type CreateTransactionDto = {
387
436
  */
388
437
  export type flag = '*' | '!';
389
438
 
439
+ export type CostDetailDto = {
440
+ /**
441
+ * Per-unit cost basis (mirrors engine Cost.number)
442
+ */
443
+ number?: string;
444
+ /**
445
+ * Cost currency
446
+ */
447
+ currency?: string;
448
+ /**
449
+ * Lot acquisition date (ISO yyyy-mm-dd)
450
+ */
451
+ date?: string;
452
+ /**
453
+ * Lot label
454
+ */
455
+ label?: string;
456
+ };
457
+
390
458
  export type PostingResponseDto = {
391
459
  /**
392
460
  * Account name
@@ -400,6 +468,10 @@ export type PostingResponseDto = {
400
468
  * Currency
401
469
  */
402
470
  currency?: string;
471
+ /**
472
+ * Booking-resolved cost (mirrors engine Cost). Undefined when the posting has no cost basis.
473
+ */
474
+ cost?: CostDetailDto;
403
475
  };
404
476
 
405
477
  export type RecurringSuggestionDto = {
@@ -561,6 +633,55 @@ export type BatchTransactionResponseDto = {
561
633
  failed: Array<BatchTransactionErrorDto>;
562
634
  };
563
635
 
636
+ export type CorrectTransactionDto = {
637
+ /**
638
+ * Transaction date (ISO 8601 format)
639
+ */
640
+ date: string;
641
+ /**
642
+ * Transaction flag: * (cleared), ! (pending)
643
+ */
644
+ flag?: '*' | '!';
645
+ /**
646
+ * Payee name
647
+ */
648
+ payee?: string;
649
+ /**
650
+ * Transaction narration/description
651
+ */
652
+ narration: string;
653
+ /**
654
+ * Transaction tags (without # prefix)
655
+ */
656
+ tags?: Array<string>;
657
+ /**
658
+ * Transaction links (without ^ prefix)
659
+ */
660
+ links?: Array<string>;
661
+ /**
662
+ * Transaction postings (minimum 1, typically 2 for double-entry)
663
+ */
664
+ postings: Array<CreatePostingDto>;
665
+ /**
666
+ * Transaction-level metadata
667
+ */
668
+ meta?: {
669
+ [key: string]: unknown;
670
+ };
671
+ /**
672
+ * Unique key for idempotent transaction creation. If provided, duplicate requests with the same key will return the existing transaction.
673
+ */
674
+ idempotencyKey?: string;
675
+ /**
676
+ * Auto-create accounts if not found. When true, missing accounts will be automatically created. When false (default for API), missing accounts will cause a validation error. Set to true for quick entry scenarios where you want to create accounts on-the-fly.
677
+ */
678
+ autoCreateAccounts?: boolean;
679
+ /**
680
+ * Reason for correcting/superseding the original transaction
681
+ */
682
+ correctionReason?: string;
683
+ };
684
+
564
685
  export type PostingDetailDto = {
565
686
  /**
566
687
  * Posting ID
@@ -571,9 +692,9 @@ export type PostingDetailDto = {
571
692
  */
572
693
  accountId: string;
573
694
  /**
574
- * Account name
695
+ * Fully-qualified Beancount account path
575
696
  */
576
- accountName: string;
697
+ account: string;
577
698
  /**
578
699
  * Amount as decimal string. Typed optional but always present in responses: interpolation fills any MISSING posting before it is persisted or returned.
579
700
  */
@@ -594,6 +715,10 @@ export type PostingDetailDto = {
594
715
  * Cost date
595
716
  */
596
717
  costDate?: string;
718
+ /**
719
+ * Booking-resolved cost (mirrors engine Cost). Undefined when the posting has no cost basis.
720
+ */
721
+ cost?: CostDetailDto;
597
722
  /**
598
723
  * Price amount
599
724
  */
@@ -691,6 +816,14 @@ export type TransactionDetailDto = {
691
816
  * Correction reason (if voided or superseded)
692
817
  */
693
818
  correctionReason?: string;
819
+ /**
820
+ * ID of the transaction that supersedes this one (set when status=SUPERSEDED)
821
+ */
822
+ supersededBy?: string;
823
+ /**
824
+ * ID of the transaction this one corrected/replaced (back-link on the replacement)
825
+ */
826
+ originalTxn?: string;
694
827
  };
695
828
 
696
829
  /**
@@ -709,6 +842,51 @@ export type flag2 =
709
842
  */
710
843
  export type status2 = 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
711
844
 
845
+ export type BalanceByCurrencyDto = {
846
+ /**
847
+ * ISO 4217 currency code
848
+ */
849
+ currency: string;
850
+ /**
851
+ * Balance amount
852
+ */
853
+ balance: string;
854
+ };
855
+
856
+ export type ExchangeRateWarningDto = {
857
+ /**
858
+ * Warning type
859
+ */
860
+ type: string;
861
+ /**
862
+ * Currency without exchange rate
863
+ */
864
+ currency: string;
865
+ /**
866
+ * Total amount affected
867
+ */
868
+ totalAmount: string;
869
+ };
870
+
871
+ export type TransactionListSummaryDto = {
872
+ /**
873
+ * 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.
874
+ */
875
+ totalAmount: string;
876
+ /**
877
+ * Base currency (ISO 4217)
878
+ */
879
+ currency: string;
880
+ /**
881
+ * Raw (unconverted) balance per currency
882
+ */
883
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
884
+ /**
885
+ * Currencies missing an FX rate (omitted when empty)
886
+ */
887
+ warnings?: Array<ExchangeRateWarningDto>;
888
+ };
889
+
712
890
  export type TransactionListResponseDto = {
713
891
  /**
714
892
  * List of transactions
@@ -726,6 +904,10 @@ export type TransactionListResponseDto = {
726
904
  * Number of items skipped
727
905
  */
728
906
  offset: number;
907
+ /**
908
+ * 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.
909
+ */
910
+ summary?: TransactionListSummaryDto;
729
911
  };
730
912
 
731
913
  export type TagSuggestionDto = {
@@ -1185,17 +1367,17 @@ export type ResolveResultDto = {
1185
1367
  [key: string]: string;
1186
1368
  };
1187
1369
  /**
1188
- * Resolution ID for undo
1370
+ * Resolution ID for undo. Absent when the resolver rejected the decision (review stayed PENDING).
1189
1371
  */
1190
- resolutionId: string;
1372
+ resolutionId?: string;
1191
1373
  /**
1192
1374
  * Whether this decision can be undone
1193
1375
  */
1194
- canUndo: boolean;
1376
+ canUndo?: boolean;
1195
1377
  /**
1196
1378
  * Deadline for undo (24h from resolution)
1197
1379
  */
1198
- undoDeadline: string;
1380
+ undoDeadline?: string;
1199
1381
  /**
1200
1382
  * Rule ID if learning was triggered (ACCEPT_AND_LEARN actions). Use this to deep-link to the rule management page.
1201
1383
  */
@@ -1778,85 +1960,187 @@ export type UpdateCommodityDto = {
1778
1960
  };
1779
1961
  };
1780
1962
 
1781
- export type CreateRecurringRuleDto = {
1963
+ export type CreateBeanPriceDto = {
1782
1964
  /**
1783
- * Rule name (unique per user)
1965
+ * Currency being priced (e.g., USD, AAPL, BTC)
1784
1966
  */
1785
- name: string;
1967
+ currency: string;
1786
1968
  /**
1787
- * Icon emoji
1969
+ * Quote currency (pricing currency, e.g., CNY, EUR)
1788
1970
  */
1789
- icon?: string;
1971
+ quoteCurrency: string;
1790
1972
  /**
1791
- * Recurring frequency
1973
+ * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
1792
1974
  */
1793
- frequency:
1794
- | 'WEEKLY'
1795
- | 'BIWEEKLY'
1796
- | 'MONTHLY'
1797
- | 'BIMONTHLY'
1798
- | 'QUARTERLY'
1799
- | 'YEARLY'
1800
- | 'CUSTOM';
1975
+ amount: number;
1801
1976
  /**
1802
- * Expected amount (positive number)
1977
+ * Price date (ISO 8601 format)
1803
1978
  */
1804
- expectedAmount: number;
1979
+ date: string;
1805
1980
  /**
1806
- * Expected day of month (1-31)
1981
+ * Metadata (validated by Zod schema, max field lengths enforced)
1807
1982
  */
1808
- expectedDay?: number;
1983
+ metadata?: {
1984
+ [key: string]: unknown;
1985
+ };
1986
+ };
1987
+
1988
+ export type PriceResponseDto = {
1809
1989
  /**
1810
- * Custom interval in days (required for CUSTOM frequency)
1990
+ * Unique identifier
1811
1991
  */
1812
- customIntervalDays?: number;
1992
+ id: string;
1813
1993
  /**
1814
- * Currency code
1994
+ * User ID (owner of the price)
1995
+ */
1996
+ userId: string;
1997
+ /**
1998
+ * Currency being priced (e.g., USD, AAPL, BTC)
1815
1999
  */
1816
2000
  currency: string;
1817
2001
  /**
1818
- * Payee matching pattern (supports wildcards)
2002
+ * Quote currency (pricing currency, e.g., USD, CNY)
1819
2003
  */
1820
- matchPayeePattern?: string;
2004
+ quoteCurrency: string;
1821
2005
  /**
1822
- * Amount tolerance percentage (0-1)
2006
+ * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
1823
2007
  */
1824
- matchAmountTolerance: number;
2008
+ amount: number;
1825
2009
  /**
1826
- * Default expense account for auto-create
2010
+ * Price date (ISO 8601 format). Represents the date this price was valid.
1827
2011
  */
1828
- defaultExpenseAccount?: string;
2012
+ date: string;
1829
2013
  /**
1830
- * Default payment account for auto-create
2014
+ * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
1831
2015
  */
1832
- defaultPaymentAccount?: string;
2016
+ meta: {
2017
+ [key: string]: unknown;
2018
+ };
1833
2019
  /**
1834
- * Default payee for auto-create
2020
+ * Creation timestamp
1835
2021
  */
1836
- defaultPayee?: string;
2022
+ createdAt: string;
1837
2023
  /**
1838
- * Auto-create transaction when expected date arrives
2024
+ * Last update timestamp
1839
2025
  */
1840
- autoCreate: boolean;
2026
+ updatedAt: string;
2027
+ };
2028
+
2029
+ export type PriceListResponseDto = {
1841
2030
  /**
1842
- * Rule start date (ISO format)
2031
+ * List of prices
1843
2032
  */
1844
- startDate?: string;
2033
+ items: Array<PriceResponseDto>;
1845
2034
  /**
1846
- * Rule end date (ISO format)
2035
+ * Total number of prices
1847
2036
  */
1848
- endDate?: string;
2037
+ total: number;
1849
2038
  };
1850
2039
 
1851
- /**
1852
- * Recurring frequency
1853
- */
1854
- export type frequency =
1855
- | 'WEEKLY'
1856
- | 'BIWEEKLY'
1857
- | 'MONTHLY'
1858
- | 'BIMONTHLY'
1859
- | 'QUARTERLY'
2040
+ export type UpdateBeanPriceDto = {
2041
+ /**
2042
+ * Currency being priced
2043
+ */
2044
+ currency?: string;
2045
+ /**
2046
+ * Quote currency (pricing currency)
2047
+ */
2048
+ quoteCurrency?: string;
2049
+ /**
2050
+ * Price amount (MUST be >= 0 per Beancount spec)
2051
+ */
2052
+ amount?: number;
2053
+ /**
2054
+ * Price date (ISO 8601 format)
2055
+ */
2056
+ date?: string;
2057
+ /**
2058
+ * Metadata
2059
+ */
2060
+ metadata?: {
2061
+ [key: string]: unknown;
2062
+ };
2063
+ };
2064
+
2065
+ export type CreateRecurringRuleDto = {
2066
+ /**
2067
+ * Rule name (unique per user)
2068
+ */
2069
+ name: string;
2070
+ /**
2071
+ * Icon emoji
2072
+ */
2073
+ icon?: string;
2074
+ /**
2075
+ * Recurring frequency
2076
+ */
2077
+ frequency:
2078
+ | 'WEEKLY'
2079
+ | 'BIWEEKLY'
2080
+ | 'MONTHLY'
2081
+ | 'BIMONTHLY'
2082
+ | 'QUARTERLY'
2083
+ | 'YEARLY'
2084
+ | 'CUSTOM';
2085
+ /**
2086
+ * Expected amount (positive number)
2087
+ */
2088
+ expectedAmount: number;
2089
+ /**
2090
+ * Expected day of month (1-31)
2091
+ */
2092
+ expectedDay?: number;
2093
+ /**
2094
+ * Custom interval in days (required for CUSTOM frequency)
2095
+ */
2096
+ customIntervalDays?: number;
2097
+ /**
2098
+ * Currency code
2099
+ */
2100
+ currency: string;
2101
+ /**
2102
+ * Payee matching pattern (supports wildcards)
2103
+ */
2104
+ matchPayeePattern?: string;
2105
+ /**
2106
+ * Amount tolerance percentage (0-1)
2107
+ */
2108
+ matchAmountTolerance: number;
2109
+ /**
2110
+ * Default expense account for auto-create
2111
+ */
2112
+ defaultExpenseAccount?: string;
2113
+ /**
2114
+ * Default payment account for auto-create
2115
+ */
2116
+ defaultPaymentAccount?: string;
2117
+ /**
2118
+ * Default payee for auto-create
2119
+ */
2120
+ defaultPayee?: string;
2121
+ /**
2122
+ * Auto-create transaction when expected date arrives
2123
+ */
2124
+ autoCreate: boolean;
2125
+ /**
2126
+ * Rule start date (ISO format)
2127
+ */
2128
+ startDate?: string;
2129
+ /**
2130
+ * Rule end date (ISO format)
2131
+ */
2132
+ endDate?: string;
2133
+ };
2134
+
2135
+ /**
2136
+ * Recurring frequency
2137
+ */
2138
+ export type frequency =
2139
+ | 'WEEKLY'
2140
+ | 'BIWEEKLY'
2141
+ | 'MONTHLY'
2142
+ | 'BIMONTHLY'
2143
+ | 'QUARTERLY'
1860
2144
  | 'YEARLY'
1861
2145
  | 'CUSTOM';
1862
2146
 
@@ -2786,6 +3070,26 @@ export type SignupDto = {
2786
3070
  turnstileToken?: string;
2787
3071
  };
2788
3072
 
3073
+ export type SignupResponseDto = {
3074
+ /**
3075
+ * JWT auth token
3076
+ */
3077
+ authToken: string;
3078
+ /**
3079
+ * Auto-generated access token
3080
+ */
3081
+ accessToken: string;
3082
+ /**
3083
+ * Assigned user role
3084
+ */
3085
+ role: 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
3086
+ };
3087
+
3088
+ /**
3089
+ * Assigned user role
3090
+ */
3091
+ export type role = 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
3092
+
2789
3093
  export type UpdateUserSettingDto = {
2790
3094
  /**
2791
3095
  * Security ID
@@ -2890,163 +3194,581 @@ export type UpdatePropertyDto = {
2890
3194
  value: string;
2891
3195
  };
2892
3196
 
2893
- export type FileImportDto = {
3197
+ export type CurrencyBalanceDto = {
2894
3198
  /**
2895
- * Bill file to import (CSV, PDF, OFX, etc.)
3199
+ * ISO 4217 currency code
2896
3200
  */
2897
- file: Blob | File;
3201
+ currency: string;
3202
+ /**
3203
+ * Balance amount
3204
+ */
3205
+ balance: string;
2898
3206
  };
2899
3207
 
2900
- export type ImportErrorDto = {
3208
+ export type TimeSeriesPointDto = {
2901
3209
  /**
2902
- * Index of failed transaction in the file
3210
+ * Date in YYYY-MM-DD format
2903
3211
  */
2904
- index: number;
3212
+ date: string;
2905
3213
  /**
2906
- * Error message
3214
+ * Value at this date (in base currency)
2907
3215
  */
2908
- error: string;
2909
- };
2910
-
2911
- export type ReviewItemPreviewDto = {
3216
+ value: string;
2912
3217
  /**
2913
- * Index in the import batch (for tracking)
3218
+ * Change from previous point
2914
3219
  */
2915
- index: number;
3220
+ change?: {
3221
+ [key: string]: unknown;
3222
+ };
2916
3223
  /**
2917
- * Transaction date (ISO format)
3224
+ * Total assets at this date (in base currency)
2918
3225
  */
2919
- date: string;
3226
+ assets?: string;
2920
3227
  /**
2921
- * Transaction amount (absolute value)
3228
+ * Total liabilities at this date (in base currency)
2922
3229
  */
2923
- amount?: number;
3230
+ liabilities?: string;
2924
3231
  /**
2925
- * Currency code
3232
+ * Multi-currency breakdown for this point
2926
3233
  */
2927
- currency?: string;
3234
+ byCurrency?: Array<CurrencyBalanceDto>;
3235
+ };
3236
+
3237
+ export type TrendSummaryDto = {
2928
3238
  /**
2929
- * Transaction narration/description
3239
+ * Value at start of period
2930
3240
  */
2931
- narration: string;
3241
+ startValue: string;
2932
3242
  /**
2933
- * Payee name
3243
+ * Value at end of period
2934
3244
  */
2935
- payee?: string;
3245
+ endValue: string;
2936
3246
  /**
2937
- * Inferred category from rule matching
3247
+ * Total change over period
2938
3248
  */
2939
- category?: string;
3249
+ totalChange: string;
2940
3250
  /**
2941
- * Confidence score for the match (0-1)
3251
+ * Total change percentage
2942
3252
  */
2943
- confidence?: number;
3253
+ totalChangePercentage: string;
3254
+ };
3255
+
3256
+ export type MultiCurrencyPointDto = {
2944
3257
  /**
2945
- * Type of branch requiring review
3258
+ * Date in YYYY-MM-DD format
2946
3259
  */
2947
- branchType?:
2948
- | 'DUPLICATE'
2949
- | 'PAYEE_MATCH'
2950
- | 'RULE_MATCH'
2951
- | 'ACCOUNT_VALIDATION'
2952
- | 'PIPELINE_ERROR';
3260
+ date: string;
2953
3261
  /**
2954
- * Human-readable reasons for requiring review
3262
+ * Balances by currency
2955
3263
  */
2956
- reasons?: Array<string>;
3264
+ byCurrency: Array<CurrencyBalanceDto>;
2957
3265
  };
2958
3266
 
2959
- /**
2960
- * Type of branch requiring review
2961
- */
2962
- export type branchType =
2963
- | 'DUPLICATE'
2964
- | 'PAYEE_MATCH'
2965
- | 'RULE_MATCH'
2966
- | 'ACCOUNT_VALIDATION'
2967
- | 'PIPELINE_ERROR';
2968
-
2969
- export type ImportResultDto = {
3267
+ export type PortfolioTrendsResponseDto = {
2970
3268
  /**
2971
- * Number of successfully imported transactions
3269
+ * Time series data points
2972
3270
  */
2973
- imported: number;
3271
+ series: Array<TimeSeriesPointDto>;
2974
3272
  /**
2975
- * Number of failed transactions
3273
+ * Period summary
2976
3274
  */
2977
- failed: number;
3275
+ summary: TrendSummaryDto;
2978
3276
  /**
2979
- * Number of skipped transactions (high confidence duplicates, auto-skipped)
3277
+ * Period requested
2980
3278
  */
2981
- skipped: number;
3279
+ period: string;
2982
3280
  /**
2983
- * Number of transactions pending review (medium confidence duplicates)
3281
+ * Data granularity
2984
3282
  */
2985
- pendingReview: number;
3283
+ granularity: string;
2986
3284
  /**
2987
- * Array of error details for failed transactions
3285
+ * Base currency for converted values
2988
3286
  */
2989
- errors: Array<ImportErrorDto>;
3287
+ currency: string;
2990
3288
  /**
2991
- * Array of transactions pending review with preview data. Contains essential information for displaying in the import preview UI.
3289
+ * Multi-currency time series (each point has currency breakdown)
2992
3290
  */
2993
- reviewItems?: Array<ReviewItemPreviewDto>;
3291
+ byCurrency?: Array<MultiCurrencyPointDto>;
2994
3292
  /**
2995
- * Array of imported transactions (optional, for debugging)
3293
+ * Exchange rate warnings
2996
3294
  */
2997
- transactions?: {
2998
- [key: string]: unknown;
2999
- };
3295
+ warnings?: Array<ExchangeRateWarningDto>;
3000
3296
  };
3001
3297
 
3002
- export type IdentifyResultDto = {
3298
+ export type CashFlowPointDto = {
3003
3299
  /**
3004
- * Whether the file was successfully identified
3005
- */
3006
- identified: boolean;
3007
- /**
3008
- * Name of the importer that can handle this file
3300
+ * Month key (YYYY-MM)
3009
3301
  */
3010
- importerName?: string;
3302
+ month: string;
3011
3303
  /**
3012
- * Unique identifier of the importer
3304
+ * Income in base currency (absolute, converted)
3013
3305
  */
3014
- importerId?: string;
3306
+ income: string;
3015
3307
  /**
3016
- * Default account used by this importer
3308
+ * Expense in base currency (absolute, converted)
3017
3309
  */
3018
- account?: string;
3310
+ expense: string;
3019
3311
  /**
3020
- * Message when file cannot be identified
3312
+ * netSavings = income − expense (savings positive)
3021
3313
  */
3022
- message?: string;
3314
+ netSavings: string;
3023
3315
  };
3024
3316
 
3025
- export type MapperDefaultsDto = {
3317
+ export type CashFlowTrendSummaryDto = {
3026
3318
  /**
3027
- * Source account for transactions (Beancount format)
3319
+ * Total income across the period
3028
3320
  */
3029
- sourceAccount: string;
3321
+ totalIncome: string;
3030
3322
  /**
3031
- * Default currency (ISO 4217 code)
3323
+ * Total expense across the period
3032
3324
  */
3033
- currency: string;
3325
+ totalExpense: string;
3034
3326
  /**
3035
- * Default expense account
3327
+ * income − expense across the period
3036
3328
  */
3037
- expenseAccount?: string;
3329
+ totalNetSavings: string;
3038
3330
  /**
3039
- * Default income account
3331
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
3040
3332
  */
3041
- incomeAccount?: string;
3333
+ averageMonthlyNetSavings: string;
3334
+ };
3335
+
3336
+ export type CashFlowTrendsResponseDto = {
3042
3337
  /**
3043
- * Filename prefix to account mapping (for HK importers). Maps filename prefix to Beancount account path.
3338
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
3044
3339
  */
3045
- accountMapping?: {
3046
- [key: string]: unknown;
3047
- };
3340
+ series: Array<CashFlowPointDto>;
3048
3341
  /**
3049
- * Convert CNY to CNH (offshore RMB) (for HK importers). Default: false.
3342
+ * Period totals
3343
+ */
3344
+ summary: CashFlowTrendSummaryDto;
3345
+ /**
3346
+ * Period requested
3347
+ */
3348
+ period: string;
3349
+ /**
3350
+ * Data granularity (v1 returns month buckets)
3351
+ */
3352
+ granularity: string;
3353
+ /**
3354
+ * Base currency for converted values
3355
+ */
3356
+ currency: string;
3357
+ /**
3358
+ * Exchange rate warnings (e.g. missing rate for a currency)
3359
+ */
3360
+ warnings?: Array<ExchangeRateWarningDto>;
3361
+ };
3362
+
3363
+ export type GenerateSnapshotBody = unknown;
3364
+
3365
+ export type GenerateSnapshotResponse = unknown;
3366
+
3367
+ export type BackfillSnapshotsBody = unknown;
3368
+
3369
+ export type BackfillSnapshotsResponse = unknown;
3370
+
3371
+ export type CreateBeanEventDto = {
3372
+ /**
3373
+ * Life event date (ISO 8601)
3374
+ */
3375
+ date: string;
3376
+ /**
3377
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3378
+ */
3379
+ type: string;
3380
+ /**
3381
+ * Life event description. Empty string is a VALID value (distinct from absence).
3382
+ */
3383
+ description: string;
3384
+ /**
3385
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3386
+ */
3387
+ meta?: {
3388
+ [key: string]: unknown;
3389
+ };
3390
+ };
3391
+
3392
+ export type EventResponseDto = {
3393
+ /**
3394
+ * Unique identifier
3395
+ */
3396
+ id: string;
3397
+ /**
3398
+ * User ID (owner of the life event)
3399
+ */
3400
+ userId: string;
3401
+ /**
3402
+ * Life event date (ISO 8601 format)
3403
+ */
3404
+ date: string;
3405
+ /**
3406
+ * Life event type (user-defined, e.g., "employer", "location")
3407
+ */
3408
+ type: string;
3409
+ /**
3410
+ * Life event description. May be an empty string (a valid value distinct from absence).
3411
+ */
3412
+ description: string;
3413
+ /**
3414
+ * Product-side metadata (free-form JSON)
3415
+ */
3416
+ meta: {
3417
+ [key: string]: unknown;
3418
+ };
3419
+ /**
3420
+ * Creation timestamp
3421
+ */
3422
+ createdAt: string;
3423
+ /**
3424
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3425
+ */
3426
+ updatedAt: string;
3427
+ };
3428
+
3429
+ export type EventListResponseDto = {
3430
+ /**
3431
+ * List of life events
3432
+ */
3433
+ items: Array<EventResponseDto>;
3434
+ /**
3435
+ * Total number of life events matching the query
3436
+ */
3437
+ total: number;
3438
+ };
3439
+
3440
+ export type UpdateBeanEventDto = {
3441
+ /**
3442
+ * Life event date (ISO 8601)
3443
+ */
3444
+ date?: string;
3445
+ /**
3446
+ * Life event type (user-defined)
3447
+ */
3448
+ type?: string;
3449
+ /**
3450
+ * Life event description. Empty string is a VALID value (distinct from absence).
3451
+ */
3452
+ description?: string;
3453
+ /**
3454
+ * Product-side metadata (free-form JSON)
3455
+ */
3456
+ meta?: {
3457
+ [key: string]: unknown;
3458
+ };
3459
+ };
3460
+
3461
+ export type OnboardingAccountDto = {
3462
+ /**
3463
+ * Account path (Assets/Liabilities only; format validated by the account service)
3464
+ */
3465
+ path: string;
3466
+ /**
3467
+ * ISO 4217 currency code (3 letters)
3468
+ */
3469
+ currency: string;
3470
+ /**
3471
+ * Opening balance as a non-negative Decimal string (e.g. "1000.00")
3472
+ */
3473
+ openingBalance?: string;
3474
+ /**
3475
+ * Platform ID to bind the account to (references Platform.id); omit for unbound
3476
+ */
3477
+ platformId?: string;
3478
+ };
3479
+
3480
+ export type OnboardingDto = {
3481
+ /**
3482
+ * Asset/Liability accounts to register with opening balances
3483
+ */
3484
+ accounts?: Array<OnboardingAccountDto>;
3485
+ /**
3486
+ * Skip asset registration; only bootstrap the core account set
3487
+ */
3488
+ skipAssetRegistration?: boolean;
3489
+ };
3490
+
3491
+ export type ActualBalanceDto = {
3492
+ /**
3493
+ * Actual balance amount as a decimal string (preserves precision for tolerance inference).
3494
+ */
3495
+ amount: string;
3496
+ /**
3497
+ * Currency code (ISO 4217 or commodity ticker).
3498
+ */
3499
+ ccy: string;
3500
+ };
3501
+
3502
+ export type ComputeReconciliationDto = {
3503
+ /**
3504
+ * BeanAccount id to reconcile.
3505
+ */
3506
+ accountId: string;
3507
+ /**
3508
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3509
+ */
3510
+ asOfDate: string;
3511
+ /**
3512
+ * Actual balance from the external statement.
3513
+ */
3514
+ actualBalance: ActualBalanceDto;
3515
+ };
3516
+
3517
+ export type ReconciliationComputeResultDto = {
3518
+ accountId: string;
3519
+ asOfDate: string;
3520
+ /**
3521
+ * System-computed book balance (decimal string).
3522
+ */
3523
+ bookBalance: string;
3524
+ /**
3525
+ * User-entered actual balance (decimal string).
3526
+ */
3527
+ actualBalance: string;
3528
+ currency: string;
3529
+ /**
3530
+ * Diff = book − actual (decimal string).
3531
+ */
3532
+ diff: string;
3533
+ /**
3534
+ * Applied tolerance (decimal string).
3535
+ */
3536
+ tolerance: string;
3537
+ /**
3538
+ * true when |diff| ≤ tolerance.
3539
+ */
3540
+ withinTolerance: boolean;
3541
+ /**
3542
+ * Suggested next action: assert when within tolerance, pad otherwise.
3543
+ */
3544
+ suggestedAction: 'assert' | 'pad';
3545
+ };
3546
+
3547
+ /**
3548
+ * Suggested next action: assert when within tolerance, pad otherwise.
3549
+ */
3550
+ export type suggestedAction = 'assert' | 'pad';
3551
+
3552
+ export type AssertReconciliationDto = {
3553
+ /**
3554
+ * BeanAccount id to reconcile.
3555
+ */
3556
+ accountId: string;
3557
+ /**
3558
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3559
+ */
3560
+ asOfDate: string;
3561
+ /**
3562
+ * Actual balance from the external statement.
3563
+ */
3564
+ actualBalance: ActualBalanceDto;
3565
+ /**
3566
+ * Optional explicit tolerance override. Omit to infer from amount precision (Beancount default).
3567
+ */
3568
+ tolerance?: string;
3569
+ };
3570
+
3571
+ export type ReconciliationRecordDto = {
3572
+ id: string;
3573
+ accountId: string;
3574
+ date: string;
3575
+ /**
3576
+ * Asserted (actual) amount.
3577
+ */
3578
+ amount: string;
3579
+ currency: string;
3580
+ tolerance?: string;
3581
+ /**
3582
+ * book − actual.
3583
+ */
3584
+ diffAmount?: string;
3585
+ diffCurrency?: string;
3586
+ createdAt: string;
3587
+ };
3588
+
3589
+ export type PadReconciliationDto = {
3590
+ /**
3591
+ * BeanAccount id to reconcile.
3592
+ */
3593
+ accountId: string;
3594
+ /**
3595
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3596
+ */
3597
+ asOfDate: string;
3598
+ /**
3599
+ * Actual balance from the external statement.
3600
+ */
3601
+ actualBalance: ActualBalanceDto;
3602
+ /**
3603
+ * Pad source account. Defaults to Equity:Opening-Balances (official Beancount convention).
3604
+ */
3605
+ sourceAccount?: string;
3606
+ };
3607
+
3608
+ export type PadResultDto = {
3609
+ /**
3610
+ * Created pad adjusting transaction id.
3611
+ */
3612
+ transactionId: string;
3613
+ };
3614
+
3615
+ export type FileImportDto = {
3616
+ /**
3617
+ * Bill file to import (CSV, PDF, OFX, etc.)
3618
+ */
3619
+ file: Blob | File;
3620
+ };
3621
+
3622
+ export type ImportErrorDto = {
3623
+ /**
3624
+ * Index of failed transaction in the file
3625
+ */
3626
+ index: number;
3627
+ /**
3628
+ * Error message
3629
+ */
3630
+ error: string;
3631
+ };
3632
+
3633
+ export type ReviewItemPreviewDto = {
3634
+ /**
3635
+ * Index in the import batch (for tracking)
3636
+ */
3637
+ index: number;
3638
+ /**
3639
+ * Transaction date (ISO format)
3640
+ */
3641
+ date: string;
3642
+ /**
3643
+ * Transaction amount (absolute value)
3644
+ */
3645
+ amount?: number;
3646
+ /**
3647
+ * Currency code
3648
+ */
3649
+ currency?: string;
3650
+ /**
3651
+ * Transaction narration/description
3652
+ */
3653
+ narration: string;
3654
+ /**
3655
+ * Payee name
3656
+ */
3657
+ payee?: string;
3658
+ /**
3659
+ * Inferred category from rule matching
3660
+ */
3661
+ category?: string;
3662
+ /**
3663
+ * Confidence score for the match (0-1)
3664
+ */
3665
+ confidence?: number;
3666
+ /**
3667
+ * Type of branch requiring review
3668
+ */
3669
+ branchType?:
3670
+ | 'DUPLICATE'
3671
+ | 'PAYEE_MATCH'
3672
+ | 'RULE_MATCH'
3673
+ | 'ACCOUNT_VALIDATION'
3674
+ | 'PIPELINE_ERROR';
3675
+ /**
3676
+ * Human-readable reasons for requiring review
3677
+ */
3678
+ reasons?: Array<string>;
3679
+ };
3680
+
3681
+ /**
3682
+ * Type of branch requiring review
3683
+ */
3684
+ export type branchType =
3685
+ | 'DUPLICATE'
3686
+ | 'PAYEE_MATCH'
3687
+ | 'RULE_MATCH'
3688
+ | 'ACCOUNT_VALIDATION'
3689
+ | 'PIPELINE_ERROR';
3690
+
3691
+ export type ImportResultDto = {
3692
+ /**
3693
+ * Number of successfully imported transactions
3694
+ */
3695
+ imported: number;
3696
+ /**
3697
+ * Number of failed transactions
3698
+ */
3699
+ failed: number;
3700
+ /**
3701
+ * Number of skipped transactions (high confidence duplicates, auto-skipped)
3702
+ */
3703
+ skipped: number;
3704
+ /**
3705
+ * Number of transactions pending review (medium confidence duplicates)
3706
+ */
3707
+ pendingReview: number;
3708
+ /**
3709
+ * Array of error details for failed transactions
3710
+ */
3711
+ errors: Array<ImportErrorDto>;
3712
+ /**
3713
+ * Array of transactions pending review with preview data. Contains essential information for displaying in the import preview UI.
3714
+ */
3715
+ reviewItems?: Array<ReviewItemPreviewDto>;
3716
+ /**
3717
+ * Array of imported transactions (optional, for debugging)
3718
+ */
3719
+ transactions?: {
3720
+ [key: string]: unknown;
3721
+ };
3722
+ };
3723
+
3724
+ export type IdentifyResultDto = {
3725
+ /**
3726
+ * Whether the file was successfully identified
3727
+ */
3728
+ identified: boolean;
3729
+ /**
3730
+ * Name of the importer that can handle this file
3731
+ */
3732
+ importerName?: string;
3733
+ /**
3734
+ * Unique identifier of the importer
3735
+ */
3736
+ importerId?: string;
3737
+ /**
3738
+ * Default account used by this importer
3739
+ */
3740
+ account?: string;
3741
+ /**
3742
+ * Message when file cannot be identified
3743
+ */
3744
+ message?: string;
3745
+ };
3746
+
3747
+ export type MapperDefaultsDto = {
3748
+ /**
3749
+ * Source account for transactions (Beancount format)
3750
+ */
3751
+ sourceAccount: string;
3752
+ /**
3753
+ * Default currency (ISO 4217 code)
3754
+ */
3755
+ currency: string;
3756
+ /**
3757
+ * Default expense account
3758
+ */
3759
+ expenseAccount?: string;
3760
+ /**
3761
+ * Default income account
3762
+ */
3763
+ incomeAccount?: string;
3764
+ /**
3765
+ * Filename prefix to account mapping (for HK importers). Maps filename prefix to Beancount account path.
3766
+ */
3767
+ accountMapping?: {
3768
+ [key: string]: unknown;
3769
+ };
3770
+ /**
3771
+ * Convert CNY to CNH (offshore RMB) (for HK importers). Default: false.
3050
3772
  */
3051
3773
  useCnh?: boolean;
3052
3774
  /**
@@ -3159,121 +3881,33 @@ export type UpdateMapperDefaultsDto = {
3159
3881
  */
3160
3882
  currency?: string;
3161
3883
  /**
3162
- * Default expense account (optional)
3163
- */
3164
- expenseAccount?: string;
3165
- /**
3166
- * Default income account (optional)
3167
- */
3168
- incomeAccount?: string;
3169
- /**
3170
- * Payment method to source account mapping. Maps payment method keywords to Beancount account paths. Used by Alipay/WeChat importers to determine sourceAccount based on payment method (e.g., HuaBei, CreditCard).
3171
- */
3172
- methodAccountMapping?: {
3173
- [key: string]: unknown;
3174
- };
3175
- };
3176
-
3177
- export type UpdateConfigDataDto = {
3178
- /**
3179
- * Mapper defaults configuration
3180
- */
3181
- defaults?: UpdateMapperDefaultsDto;
3182
- };
3183
-
3184
- export type UpdateImporterConfigDto = {
3185
- /**
3186
- * Configuration data (v1 schema)
3187
- */
3188
- data?: UpdateConfigDataDto;
3189
- };
3190
-
3191
- export type CreatePlatformDto = {
3192
- /**
3193
- * Platform name
3194
- */
3195
- name: string;
3196
- /**
3197
- * Platform canonical identifier (lowercase, kebab-case)
3198
- */
3199
- canonical: string;
3200
- /**
3201
- * Platform aliases (multi-language names for lookup)
3202
- */
3203
- aliases: Array<string>;
3204
- /**
3205
- * Platform URL
3206
- */
3207
- url: string;
3208
- /**
3209
- * Platform type
3210
- */
3211
- type:
3212
- | 'BANK'
3213
- | 'BROKERAGE'
3214
- | 'CRYPTO_EXCHANGE'
3215
- | 'PAYMENT'
3216
- | 'INVESTMENT'
3217
- | 'INSURANCE'
3218
- | 'OTHER';
3219
- /**
3220
- * Platform logo URL
3221
- */
3222
- logoUrl?: string;
3223
- /**
3224
- * Whether the platform is active
3225
- */
3226
- isActive?: boolean;
3227
- };
3228
-
3229
- /**
3230
- * Platform type
3231
- */
3232
- export type type3 =
3233
- | 'BANK'
3234
- | 'BROKERAGE'
3235
- | 'CRYPTO_EXCHANGE'
3236
- | 'PAYMENT'
3237
- | 'INVESTMENT'
3238
- | 'INSURANCE'
3239
- | 'OTHER';
3240
-
3241
- export type UpdatePlatformDto = {
3242
- /**
3243
- * Platform name
3244
- */
3245
- name?: string;
3246
- /**
3247
- * Platform canonical identifier (lowercase, kebab-case)
3248
- */
3249
- canonical?: string;
3250
- /**
3251
- * Platform aliases (multi-language names for lookup)
3884
+ * Default expense account (optional)
3252
3885
  */
3253
- aliases?: Array<string>;
3886
+ expenseAccount?: string;
3254
3887
  /**
3255
- * Platform URL
3888
+ * Default income account (optional)
3256
3889
  */
3257
- url?: string;
3890
+ incomeAccount?: string;
3258
3891
  /**
3259
- * Platform type
3892
+ * Payment method to source account mapping. Maps payment method keywords to Beancount account paths. Used by Alipay/WeChat importers to determine sourceAccount based on payment method (e.g., HuaBei, CreditCard).
3260
3893
  */
3261
- type?:
3262
- | 'BANK'
3263
- | 'BROKERAGE'
3264
- | 'CRYPTO_EXCHANGE'
3265
- | 'PAYMENT'
3266
- | 'INVESTMENT'
3267
- | 'INSURANCE'
3268
- | 'OTHER';
3894
+ methodAccountMapping?: {
3895
+ [key: string]: unknown;
3896
+ };
3897
+ };
3898
+
3899
+ export type UpdateConfigDataDto = {
3269
3900
  /**
3270
- * Platform logo URL
3901
+ * Mapper defaults configuration
3271
3902
  */
3272
- logoUrl?: string;
3903
+ defaults?: UpdateMapperDefaultsDto;
3904
+ };
3905
+
3906
+ export type UpdateImporterConfigDto = {
3273
3907
  /**
3274
- * Whether the platform is active
3908
+ * Configuration data (v1 schema)
3275
3909
  */
3276
- isActive?: boolean;
3910
+ data?: UpdateConfigDataDto;
3277
3911
  };
3278
3912
 
3279
3913
  export type ProviderSyncConfigDto = {
@@ -3297,6 +3931,10 @@ export type ProviderSyncConfigDto = {
3297
3931
  * Filter pending transactions
3298
3932
  */
3299
3933
  filterPending?: boolean;
3934
+ /**
3935
+ * External account ID for per-batch providers (e.g. GoCardless). Overrides sourceAccount when an ExternalAccountLink mapping exists.
3936
+ */
3937
+ externalAccountId?: string;
3300
3938
  };
3301
3939
 
3302
3940
  export type ProviderSyncDto = {
@@ -3352,8 +3990,65 @@ export type SupportedProvidersResponseDto = {
3352
3990
  providers: Array<string>;
3353
3991
  };
3354
3992
 
3993
+ export type CreateExternalAccountLinkDto = {
3994
+ /**
3995
+ * Open Banking provider (whitelist)
3996
+ */
3997
+ provider:
3998
+ | 'plaid'
3999
+ | 'teller'
4000
+ | 'truelayer'
4001
+ | 'gocardless'
4002
+ | 'simplefin'
4003
+ | 'yodlee'
4004
+ | 'beancount-direct'
4005
+ | 'parsed-bill';
4006
+ /**
4007
+ * External account ID from the provider
4008
+ */
4009
+ externalAccountId: string;
4010
+ /**
4011
+ * Target BeanAccount ID (must belong to the JWT user)
4012
+ */
4013
+ beanAccountId: string;
4014
+ };
4015
+
4016
+ /**
4017
+ * Open Banking provider (whitelist)
4018
+ */
4019
+ export type provider =
4020
+ | 'plaid'
4021
+ | 'teller'
4022
+ | 'truelayer'
4023
+ | 'gocardless'
4024
+ | 'simplefin'
4025
+ | 'yodlee'
4026
+ | 'beancount-direct'
4027
+ | 'parsed-bill';
4028
+
4029
+ export type ExternalAccountLinkResponseDto = {
4030
+ id: string;
4031
+ provider: string;
4032
+ externalAccountId: string;
4033
+ beanAccountId: string;
4034
+ isActive: boolean;
4035
+ createdAt: string;
4036
+ updatedAt: string;
4037
+ };
4038
+
4039
+ export type ExternalAccountLinkListResponseDto = {
4040
+ items: Array<ExternalAccountLinkResponseDto>;
4041
+ total: number;
4042
+ /**
4043
+ * Filter by provider (query param)
4044
+ */
4045
+ provider?: string;
4046
+ };
4047
+
3355
4048
  export type ParserTelemetryReportDto = unknown;
3356
4049
 
4050
+ export type UncoveredFormatMissDto = unknown;
4051
+
3357
4052
  export type ProcessNlpDto = {
3358
4053
  /**
3359
4054
  * Natural language text describing a transaction (Chinese)
@@ -3870,74 +4565,260 @@ export type NlpResponseDto = {
3870
4565
  */
3871
4566
  confidence?: number;
3872
4567
  /**
3873
- * Confidence threshold for automatic creation (default: 0.75). When confidence < threshold, action will be "confirm" requiring user verification.
4568
+ * Confidence threshold for automatic creation (default: 0.75). When confidence < threshold, action will be "confirm" requiring user verification.
4569
+ */
4570
+ confidenceThreshold?: number;
4571
+ /**
4572
+ * Recurring transaction match info (when action is "created"). Contains match details when transaction matches a pending expected transaction.
4573
+ */
4574
+ recurringMatch?: RecurringMatchInfoDto;
4575
+ /**
4576
+ * Recurring rule creation suggestion (when action is "created"). Contains suggestion to create a recurring rule based on detected patterns. Only present when no existing rule matched and similar historical transactions were found.
4577
+ */
4578
+ recurringSuggestion?: RecurringSuggestionDto;
4579
+ /**
4580
+ * Suggested accounts for this transaction. Contains recommended source and destination accounts based on the detected intent and rules.
4581
+ */
4582
+ suggestedAccounts?: NlpSuggestedAccountsDto;
4583
+ /**
4584
+ * Default accounts for the user/region. These are fallback accounts used when no specific suggestion is available.
4585
+ */
4586
+ defaultAccounts?: NlpDefaultAccountsDto;
4587
+ };
4588
+
4589
+ /**
4590
+ * Response status
4591
+ */
4592
+ export type status4 = 'success' | 'pending' | 'error';
4593
+
4594
+ /**
4595
+ * Action taken or requested
4596
+ */
4597
+ export type action2 =
4598
+ | 'created'
4599
+ | 'ask'
4600
+ | 'confirm'
4601
+ | 'confirm_duplicate'
4602
+ | 'confirm_rule'
4603
+ | 'confirm_account'
4604
+ | 'confirm_payee'
4605
+ | 'cancel';
4606
+
4607
+ /**
4608
+ * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4609
+ */
4610
+ export type intent = 'expense' | 'asset' | 'income' | 'liability' | 'equity';
4611
+
4612
+ /**
4613
+ * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4614
+ */
4615
+ export type assetSubType = 'transfer' | 'banking' | 'investment';
4616
+
4617
+ /**
4618
+ * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
4619
+ */
4620
+ export type liabilitySubType = 'borrow' | 'repay';
4621
+
4622
+ /**
4623
+ * Equity sub-type (only present when intent is "equity"). opening: account opening balance (Equity → Assets), adjustment: balance correction.
4624
+ */
4625
+ export type equitySubType = 'opening' | 'adjustment';
4626
+
4627
+ export type PlatformListItemDto = {
4628
+ /**
4629
+ * Global platform ID
4630
+ */
4631
+ id: string;
4632
+ /**
4633
+ * Platform name
4634
+ */
4635
+ name: string;
4636
+ /**
4637
+ * Platform URL
4638
+ */
4639
+ url: string;
4640
+ /**
4641
+ * Platform type
4642
+ */
4643
+ type:
4644
+ | 'BANK'
4645
+ | 'BROKERAGE'
4646
+ | 'CRYPTO_EXCHANGE'
4647
+ | 'PAYMENT'
4648
+ | 'INVESTMENT'
4649
+ | 'INSURANCE'
4650
+ | 'OTHER';
4651
+ /**
4652
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
4653
+ */
4654
+ canonical: string;
4655
+ /**
4656
+ * Suggested path segment — canonical with first char uppercased (ACC_COMP_NAME_RE)
4657
+ */
4658
+ suggestedSegment: string;
4659
+ /**
4660
+ * Logo URL
4661
+ */
4662
+ logoUrl: string | null;
4663
+ /**
4664
+ * Whether user has accounts using this platform
4665
+ */
4666
+ isBound: boolean;
4667
+ };
4668
+
4669
+ /**
4670
+ * Platform type
4671
+ */
4672
+ export type type3 =
4673
+ | 'BANK'
4674
+ | 'BROKERAGE'
4675
+ | 'CRYPTO_EXCHANGE'
4676
+ | 'PAYMENT'
4677
+ | 'INVESTMENT'
4678
+ | 'INSURANCE'
4679
+ | 'OTHER';
4680
+
4681
+ export type PlatformMatchResultDto = {
4682
+ /**
4683
+ * Global platform ID
4684
+ */
4685
+ id: string;
4686
+ /**
4687
+ * Platform name (e.g., "ICBC")
4688
+ */
4689
+ name: string;
4690
+ /**
4691
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
4692
+ */
4693
+ canonical: string;
4694
+ /**
4695
+ * Platform type
4696
+ */
4697
+ type:
4698
+ | 'BANK'
4699
+ | 'BROKERAGE'
4700
+ | 'CRYPTO_EXCHANGE'
4701
+ | 'PAYMENT'
4702
+ | 'INVESTMENT'
4703
+ | 'INSURANCE'
4704
+ | 'OTHER';
4705
+ /**
4706
+ * Suggested path segment — canonical, already in ACCOUNT_RE format
4707
+ */
4708
+ suggestedSegment: string;
4709
+ /**
4710
+ * Logo URL
4711
+ */
4712
+ logoUrl: string | null;
4713
+ /**
4714
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4715
+ */
4716
+ matchType: 'exact' | 'prefix' | 'substring';
4717
+ };
4718
+
4719
+ /**
4720
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4721
+ */
4722
+ export type matchType = 'exact' | 'prefix' | 'substring';
4723
+
4724
+ export type PlatformMatchResponseDto = {
4725
+ /**
4726
+ * Ranked matches, best tier first (at most 10 rows)
4727
+ */
4728
+ platforms: Array<PlatformMatchResultDto>;
4729
+ /**
4730
+ * Overall match quality — top row's tier, or 'none' when no hits
4731
+ */
4732
+ matchType: 'none' | 'exact' | 'prefix' | 'substring';
4733
+ /**
4734
+ * Total matches before LIMIT (truncation transparency)
4735
+ */
4736
+ total: number;
4737
+ /**
4738
+ * true when total > platforms.length (more matches exist)
4739
+ */
4740
+ hasMore: boolean;
4741
+ };
4742
+
4743
+ /**
4744
+ * Overall match quality — top row's tier, or 'none' when no hits
4745
+ */
4746
+ export type matchType2 = 'none' | 'exact' | 'prefix' | 'substring';
4747
+
4748
+ export type CreatePlatformDto = {
4749
+ /**
4750
+ * Platform name
4751
+ */
4752
+ name: string;
4753
+ /**
4754
+ * Platform canonical identifier (lowercase, kebab-case)
4755
+ */
4756
+ canonical: string;
4757
+ /**
4758
+ * Platform aliases (multi-language names for lookup)
4759
+ */
4760
+ aliases: Array<string>;
4761
+ /**
4762
+ * Platform URL
4763
+ */
4764
+ url: string;
4765
+ /**
4766
+ * Platform type
4767
+ */
4768
+ type:
4769
+ | 'BANK'
4770
+ | 'BROKERAGE'
4771
+ | 'CRYPTO_EXCHANGE'
4772
+ | 'PAYMENT'
4773
+ | 'INVESTMENT'
4774
+ | 'INSURANCE'
4775
+ | 'OTHER';
4776
+ /**
4777
+ * Platform logo URL
4778
+ */
4779
+ logoUrl?: string;
4780
+ /**
4781
+ * Whether the platform is active
4782
+ */
4783
+ isActive?: boolean;
4784
+ };
4785
+
4786
+ export type UpdatePlatformDto = {
4787
+ /**
4788
+ * Platform name
3874
4789
  */
3875
- confidenceThreshold?: number;
4790
+ name?: string;
3876
4791
  /**
3877
- * Recurring transaction match info (when action is "created"). Contains match details when transaction matches a pending expected transaction.
4792
+ * Platform canonical identifier (lowercase, kebab-case)
3878
4793
  */
3879
- recurringMatch?: RecurringMatchInfoDto;
4794
+ canonical?: string;
3880
4795
  /**
3881
- * Recurring rule creation suggestion (when action is "created"). Contains suggestion to create a recurring rule based on detected patterns. Only present when no existing rule matched and similar historical transactions were found.
4796
+ * Platform aliases (multi-language names for lookup)
3882
4797
  */
3883
- recurringSuggestion?: RecurringSuggestionDto;
4798
+ aliases?: Array<string>;
3884
4799
  /**
3885
- * Suggested accounts for this transaction. Contains recommended source and destination accounts based on the detected intent and rules.
4800
+ * Platform URL
3886
4801
  */
3887
- suggestedAccounts?: NlpSuggestedAccountsDto;
4802
+ url?: string;
3888
4803
  /**
3889
- * Default accounts for the user/region. These are fallback accounts used when no specific suggestion is available.
4804
+ * Platform type
3890
4805
  */
3891
- defaultAccounts?: NlpDefaultAccountsDto;
3892
- };
3893
-
3894
- /**
3895
- * Response status
3896
- */
3897
- export type status4 = 'success' | 'pending' | 'error';
3898
-
3899
- /**
3900
- * Action taken or requested
3901
- */
3902
- export type action2 =
3903
- | 'created'
3904
- | 'ask'
3905
- | 'confirm'
3906
- | 'confirm_duplicate'
3907
- | 'confirm_rule'
3908
- | 'confirm_account'
3909
- | 'confirm_payee'
3910
- | 'cancel';
3911
-
3912
- /**
3913
- * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
3914
- */
3915
- export type intent = 'expense' | 'asset' | 'income' | 'liability' | 'equity';
3916
-
3917
- /**
3918
- * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
3919
- */
3920
- export type assetSubType = 'transfer' | 'banking' | 'investment';
3921
-
3922
- /**
3923
- * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
3924
- */
3925
- export type liabilitySubType = 'borrow' | 'repay';
3926
-
3927
- /**
3928
- * Equity sub-type (only present when intent is "equity"). opening: account opening balance (Equity → Assets), adjustment: balance correction.
3929
- */
3930
- export type equitySubType = 'opening' | 'adjustment';
3931
-
3932
- export type BalanceByCurrencyDto = {
4806
+ type?:
4807
+ | 'BANK'
4808
+ | 'BROKERAGE'
4809
+ | 'CRYPTO_EXCHANGE'
4810
+ | 'PAYMENT'
4811
+ | 'INVESTMENT'
4812
+ | 'INSURANCE'
4813
+ | 'OTHER';
3933
4814
  /**
3934
- * ISO 4217 currency code
4815
+ * Platform logo URL
3935
4816
  */
3936
- currency: string;
4817
+ logoUrl?: string;
3937
4818
  /**
3938
- * Balance amount
4819
+ * Whether the platform is active
3939
4820
  */
3940
- balance: string;
4821
+ isActive?: boolean;
3941
4822
  };
3942
4823
 
3943
4824
  export type NetWorthByCurrencyDto = {
@@ -3980,21 +4861,6 @@ export type ConvertedNetWorthDto = {
3980
4861
  };
3981
4862
  };
3982
4863
 
3983
- export type ExchangeRateWarningDto = {
3984
- /**
3985
- * Warning type
3986
- */
3987
- type: string;
3988
- /**
3989
- * Currency without exchange rate
3990
- */
3991
- currency: string;
3992
- /**
3993
- * Total amount affected
3994
- */
3995
- totalAmount: string;
3996
- };
3997
-
3998
4864
  export type NetWorthResponseDto = {
3999
4865
  /**
4000
4866
  * Total net worth (assets - liabilities, converted to base currency)
@@ -4059,6 +4925,10 @@ export type AccountItemDto = {
4059
4925
  * Currency code
4060
4926
  */
4061
4927
  currency: string;
4928
+ /**
4929
+ * FX-converted balance in base currency; omitted when not convertible
4930
+ */
4931
+ convertedBalance?: string;
4062
4932
  };
4063
4933
 
4064
4934
  export type PlatformGroupDto = {
@@ -4075,9 +4945,40 @@ export type PlatformGroupDto = {
4075
4945
  */
4076
4946
  accounts: Array<AccountItemDto>;
4077
4947
  /**
4078
- * Total balance across all accounts in platform
4948
+ * FX-converted total balance in base currency
4079
4949
  */
4080
4950
  totalBalance: string;
4951
+ /**
4952
+ * Raw (unconverted) balances grouped by currency
4953
+ */
4954
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4955
+ /**
4956
+ * Converted balance in base currency (omitted when no currency is convertible)
4957
+ */
4958
+ convertedBalance?: string;
4959
+ /**
4960
+ * Share of the grand converted total (0-100); 0 when grand total is 0
4961
+ */
4962
+ sharePct: number;
4963
+ };
4964
+
4965
+ export type AccountExchangeRateWarningDto = {
4966
+ /**
4967
+ * Warning type
4968
+ */
4969
+ type: string;
4970
+ /**
4971
+ * Currency without exchange rate
4972
+ */
4973
+ currency: string;
4974
+ /**
4975
+ * Affected account paths
4976
+ */
4977
+ accounts: Array<string>;
4978
+ /**
4979
+ * Total amount in this currency
4980
+ */
4981
+ totalAmount: string;
4081
4982
  };
4082
4983
 
4083
4984
  export type AccountsSummaryDto = {
@@ -4089,6 +4990,14 @@ export type AccountsSummaryDto = {
4089
4990
  * Total number of platforms
4090
4991
  */
4091
4992
  totalPlatforms: number;
4993
+ /**
4994
+ * Base currency for conversion
4995
+ */
4996
+ baseCurrency: string;
4997
+ /**
4998
+ * Per-account exchange rate warnings
4999
+ */
5000
+ warnings?: Array<AccountExchangeRateWarningDto>;
4092
5001
  };
4093
5002
 
4094
5003
  export type AccountsResponseDto = {
@@ -4123,6 +5032,10 @@ export type AccountItemWithAssetClassDto = {
4123
5032
  * Currency code
4124
5033
  */
4125
5034
  currency: string;
5035
+ /**
5036
+ * FX-converted balance in base currency; omitted when not convertible
5037
+ */
5038
+ convertedBalance?: string;
4126
5039
  /**
4127
5040
  * Asset class
4128
5041
  */
@@ -4139,8 +5052,21 @@ export type AccountItemWithAssetClassDto = {
4139
5052
  * Risk level
4140
5053
  */
4141
5054
  riskLevel?: string;
5055
+ /**
5056
+ * ADR-0105 classification provenance (holding level always; account level only on FALLBACK)
5057
+ */
5058
+ source?: 'USER_META' | 'FIAT_CURRENCY' | 'OPENBB_MAPPING' | 'FALLBACK';
4142
5059
  };
4143
5060
 
5061
+ /**
5062
+ * ADR-0105 classification provenance (holding level always; account level only on FALLBACK)
5063
+ */
5064
+ export type source2 =
5065
+ | 'USER_META'
5066
+ | 'FIAT_CURRENCY'
5067
+ | 'OPENBB_MAPPING'
5068
+ | 'FALLBACK';
5069
+
4144
5070
  export type AssetClassGroupDto = {
4145
5071
  /**
4146
5072
  * Asset class name
@@ -4191,25 +5117,6 @@ export type assetClass =
4191
5117
  | 'REAL_ESTATE'
4192
5118
  | 'INDEX';
4193
5119
 
4194
- export type AccountExchangeRateWarningDto = {
4195
- /**
4196
- * Warning type
4197
- */
4198
- type: string;
4199
- /**
4200
- * Currency without exchange rate
4201
- */
4202
- currency: string;
4203
- /**
4204
- * Affected account paths
4205
- */
4206
- accounts: Array<string>;
4207
- /**
4208
- * Total amount in this currency
4209
- */
4210
- totalAmount: string;
4211
- };
4212
-
4213
5120
  export type AssetClassSummaryDto = {
4214
5121
  /**
4215
5122
  * Total number of accounts
@@ -4227,6 +5134,12 @@ export type AssetClassSummaryDto = {
4227
5134
  * Exchange rate warnings
4228
5135
  */
4229
5136
  warnings?: Array<AccountExchangeRateWarningDto>;
5137
+ /**
5138
+ * ADR-0105 §4 fallback provenance stats (holding level only). valueRatio is the grey-area share of total converted value; count is the number of source=FALLBACK holdings.
5139
+ */
5140
+ fallback?: {
5141
+ [key: string]: unknown;
5142
+ };
4230
5143
  };
4231
5144
 
4232
5145
  export type AssetClassAccountsResponseDto = {
@@ -4238,6 +5151,56 @@ export type AssetClassAccountsResponseDto = {
4238
5151
  * Summary statistics
4239
5152
  */
4240
5153
  summary: AssetClassSummaryDto;
5154
+ /**
5155
+ * ADR-0105 §6 holding-level grey-area bucket (source=FALLBACK holdings peeled out of groups). Present only for groupBy=holdingAssetClass when FALLBACK holdings exist.
5156
+ */
5157
+ uncategorized?: AssetClassGroupDto;
5158
+ };
5159
+
5160
+ export type HoldingAssetClassAccountSliceDto = {
5161
+ /**
5162
+ * Account ID
5163
+ */
5164
+ accountId: string;
5165
+ /**
5166
+ * Full account path
5167
+ */
5168
+ accountPath: string;
5169
+ /**
5170
+ * Currency of the holding with the largest converted base value; undefined when no holding is convertible
5171
+ */
5172
+ accountCurrency?: string;
5173
+ /**
5174
+ * Account's market value in base currency (Σ converted holdings; grey bucket included)
5175
+ */
5176
+ marketValueBase: string;
5177
+ /**
5178
+ * Share of the global total (0-100). 0 when globalTotal is zero (no NaN/Infinity).
5179
+ */
5180
+ shareOfTotalPct: number;
5181
+ /**
5182
+ * Per-account asset-class breakdown
5183
+ */
5184
+ groups: Array<AssetClassGroupDto>;
5185
+ /**
5186
+ * Per-account grey bucket (source=FALLBACK holdings, incl. broker cash)
5187
+ */
5188
+ uncategorized?: AssetClassGroupDto;
5189
+ /**
5190
+ * Every holding row for this account (account ID in each row’s `id` field)
5191
+ */
5192
+ holdings: Array<AccountItemWithAssetClassDto>;
5193
+ };
5194
+
5195
+ export type HoldingAssetClassCrossAccountResponseDto = {
5196
+ /**
5197
+ * Merged cross-account holding aggregation
5198
+ */
5199
+ global: AssetClassAccountsResponseDto;
5200
+ /**
5201
+ * Per-account slices
5202
+ */
5203
+ byAccount: Array<HoldingAssetClassAccountSliceDto>;
4241
5204
  };
4242
5205
 
4243
5206
  export type CashFlowByCurrencyDto = {
@@ -4271,154 +5234,305 @@ export type ConvertedCashFlowDto = {
4271
5234
  /**
4272
5235
  * Converted net savings
4273
5236
  */
4274
- netSavings: string;
5237
+ netSavings: string;
5238
+ /**
5239
+ * Exchange rates used for conversion
5240
+ */
5241
+ exchangeRates: {
5242
+ [key: string]: unknown;
5243
+ };
5244
+ };
5245
+
5246
+ export type CashFlowResponseDto = {
5247
+ /**
5248
+ * Period identifier (YYYY-MM)
5249
+ */
5250
+ period: string;
5251
+ /**
5252
+ * Total income for the period (converted)
5253
+ */
5254
+ income: string;
5255
+ /**
5256
+ * Total expenses for the period (converted)
5257
+ */
5258
+ expense: string;
5259
+ /**
5260
+ * Net savings (income - expense, converted)
5261
+ */
5262
+ netSavings: string;
5263
+ /**
5264
+ * Savings rate percentage (netSavings / income * 100)
5265
+ */
5266
+ savingsRate: string;
5267
+ /**
5268
+ * Base currency code
5269
+ */
5270
+ currency: string;
5271
+ /**
5272
+ * Cash flow grouped by original currency
5273
+ */
5274
+ byCurrency?: CashFlowByCurrencyDto;
5275
+ /**
5276
+ * Converted values in base currency
5277
+ */
5278
+ converted?: ConvertedCashFlowDto;
5279
+ /**
5280
+ * Exchange rate warnings
5281
+ */
5282
+ warnings?: Array<ExchangeRateWarningDto>;
5283
+ };
5284
+
5285
+ export type CategoryGroupDto = {
5286
+ /**
5287
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
5288
+ */
5289
+ category: string;
5290
+ /**
5291
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
5292
+ */
5293
+ totalExpense: string;
5294
+ /**
5295
+ * Share of grand total (0-100); 0 when grand total is 0
5296
+ */
5297
+ sharePct: number;
5298
+ /**
5299
+ * Raw (unconverted) expense per currency
5300
+ */
5301
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
5302
+ /**
5303
+ * Converted total in base currency (omitted when FX missing for all currencies in this category)
5304
+ */
5305
+ convertedBalance?: string;
5306
+ };
5307
+
5308
+ export type ExpensesByCategorySummaryDto = {
5309
+ /**
5310
+ * Total across all categories, converted (convertible categories only); expense totals when flow=expense, income totals when flow=income
5311
+ */
5312
+ totalExpense: string;
4275
5313
  /**
4276
- * Exchange rates used for conversion
5314
+ * Number of categories
4277
5315
  */
4278
- exchangeRates: {
4279
- [key: string]: unknown;
4280
- };
5316
+ categoryCount: number;
4281
5317
  };
4282
5318
 
4283
- export type CashFlowResponseDto = {
5319
+ export type ExpensesByCategoryResponseDto = {
4284
5320
  /**
4285
- * Period identifier (YYYY-MM)
5321
+ * Period requested
4286
5322
  */
4287
5323
  period: string;
4288
5324
  /**
4289
- * Total income for the period (converted)
5325
+ * Base currency for converted values
4290
5326
  */
4291
- income: string;
5327
+ baseCurrency: string;
4292
5328
  /**
4293
- * Total expenses for the period (converted)
5329
+ * Expense groups by functional category, sorted by converted total desc
4294
5330
  */
4295
- expense: string;
5331
+ groups: Array<CategoryGroupDto>;
4296
5332
  /**
4297
- * Net savings (income - expense, converted)
5333
+ * Summary statistics
4298
5334
  */
4299
- netSavings: string;
5335
+ summary: ExpensesByCategorySummaryDto;
4300
5336
  /**
4301
- * Savings rate percentage (netSavings / income * 100)
5337
+ * Exchange rate warnings (e.g. missing rate for a currency)
4302
5338
  */
4303
- savingsRate: string;
5339
+ warnings?: Array<ExchangeRateWarningDto>;
5340
+ };
5341
+
5342
+ export type MonetaryDto = {
4304
5343
  /**
4305
- * Base currency code
5344
+ * Amount (Decimal string)
5345
+ */
5346
+ amount: string;
5347
+ /**
5348
+ * ISO 4217 currency
4306
5349
  */
4307
5350
  currency: string;
4308
5351
  /**
4309
- * Cash flow grouped by original currency
5352
+ * Converted to user base currency (Decimal string)
4310
5353
  */
4311
- byCurrency?: CashFlowByCurrencyDto;
5354
+ baseCcyEquivalent?: {
5355
+ [key: string]: unknown;
5356
+ } | null;
5357
+ };
5358
+
5359
+ export type CurrentPriceDto = {
4312
5360
  /**
4313
- * Converted values in base currency
5361
+ * Price amount (Decimal string)
4314
5362
  */
4315
- converted?: ConvertedCashFlowDto;
5363
+ amount: string;
4316
5364
  /**
4317
- * Exchange rate warnings
5365
+ * Price currency (ISO 4217)
4318
5366
  */
4319
- warnings?: Array<ExchangeRateWarningDto>;
5367
+ currency: string;
5368
+ /**
5369
+ * Price date (ISO 8601)
5370
+ */
5371
+ date: string;
5372
+ /**
5373
+ * Price source
5374
+ */
5375
+ source: 'USER_OVERRIDE' | 'OPENBB_EQUITY' | 'OPENBB_CURRENCY';
4320
5376
  };
4321
5377
 
4322
- export type CurrencyBalanceDto = {
5378
+ /**
5379
+ * Price source
5380
+ */
5381
+ export type source3 = 'USER_OVERRIDE' | 'OPENBB_EQUITY' | 'OPENBB_CURRENCY';
5382
+
5383
+ export type FxRateDto = {
5384
+ from: string;
5385
+ to: string;
4323
5386
  /**
4324
- * ISO 4217 currency code
5387
+ * FX rate (Decimal string)
4325
5388
  */
4326
- currency: string;
5389
+ rate: string;
4327
5390
  /**
4328
- * Balance amount
5391
+ * Rate date (ISO 8601)
4329
5392
  */
4330
- balance: string;
5393
+ date: string;
4331
5394
  };
4332
5395
 
4333
- export type TimeSeriesPointDto = {
5396
+ export type HoldingPnlRowDto = {
4334
5397
  /**
4335
- * Date in YYYY-MM-DD format
5398
+ * Account UUID
4336
5399
  */
4337
- date: string;
5400
+ accountId: string;
4338
5401
  /**
4339
- * Value at this date (in base currency)
5402
+ * Full account path
4340
5403
  */
4341
- value: string;
5404
+ accountPath: string;
4342
5405
  /**
4343
- * Change from previous point
5406
+ * Account settlement currency (ISO 4217), from cost currency
4344
5407
  */
4345
- change?: {
5408
+ accountCcy?: {
4346
5409
  [key: string]: unknown;
4347
- };
5410
+ } | null;
4348
5411
  /**
4349
- * Multi-currency breakdown for this point
5412
+ * Broker type derived from Platform.type
4350
5413
  */
4351
- byCurrency?: Array<CurrencyBalanceDto>;
4352
- };
4353
-
4354
- export type TrendSummaryDto = {
5414
+ brokerType?: {
5415
+ [key: string]: unknown;
5416
+ } | null;
4355
5417
  /**
4356
- * Value at start of period
5418
+ * Commodity symbol
4357
5419
  */
4358
- startValue: string;
5420
+ symbol: string;
4359
5421
  /**
4360
- * Value at end of period
5422
+ * Chart segment token (libs/common resolver)
4361
5423
  */
4362
- endValue: string;
5424
+ chartToken: 'equity' | 'fund' | 'bond' | 'cash' | 'other';
5425
+ assetClass: string;
5426
+ assetSubClass?: {
5427
+ [key: string]: unknown;
5428
+ } | null;
4363
5429
  /**
4364
- * Total change over period
5430
+ * Net held units (Decimal string)
4365
5431
  */
4366
- totalChange: string;
5432
+ units: string;
4367
5433
  /**
4368
- * Total change percentage
5434
+ * Average cost per unit; null when cost currency conflicts or no cost
4369
5435
  */
4370
- totalChangePercentage: string;
4371
- };
4372
-
4373
- export type MultiCurrencyPointDto = {
5436
+ averageCostPerUnit?: MonetaryDto | null;
4374
5437
  /**
4375
- * Date in YYYY-MM-DD format
5438
+ * Cost basis of held units
4376
5439
  */
4377
- date: string;
5440
+ costBasis?: MonetaryDto | null;
4378
5441
  /**
4379
- * Balances by currency
5442
+ * Market value at asOf price
4380
5443
  */
4381
- byCurrency: Array<CurrencyBalanceDto>;
4382
- };
4383
-
4384
- export type PortfolioTrendsResponseDto = {
5444
+ marketValue?: MonetaryDto | null;
4385
5445
  /**
4386
- * Time series data points
5446
+ * Price used for market value
4387
5447
  */
4388
- series: Array<TimeSeriesPointDto>;
5448
+ currentPrice?: CurrentPriceDto | null;
4389
5449
  /**
4390
- * Period summary
5450
+ * Unrealized P&L in base currency (Decimal string); null when any FX/price missing
4391
5451
  */
4392
- summary: TrendSummaryDto;
5452
+ unrealizedPnlBase?: {
5453
+ [key: string]: unknown;
5454
+ } | null;
4393
5455
  /**
4394
- * Period requested
5456
+ * Unrealized P&L % (Decimal string)
4395
5457
  */
4396
- period: string;
5458
+ unrealizedPnlPct?: {
5459
+ [key: string]: unknown;
5460
+ } | null;
4397
5461
  /**
4398
- * Data granularity
5462
+ * Historical FX rate applied to cost basis
4399
5463
  */
4400
- granularity: string;
5464
+ costFxRate?: FxRateDto | null;
4401
5465
  /**
4402
- * Base currency for converted values
5466
+ * FX rate applied to market value
4403
5467
  */
4404
- currency: string;
5468
+ marketFxRate?: FxRateDto | null;
4405
5469
  /**
4406
- * Multi-currency time series (each point has currency breakdown)
5470
+ * Share of invested assets % (Decimal string); only for invested chartTokens
4407
5471
  */
4408
- byCurrency?: Array<MultiCurrencyPointDto>;
5472
+ pctOfInvestedAssets?: {
5473
+ [key: string]: unknown;
5474
+ } | null;
4409
5475
  /**
4410
- * Exchange rate warnings
5476
+ * Cumulative realized P&L on sold lots (asOf-date cutoff); null when the method has no applicable sells, a sell lacks a price, or any required FX rate is missing (never-mix). When a sell spans multiple currencies (cross-currency sale), amount and currency reflect the base currency; baseCcyEquivalent is always the authoritative dual-FX figure
4411
5477
  */
4412
- warnings?: Array<ExchangeRateWarningDto>;
5478
+ realizedPnl?: MonetaryDto | null;
4413
5479
  };
4414
5480
 
4415
- export type GenerateSnapshotBody = unknown;
5481
+ /**
5482
+ * Chart segment token (libs/common resolver)
5483
+ */
5484
+ export type chartToken = 'equity' | 'fund' | 'bond' | 'cash' | 'other';
4416
5485
 
4417
- export type GenerateSnapshotResponse = unknown;
5486
+ export type HoldingPnlWarningDto = {
5487
+ /**
5488
+ * Warning type
5489
+ */
5490
+ type:
5491
+ | 'MISSING_COST_FX_RATE'
5492
+ | 'MISSING_MARKET_FX_RATE'
5493
+ | 'MISSING_SALE_PRICE'
5494
+ | 'MISSING_REALIZED_FX_RATE'
5495
+ | 'OVERSOLD_LOTS'
5496
+ | 'NO_PRICE'
5497
+ | 'MIXED_COST_CURRENCY';
5498
+ symbol?: {
5499
+ [key: string]: unknown;
5500
+ } | null;
5501
+ accountId?: {
5502
+ [key: string]: unknown;
5503
+ } | null;
5504
+ currency?: {
5505
+ [key: string]: unknown;
5506
+ } | null;
5507
+ };
4418
5508
 
4419
- export type BackfillSnapshotsBody = unknown;
5509
+ /**
5510
+ * Warning type
5511
+ */
5512
+ export type type4 =
5513
+ | 'MISSING_COST_FX_RATE'
5514
+ | 'MISSING_MARKET_FX_RATE'
5515
+ | 'MISSING_SALE_PRICE'
5516
+ | 'MISSING_REALIZED_FX_RATE'
5517
+ | 'OVERSOLD_LOTS'
5518
+ | 'NO_PRICE'
5519
+ | 'MIXED_COST_CURRENCY';
5520
+
5521
+ export type HoldingPnlResponseDto = {
5522
+ asOfDate: string;
5523
+ baseCurrency: string;
5524
+ /**
5525
+ * Realized-P&L lot-matching method (FIFO or average). Unrealized cost basis remains average regardless of this value (#473).
5526
+ */
5527
+ method: 'average' | 'FIFO';
5528
+ rows: Array<HoldingPnlRowDto>;
5529
+ warnings: Array<HoldingPnlWarningDto>;
5530
+ };
4420
5531
 
4421
- export type BackfillSnapshotsResponse = unknown;
5532
+ /**
5533
+ * Realized-P&L lot-matching method (FIFO or average). Unrealized cost basis remains average regardless of this value (#473).
5534
+ */
5535
+ export type method = 'average' | 'FIFO';
4422
5536
 
4423
5537
  export type AnonymousLoginDto = {
4424
5538
  /**
@@ -4427,6 +5541,13 @@ export type AnonymousLoginDto = {
4427
5541
  accessToken: string;
4428
5542
  };
4429
5543
 
5544
+ export type AnonymousLoginResponseDto = {
5545
+ /**
5546
+ * JWT auth token
5547
+ */
5548
+ authToken: string;
5549
+ };
5550
+
4430
5551
  export type AccountControllerCreateData = {
4431
5552
  /**
4432
5553
  * Region code for tenant context
@@ -4455,7 +5576,7 @@ export type AccountControllerFindAllData = {
4455
5576
  */
4456
5577
  region: 'cn' | 'us' | 'de' | 'gb';
4457
5578
  /**
4458
- * Search term for path or i18nKey
5579
+ * Search term for account path
4459
5580
  */
4460
5581
  search?: string;
4461
5582
  /**
@@ -4538,6 +5659,21 @@ export type AccountControllerReopenData = {
4538
5659
 
4539
5660
  export type AccountControllerReopenResponse = AccountResponseDto;
4540
5661
 
5662
+ export type AccountControllerAddOpeningBalanceData = {
5663
+ /**
5664
+ * Account UUID
5665
+ */
5666
+ id: string;
5667
+ /**
5668
+ * Region code for tenant context
5669
+ */
5670
+ region: 'cn' | 'us' | 'de' | 'gb';
5671
+ requestBody: CreateOpeningBalanceDto;
5672
+ };
5673
+
5674
+ export type AccountControllerAddOpeningBalanceResponse =
5675
+ OpeningBalanceResultDto;
5676
+
4541
5677
  export type AccountStandardsControllerGetTemplatesData = {
4542
5678
  /**
4543
5679
  * Region code (cn, us, de)
@@ -4598,6 +5734,10 @@ export type TransactionControllerListData = {
4598
5734
  * Filter by account ID (transactions with postings to this account)
4599
5735
  */
4600
5736
  accountId?: string;
5737
+ /**
5738
+ * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
5739
+ */
5740
+ category?: string;
4601
5741
  /**
4602
5742
  * Filter by start date (inclusive), format: YYYY-MM-DD
4603
5743
  */
@@ -4641,6 +5781,20 @@ export type TransactionControllerCreateBatchData = {
4641
5781
  export type TransactionControllerCreateBatchResponse =
4642
5782
  BatchTransactionResponseDto;
4643
5783
 
5784
+ export type TransactionControllerCorrectData = {
5785
+ /**
5786
+ * Original transaction ID to correct
5787
+ */
5788
+ id: string;
5789
+ /**
5790
+ * Region code for tenant context
5791
+ */
5792
+ region: 'cn' | 'us' | 'de' | 'gb';
5793
+ requestBody: CorrectTransactionDto;
5794
+ };
5795
+
5796
+ export type TransactionControllerCorrectResponse = TransactionDetailDto;
5797
+
4644
5798
  export type TransactionControllerSuggestTagsData = {
4645
5799
  /**
4646
5800
  * Max suggestions (1-100, default 10)
@@ -4708,7 +5862,7 @@ export type TransactionControllerDeleteResponse = void;
4708
5862
 
4709
5863
  export type BalanceControllerGetBalanceData = {
4710
5864
  /**
4711
- * Account name (e.g., "Assets:Bank:Checking")
5865
+ * Account name (e.g., "Assets:Checking")
4712
5866
  */
4713
5867
  account: string;
4714
5868
  /**
@@ -5023,92 +6177,189 @@ export type PayeeProfileAdminControllerUnverifyResponse =
5023
6177
 
5024
6178
  export type CommodityControllerCreateData = {
5025
6179
  /**
5026
- * Region code for tenant context
6180
+ * Region code for tenant context
6181
+ */
6182
+ region: 'cn' | 'us' | 'de' | 'gb';
6183
+ requestBody: CreateCommodityDto;
6184
+ };
6185
+
6186
+ export type CommodityControllerCreateResponse = CommodityResponseDto;
6187
+
6188
+ export type CommodityControllerFindAllData = {
6189
+ /**
6190
+ * Region code for tenant context
6191
+ */
6192
+ region: 'cn' | 'us' | 'de' | 'gb';
6193
+ /**
6194
+ * Search term for symbol or metadata fields (partial match). Searches symbol and metadata.name.
6195
+ */
6196
+ search?: string;
6197
+ /**
6198
+ * Filter by exact symbol match
6199
+ */
6200
+ symbol?: string;
6201
+ };
6202
+
6203
+ export type CommodityControllerFindAllResponse = CommodityListResponseDto;
6204
+
6205
+ export type CommodityControllerFindOneData = {
6206
+ /**
6207
+ * Region code for tenant context
6208
+ */
6209
+ region: 'cn' | 'us' | 'de' | 'gb';
6210
+ /**
6211
+ * Commodity symbol
6212
+ */
6213
+ symbol: string;
6214
+ };
6215
+
6216
+ export type CommodityControllerFindOneResponse = CommodityResponseDto;
6217
+
6218
+ export type CommodityControllerUpdateData = {
6219
+ /**
6220
+ * Region code for tenant context
6221
+ */
6222
+ region: 'cn' | 'us' | 'de' | 'gb';
6223
+ requestBody: UpdateCommodityDto;
6224
+ /**
6225
+ * Commodity symbol
6226
+ */
6227
+ symbol: string;
6228
+ };
6229
+
6230
+ export type CommodityControllerUpdateResponse = CommodityResponseDto;
6231
+
6232
+ export type CommodityControllerDeleteData = {
6233
+ /**
6234
+ * Region code for tenant context
6235
+ */
6236
+ region: 'cn' | 'us' | 'de' | 'gb';
6237
+ /**
6238
+ * Commodity symbol
6239
+ */
6240
+ symbol: string;
6241
+ };
6242
+
6243
+ export type CommodityControllerDeleteResponse = void;
6244
+
6245
+ export type CommodityControllerGetOrCreateData = {
6246
+ /**
6247
+ * Region code for tenant context
6248
+ */
6249
+ region: 'cn' | 'us' | 'de' | 'gb';
6250
+ /**
6251
+ * Commodity symbol
6252
+ */
6253
+ symbol: string;
6254
+ };
6255
+
6256
+ export type CommodityControllerGetOrCreateResponse = CommodityResponseDto;
6257
+
6258
+ export type CommodityControllerBulkCreateData = {
6259
+ /**
6260
+ * Region code for tenant context
6261
+ */
6262
+ region: 'cn' | 'us' | 'de' | 'gb';
6263
+ };
6264
+
6265
+ export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
6266
+
6267
+ export type PriceControllerCreateData = {
6268
+ /**
6269
+ * Region code for tenant context
6270
+ */
6271
+ region: 'cn' | 'us' | 'de' | 'gb';
6272
+ requestBody: CreateBeanPriceDto;
6273
+ };
6274
+
6275
+ export type PriceControllerCreateResponse = PriceResponseDto;
6276
+
6277
+ export type PriceControllerFindAllData = {
6278
+ /**
6279
+ * Filter by currency (e.g., BTC, AAPL, USD)
6280
+ */
6281
+ currency?: string;
6282
+ /**
6283
+ * Filter prices from this date (ISO 8601 format)
6284
+ */
6285
+ dateFrom?: string;
6286
+ /**
6287
+ * Filter prices to this date (ISO 8601 format)
5027
6288
  */
5028
- region: 'cn' | 'us' | 'de' | 'gb';
5029
- requestBody: CreateCommodityDto;
5030
- };
5031
-
5032
- export type CommodityControllerCreateResponse = CommodityResponseDto;
5033
-
5034
- export type CommodityControllerFindAllData = {
6289
+ dateTo?: string;
5035
6290
  /**
5036
- * Region code for tenant context
6291
+ * Number of items per page (default: 20, max: 100)
5037
6292
  */
5038
- region: 'cn' | 'us' | 'de' | 'gb';
6293
+ limit?: number;
5039
6294
  /**
5040
- * Search term for symbol or metadata fields (partial match). Searches symbol and metadata.name.
6295
+ * Page number for pagination (default: 1)
5041
6296
  */
5042
- search?: string;
6297
+ page?: number;
5043
6298
  /**
5044
- * Filter by exact symbol match
6299
+ * Filter by quote currency (pricing currency, e.g., USD, CNY)
5045
6300
  */
5046
- symbol?: string;
5047
- };
5048
-
5049
- export type CommodityControllerFindAllResponse = CommodityListResponseDto;
5050
-
5051
- export type CommodityControllerFindOneData = {
6301
+ quoteCurrency?: string;
5052
6302
  /**
5053
6303
  * Region code for tenant context
5054
6304
  */
5055
6305
  region: 'cn' | 'us' | 'de' | 'gb';
5056
6306
  /**
5057
- * Commodity symbol
6307
+ * Search term for currency or quoteCurrency (case-insensitive partial match)
5058
6308
  */
5059
- symbol: string;
6309
+ search?: string;
5060
6310
  };
5061
6311
 
5062
- export type CommodityControllerFindOneResponse = CommodityResponseDto;
6312
+ export type PriceControllerFindAllResponse = PriceListResponseDto;
5063
6313
 
5064
- export type CommodityControllerUpdateData = {
6314
+ export type PriceControllerFindOneData = {
5065
6315
  /**
5066
- * Region code for tenant context
6316
+ * Price ID
5067
6317
  */
5068
- region: 'cn' | 'us' | 'de' | 'gb';
5069
- requestBody: UpdateCommodityDto;
6318
+ id: string;
5070
6319
  /**
5071
- * Commodity symbol
6320
+ * Region code for tenant context
5072
6321
  */
5073
- symbol: string;
6322
+ region: 'cn' | 'us' | 'de' | 'gb';
5074
6323
  };
5075
6324
 
5076
- export type CommodityControllerUpdateResponse = CommodityResponseDto;
6325
+ export type PriceControllerFindOneResponse = PriceResponseDto;
5077
6326
 
5078
- export type CommodityControllerDeleteData = {
6327
+ export type PriceControllerUpdateData = {
5079
6328
  /**
5080
- * Region code for tenant context
6329
+ * Price ID
5081
6330
  */
5082
- region: 'cn' | 'us' | 'de' | 'gb';
6331
+ id: string;
5083
6332
  /**
5084
- * Commodity symbol
6333
+ * Region code for tenant context
5085
6334
  */
5086
- symbol: string;
6335
+ region: 'cn' | 'us' | 'de' | 'gb';
6336
+ requestBody: UpdateBeanPriceDto;
5087
6337
  };
5088
6338
 
5089
- export type CommodityControllerDeleteResponse = void;
6339
+ export type PriceControllerUpdateResponse = PriceResponseDto;
5090
6340
 
5091
- export type CommodityControllerGetOrCreateData = {
6341
+ export type PriceControllerDeleteData = {
5092
6342
  /**
5093
- * Region code for tenant context
6343
+ * Price ID
5094
6344
  */
5095
- region: 'cn' | 'us' | 'de' | 'gb';
6345
+ id: string;
5096
6346
  /**
5097
- * Commodity symbol
6347
+ * Region code for tenant context
5098
6348
  */
5099
- symbol: string;
6349
+ region: 'cn' | 'us' | 'de' | 'gb';
5100
6350
  };
5101
6351
 
5102
- export type CommodityControllerGetOrCreateResponse = CommodityResponseDto;
6352
+ export type PriceControllerDeleteResponse = void;
5103
6353
 
5104
- export type CommodityControllerBulkCreateData = {
6354
+ export type PriceControllerBulkCreateData = {
5105
6355
  /**
5106
6356
  * Region code for tenant context
5107
6357
  */
5108
6358
  region: 'cn' | 'us' | 'de' | 'gb';
6359
+ requestBody: Array<string>;
5109
6360
  };
5110
6361
 
5111
- export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
6362
+ export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
5112
6363
 
5113
6364
  export type RecurringRuleControllerCreateData = {
5114
6365
  /**
@@ -5504,7 +6755,7 @@ export type UserControllerSignupUserData = {
5504
6755
  requestBody: SignupDto;
5505
6756
  };
5506
6757
 
5507
- export type UserControllerSignupUserResponse = unknown;
6758
+ export type UserControllerSignupUserResponse = SignupResponseDto;
5508
6759
 
5509
6760
  export type UserControllerDeleteUserData = {
5510
6761
  /**
@@ -5575,6 +6826,220 @@ export type PropertyControllerDeleteData = {
5575
6826
 
5576
6827
  export type PropertyControllerDeleteResponse = void;
5577
6828
 
6829
+ export type ReportingControllerGetPortfolioTrendsData = {
6830
+ /**
6831
+ * Data granularity
6832
+ */
6833
+ granularity?: 'day' | 'week' | 'month';
6834
+ /**
6835
+ * Time period
6836
+ */
6837
+ period?: '1m' | '3m' | '6m' | '1y';
6838
+ /**
6839
+ * Region code for tenant context
6840
+ */
6841
+ region: 'cn' | 'us' | 'de' | 'gb';
6842
+ };
6843
+
6844
+ export type ReportingControllerGetPortfolioTrendsResponse =
6845
+ PortfolioTrendsResponseDto;
6846
+
6847
+ export type ReportingControllerGetCashFlowTrendsData = {
6848
+ /**
6849
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6850
+ */
6851
+ granularity?: 'day' | 'week' | 'month';
6852
+ /**
6853
+ * Time period
6854
+ */
6855
+ period?: '1m' | '3m' | '6m' | '1y';
6856
+ /**
6857
+ * Region code for tenant context
6858
+ */
6859
+ region: 'cn' | 'us' | 'de' | 'gb';
6860
+ };
6861
+
6862
+ export type ReportingControllerGetCashFlowTrendsResponse =
6863
+ CashFlowTrendsResponseDto;
6864
+
6865
+ export type ReportingControllerGenerateSnapshotData = {
6866
+ /**
6867
+ * Region code for tenant context
6868
+ */
6869
+ region: 'cn' | 'us' | 'de' | 'gb';
6870
+ /**
6871
+ * Optional date (defaults to today)
6872
+ */
6873
+ requestBody: GenerateSnapshotBody;
6874
+ };
6875
+
6876
+ export type ReportingControllerGenerateSnapshotResponse =
6877
+ GenerateSnapshotResponse;
6878
+
6879
+ export type ReportingControllerBackfillSnapshotsData = {
6880
+ /**
6881
+ * Region code for tenant context
6882
+ */
6883
+ region: 'cn' | 'us' | 'de' | 'gb';
6884
+ requestBody: BackfillSnapshotsBody;
6885
+ };
6886
+
6887
+ export type ReportingControllerBackfillSnapshotsResponse =
6888
+ BackfillSnapshotsResponse;
6889
+
6890
+ export type EventControllerCreateData = {
6891
+ /**
6892
+ * Region code for tenant context (decorative for life events)
6893
+ */
6894
+ region: 'cn' | 'us' | 'de' | 'gb';
6895
+ requestBody: CreateBeanEventDto;
6896
+ };
6897
+
6898
+ export type EventControllerCreateResponse = EventResponseDto;
6899
+
6900
+ export type EventControllerFindAllData = {
6901
+ /**
6902
+ * Filter life events from this date (ISO 8601 format)
6903
+ */
6904
+ from?: string;
6905
+ /**
6906
+ * Number of items per page (default: 20, max: 100)
6907
+ */
6908
+ limit?: number;
6909
+ /**
6910
+ * Page number for pagination (default: 1)
6911
+ */
6912
+ page?: number;
6913
+ /**
6914
+ * Search term for description (case-insensitive partial match)
6915
+ */
6916
+ q?: string;
6917
+ /**
6918
+ * Region code for tenant context (decorative for life events)
6919
+ */
6920
+ region: 'cn' | 'us' | 'de' | 'gb';
6921
+ /**
6922
+ * Filter life events to this date (ISO 8601 format)
6923
+ */
6924
+ to?: string;
6925
+ /**
6926
+ * Filter by life event type (exact match)
6927
+ */
6928
+ type?: string;
6929
+ };
6930
+
6931
+ export type EventControllerFindAllResponse = EventListResponseDto;
6932
+
6933
+ export type EventControllerFindOneData = {
6934
+ /**
6935
+ * Life event ID
6936
+ */
6937
+ id: string;
6938
+ /**
6939
+ * Region code for tenant context (decorative for life events)
6940
+ */
6941
+ region: 'cn' | 'us' | 'de' | 'gb';
6942
+ };
6943
+
6944
+ export type EventControllerFindOneResponse = EventResponseDto;
6945
+
6946
+ export type EventControllerUpdateData = {
6947
+ /**
6948
+ * Life event ID
6949
+ */
6950
+ id: string;
6951
+ /**
6952
+ * Region code for tenant context (decorative for life events)
6953
+ */
6954
+ region: 'cn' | 'us' | 'de' | 'gb';
6955
+ requestBody: UpdateBeanEventDto;
6956
+ };
6957
+
6958
+ export type EventControllerUpdateResponse = EventResponseDto;
6959
+
6960
+ export type EventControllerDeleteData = {
6961
+ /**
6962
+ * Life event ID
6963
+ */
6964
+ id: string;
6965
+ /**
6966
+ * Region code for tenant context (decorative for life events)
6967
+ */
6968
+ region: 'cn' | 'us' | 'de' | 'gb';
6969
+ };
6970
+
6971
+ export type EventControllerDeleteResponse = void;
6972
+
6973
+ export type EventControllerGetSliceData = {
6974
+ accountPattern: string;
6975
+ granularity: string;
6976
+ /**
6977
+ * Life event ID
6978
+ */
6979
+ id: string;
6980
+ /**
6981
+ * Region code for tenant context (decorative for life events)
6982
+ */
6983
+ region: 'cn' | 'us' | 'de' | 'gb';
6984
+ };
6985
+
6986
+ export type EventControllerGetSliceResponse = unknown;
6987
+
6988
+ export type OnboardingControllerBootstrapData = {
6989
+ /**
6990
+ * Region code for tenant context
6991
+ */
6992
+ region: 'cn' | 'us' | 'de' | 'gb';
6993
+ requestBody: OnboardingDto;
6994
+ };
6995
+
6996
+ export type OnboardingControllerBootstrapResponse = unknown;
6997
+
6998
+ export type ReconciliationControllerComputeData = {
6999
+ /**
7000
+ * Region code for tenant context (decorative for reconciliation)
7001
+ */
7002
+ region: 'cn' | 'us' | 'de' | 'gb';
7003
+ requestBody: ComputeReconciliationDto;
7004
+ };
7005
+
7006
+ export type ReconciliationControllerComputeResponse =
7007
+ ReconciliationComputeResultDto;
7008
+
7009
+ export type ReconciliationControllerAssertData = {
7010
+ /**
7011
+ * Region code for tenant context (decorative for reconciliation)
7012
+ */
7013
+ region: 'cn' | 'us' | 'de' | 'gb';
7014
+ requestBody: AssertReconciliationDto;
7015
+ };
7016
+
7017
+ export type ReconciliationControllerAssertResponse = ReconciliationRecordDto;
7018
+
7019
+ export type ReconciliationControllerPadData = {
7020
+ /**
7021
+ * Region code for tenant context (decorative for reconciliation)
7022
+ */
7023
+ region: 'cn' | 'us' | 'de' | 'gb';
7024
+ requestBody: PadReconciliationDto;
7025
+ };
7026
+
7027
+ export type ReconciliationControllerPadResponse = PadResultDto;
7028
+
7029
+ export type ReconciliationControllerHistoryData = {
7030
+ /**
7031
+ * BeanAccount id
7032
+ */
7033
+ accountId: string;
7034
+ /**
7035
+ * Region code for tenant context (decorative for reconciliation)
7036
+ */
7037
+ region: 'cn' | 'us' | 'de' | 'gb';
7038
+ };
7039
+
7040
+ export type ReconciliationControllerHistoryResponse =
7041
+ Array<ReconciliationRecordDto>;
7042
+
5578
7043
  export type ExportControllerExportBeancountResponse = unknown;
5579
7044
 
5580
7045
  export type FileImportControllerImportFileData = {
@@ -5652,62 +7117,20 @@ export type ImporterConfigControllerUpdateConfigData = {
5652
7117
  requestBody: UpdateImporterConfigDto;
5653
7118
  };
5654
7119
 
5655
- export type ImporterConfigControllerUpdateConfigResponse = ImporterConfigDto;
5656
-
5657
- export type ImporterConfigControllerResetConfigData = {
5658
- /**
5659
- * Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
5660
- */
5661
- importerId: string;
5662
- /**
5663
- * Region code for tenant context
5664
- */
5665
- region: 'cn' | 'us' | 'de' | 'gb';
5666
- };
5667
-
5668
- export type ImporterConfigControllerResetConfigResponse = ImporterConfigDto;
5669
-
5670
- export type PlatformControllerFindAllResponse = unknown;
5671
-
5672
- export type PlatformControllerCreateData = {
5673
- requestBody: CreatePlatformDto;
5674
- };
5675
-
5676
- export type PlatformControllerCreateResponse = unknown;
5677
-
5678
- export type PlatformControllerGetPlatformListResponse = unknown;
5679
-
5680
- export type PlatformControllerMatchPlatformsData = {
5681
- /**
5682
- * Search query — Chinese name, English name, or abbreviation
5683
- */
5684
- q: string;
5685
- /**
5686
- * Region code for category override lookup
5687
- */
5688
- region?: string;
5689
- };
5690
-
5691
- export type PlatformControllerMatchPlatformsResponse = unknown;
5692
-
5693
- export type PlatformControllerUpdateData = {
5694
- /**
5695
- * Platform ID
5696
- */
5697
- id: string;
5698
- requestBody: UpdatePlatformDto;
5699
- };
5700
-
5701
- export type PlatformControllerUpdateResponse = unknown;
7120
+ export type ImporterConfigControllerUpdateConfigResponse = ImporterConfigDto;
5702
7121
 
5703
- export type PlatformControllerDeleteData = {
7122
+ export type ImporterConfigControllerResetConfigData = {
5704
7123
  /**
5705
- * Platform ID
7124
+ * Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
5706
7125
  */
5707
- id: string;
7126
+ importerId: string;
7127
+ /**
7128
+ * Region code for tenant context
7129
+ */
7130
+ region: 'cn' | 'us' | 'de' | 'gb';
5708
7131
  };
5709
7132
 
5710
- export type PlatformControllerDeleteResponse = void;
7133
+ export type ImporterConfigControllerResetConfigResponse = ImporterConfigDto;
5711
7134
 
5712
7135
  export type ProviderSyncControllerSyncData = {
5713
7136
  /**
@@ -5723,9 +7146,9 @@ export type ProviderSyncControllerSyncData = {
5723
7146
  | 'beancount-direct'
5724
7147
  | 'parsed-bill';
5725
7148
  /**
5726
- * Region code
7149
+ * Region code for tenant context
5727
7150
  */
5728
- region: unknown;
7151
+ region: 'cn' | 'us' | 'de' | 'gb';
5729
7152
  requestBody: ProviderSyncDto;
5730
7153
  };
5731
7154
 
@@ -5754,6 +7177,49 @@ export type ProviderSyncControllerIsProviderSupportedData = {
5754
7177
 
5755
7178
  export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
5756
7179
 
7180
+ export type ExternalAccountLinkControllerCreateData = {
7181
+ /**
7182
+ * Region code for tenant context
7183
+ */
7184
+ region: 'cn' | 'us' | 'de' | 'gb';
7185
+ requestBody: CreateExternalAccountLinkDto;
7186
+ };
7187
+
7188
+ export type ExternalAccountLinkControllerCreateResponse =
7189
+ ExternalAccountLinkResponseDto;
7190
+
7191
+ export type ExternalAccountLinkControllerFindAllData = {
7192
+ provider: string;
7193
+ /**
7194
+ * Region code for tenant context
7195
+ */
7196
+ region: 'cn' | 'us' | 'de' | 'gb';
7197
+ };
7198
+
7199
+ export type ExternalAccountLinkControllerFindAllResponse =
7200
+ ExternalAccountLinkListResponseDto;
7201
+
7202
+ export type ExternalAccountLinkControllerFindOneData = {
7203
+ id: string;
7204
+ /**
7205
+ * Region code for tenant context
7206
+ */
7207
+ region: 'cn' | 'us' | 'de' | 'gb';
7208
+ };
7209
+
7210
+ export type ExternalAccountLinkControllerFindOneResponse =
7211
+ ExternalAccountLinkResponseDto;
7212
+
7213
+ export type ExternalAccountLinkControllerRemoveData = {
7214
+ id: string;
7215
+ /**
7216
+ * Region code for tenant context
7217
+ */
7218
+ region: 'cn' | 'us' | 'de' | 'gb';
7219
+ };
7220
+
7221
+ export type ExternalAccountLinkControllerRemoveResponse = void;
7222
+
5757
7223
  export type TelemetryControllerReportTelemetryData = {
5758
7224
  /**
5759
7225
  * Region code for tenant context
@@ -5764,6 +7230,29 @@ export type TelemetryControllerReportTelemetryData = {
5764
7230
 
5765
7231
  export type TelemetryControllerReportTelemetryResponse = unknown;
5766
7232
 
7233
+ export type TelemetryControllerReportCoverageMissData = {
7234
+ /**
7235
+ * Region code for tenant context
7236
+ */
7237
+ region: 'cn' | 'us' | 'de' | 'gb';
7238
+ requestBody: UncoveredFormatMissDto;
7239
+ };
7240
+
7241
+ export type TelemetryControllerReportCoverageMissResponse = unknown;
7242
+
7243
+ export type TelemetryControllerGetCoverageMetricsData = {
7244
+ /**
7245
+ * Region code for tenant context
7246
+ */
7247
+ region: 'cn' | 'us' | 'de' | 'gb';
7248
+ /**
7249
+ * Top-N uncovered formats (default 10)
7250
+ */
7251
+ topN?: unknown;
7252
+ };
7253
+
7254
+ export type TelemetryControllerGetCoverageMetricsResponse = unknown;
7255
+
5767
7256
  export type NlpControllerProcessNaturalLanguageData = {
5768
7257
  /**
5769
7258
  * Region code for tenant context
@@ -5803,6 +7292,49 @@ export type NlpControllerGetSessionData = {
5803
7292
 
5804
7293
  export type NlpControllerGetSessionResponse = unknown;
5805
7294
 
7295
+ export type PlatformControllerFindAllResponse = unknown;
7296
+
7297
+ export type PlatformControllerCreateData = {
7298
+ requestBody: CreatePlatformDto;
7299
+ };
7300
+
7301
+ export type PlatformControllerCreateResponse = unknown;
7302
+
7303
+ export type PlatformControllerGetPlatformListResponse =
7304
+ Array<PlatformListItemDto>;
7305
+
7306
+ export type PlatformControllerMatchPlatformsData = {
7307
+ /**
7308
+ * Search query — Chinese name, English name, or abbreviation
7309
+ */
7310
+ q: string;
7311
+ /**
7312
+ * Region code for category override lookup
7313
+ */
7314
+ region?: string;
7315
+ };
7316
+
7317
+ export type PlatformControllerMatchPlatformsResponse = PlatformMatchResponseDto;
7318
+
7319
+ export type PlatformControllerUpdateData = {
7320
+ /**
7321
+ * Platform ID
7322
+ */
7323
+ id: string;
7324
+ requestBody: UpdatePlatformDto;
7325
+ };
7326
+
7327
+ export type PlatformControllerUpdateResponse = unknown;
7328
+
7329
+ export type PlatformControllerDeleteData = {
7330
+ /**
7331
+ * Platform ID
7332
+ */
7333
+ id: string;
7334
+ };
7335
+
7336
+ export type PlatformControllerDeleteResponse = void;
7337
+
5806
7338
  export type DashboardControllerGetNetWorthData = {
5807
7339
  /**
5808
7340
  * Date for balance calculation (ISO 8601 format)
@@ -5817,6 +7349,10 @@ export type DashboardControllerGetNetWorthData = {
5817
7349
  export type DashboardControllerGetNetWorthResponse = NetWorthResponseDto;
5818
7350
 
5819
7351
  export type DashboardControllerGetAccountsData = {
7352
+ /**
7353
+ * Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
7354
+ */
7355
+ accountId?: string;
5820
7356
  /**
5821
7357
  * Date for balance calculation (ISO 8601 format)
5822
7358
  */
@@ -5824,7 +7360,11 @@ export type DashboardControllerGetAccountsData = {
5824
7360
  /**
5825
7361
  * Grouping strategy
5826
7362
  */
5827
- groupBy?: 'platform' | 'assetClass';
7363
+ groupBy?:
7364
+ | 'platform'
7365
+ | 'assetClass'
7366
+ | 'holdingAssetClass'
7367
+ | 'holdingAssetClassByAccount';
5828
7368
  /**
5829
7369
  * Region code for tenant context
5830
7370
  */
@@ -5833,7 +7373,8 @@ export type DashboardControllerGetAccountsData = {
5833
7373
 
5834
7374
  export type DashboardControllerGetAccountsResponse =
5835
7375
  | AccountsResponseDto
5836
- | AssetClassAccountsResponseDto;
7376
+ | AssetClassAccountsResponseDto
7377
+ | HoldingAssetClassCrossAccountResponseDto;
5837
7378
 
5838
7379
  export type DashboardControllerGetCashFlowData = {
5839
7380
  /**
@@ -5848,13 +7389,17 @@ export type DashboardControllerGetCashFlowData = {
5848
7389
 
5849
7390
  export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
5850
7391
 
5851
- export type ReportingControllerGetPortfolioTrendsData = {
7392
+ export type DashboardControllerGetExpensesData = {
5852
7393
  /**
5853
- * Data granularity
7394
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
5854
7395
  */
5855
- granularity?: 'day' | 'week' | 'month';
7396
+ flow?: 'expense' | 'income';
5856
7397
  /**
5857
- * Time period
7398
+ * Grouping strategy
7399
+ */
7400
+ groupBy?: 'category';
7401
+ /**
7402
+ * Time window (1m = current calendar month)
5858
7403
  */
5859
7404
  period?: '1m' | '3m' | '6m' | '1y';
5860
7405
  /**
@@ -5863,33 +7408,29 @@ export type ReportingControllerGetPortfolioTrendsData = {
5863
7408
  region: 'cn' | 'us' | 'de' | 'gb';
5864
7409
  };
5865
7410
 
5866
- export type ReportingControllerGetPortfolioTrendsResponse =
5867
- PortfolioTrendsResponseDto;
7411
+ export type DashboardControllerGetExpensesResponse =
7412
+ ExpensesByCategoryResponseDto;
5868
7413
 
5869
- export type ReportingControllerGenerateSnapshotData = {
7414
+ export type HoldingPnlControllerGetHoldingPnlData = {
5870
7415
  /**
5871
- * Region code for tenant context
7416
+ * Scope to a single account
5872
7417
  */
5873
- region: 'cn' | 'us' | 'de' | 'gb';
7418
+ accountId?: string;
5874
7419
  /**
5875
- * Optional date (defaults to today)
7420
+ * As-of date (ISO 8601), defaults to today
5876
7421
  */
5877
- requestBody: GenerateSnapshotBody;
5878
- };
5879
-
5880
- export type ReportingControllerGenerateSnapshotResponse =
5881
- GenerateSnapshotResponse;
5882
-
5883
- export type ReportingControllerBackfillSnapshotsData = {
7422
+ asOf?: string;
7423
+ /**
7424
+ * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
7425
+ */
7426
+ method?: 'FIFO' | 'average';
5884
7427
  /**
5885
7428
  * Region code for tenant context
5886
7429
  */
5887
7430
  region: 'cn' | 'us' | 'de' | 'gb';
5888
- requestBody: BackfillSnapshotsBody;
5889
7431
  };
5890
7432
 
5891
- export type ReportingControllerBackfillSnapshotsResponse =
5892
- BackfillSnapshotsResponse;
7433
+ export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
5893
7434
 
5894
7435
  export type ApiKeysControllerCreateApiKeyResponse = unknown;
5895
7436
 
@@ -5897,7 +7438,7 @@ export type AuthControllerAccessTokenLoginData = {
5897
7438
  requestBody: AnonymousLoginDto;
5898
7439
  };
5899
7440
 
5900
- export type AuthControllerAccessTokenLoginResponse = unknown;
7441
+ export type AuthControllerAccessTokenLoginResponse = AnonymousLoginResponseDto;
5901
7442
 
5902
7443
  export type CacheControllerFlushCacheResponse = unknown;
5903
7444
 
@@ -6045,6 +7586,25 @@ export type $OpenApiTs = {
6045
7586
  };
6046
7587
  };
6047
7588
  };
7589
+ '/api/v1/{region}/bean/accounts/{id}/opening-balance': {
7590
+ post: {
7591
+ req: AccountControllerAddOpeningBalanceData;
7592
+ res: {
7593
+ /**
7594
+ * Opening-balance transaction created
7595
+ */
7596
+ 201: OpeningBalanceResultDto;
7597
+ /**
7598
+ * Account not found
7599
+ */
7600
+ 404: unknown;
7601
+ /**
7602
+ * An opening balance already exists for this account
7603
+ */
7604
+ 409: unknown;
7605
+ };
7606
+ };
7607
+ };
6048
7608
  '/api/v1/{region}/bean/account-standards': {
6049
7609
  get: {
6050
7610
  req: AccountStandardsControllerGetTemplatesData;
@@ -6141,6 +7701,29 @@ export type $OpenApiTs = {
6141
7701
  };
6142
7702
  };
6143
7703
  };
7704
+ '/api/v1/{region}/bean/transactions/{id}/correct': {
7705
+ post: {
7706
+ req: TransactionControllerCorrectData;
7707
+ res: {
7708
+ /**
7709
+ * Corrected transaction created
7710
+ */
7711
+ 201: TransactionDetailDto;
7712
+ /**
7713
+ * Original transaction not found
7714
+ */
7715
+ 404: ApiProblemResponseDto;
7716
+ /**
7717
+ * Original no longer ACTIVE (concurrent modification)
7718
+ */
7719
+ 409: ApiProblemResponseDto;
7720
+ /**
7721
+ * Pipeline validation failed (does not balance, invalid accounts)
7722
+ */
7723
+ 422: ApiProblemResponseDto;
7724
+ };
7725
+ };
7726
+ };
6144
7727
  '/api/v1/{region}/bean/transactions/tags': {
6145
7728
  get: {
6146
7729
  req: TransactionControllerSuggestTagsData;
@@ -6531,102 +8114,186 @@ export type $OpenApiTs = {
6531
8114
  /**
6532
8115
  * Payee profile not found
6533
8116
  */
6534
- 404: ApiProblemResponseDto;
8117
+ 404: ApiProblemResponseDto;
8118
+ };
8119
+ };
8120
+ };
8121
+ '/api/v1/{region}/bean/commodities': {
8122
+ post: {
8123
+ req: CommodityControllerCreateData;
8124
+ res: {
8125
+ /**
8126
+ * Commodity created successfully
8127
+ */
8128
+ 201: CommodityResponseDto;
8129
+ /**
8130
+ * Invalid input data
8131
+ */
8132
+ 400: ApiProblemResponseDto;
8133
+ /**
8134
+ * Commodity already exists
8135
+ */
8136
+ 409: ApiProblemResponseDto;
8137
+ };
8138
+ };
8139
+ get: {
8140
+ req: CommodityControllerFindAllData;
8141
+ res: {
8142
+ /**
8143
+ * Commodities retrieved successfully
8144
+ */
8145
+ 200: CommodityListResponseDto;
8146
+ };
8147
+ };
8148
+ };
8149
+ '/api/v1/{region}/bean/commodities/{symbol}': {
8150
+ get: {
8151
+ req: CommodityControllerFindOneData;
8152
+ res: {
8153
+ /**
8154
+ * Commodity retrieved successfully
8155
+ */
8156
+ 200: CommodityResponseDto;
8157
+ /**
8158
+ * Commodity not found
8159
+ */
8160
+ 404: ApiProblemResponseDto;
8161
+ };
8162
+ };
8163
+ put: {
8164
+ req: CommodityControllerUpdateData;
8165
+ res: {
8166
+ /**
8167
+ * Commodity updated successfully
8168
+ */
8169
+ 200: CommodityResponseDto;
8170
+ /**
8171
+ * Invalid input data
8172
+ */
8173
+ 400: ApiProblemResponseDto;
8174
+ /**
8175
+ * Commodity not found
8176
+ */
8177
+ 404: ApiProblemResponseDto;
8178
+ };
8179
+ };
8180
+ delete: {
8181
+ req: CommodityControllerDeleteData;
8182
+ res: {
8183
+ /**
8184
+ * Commodity deleted successfully
8185
+ */
8186
+ 204: void;
8187
+ /**
8188
+ * Commodity not found
8189
+ */
8190
+ 404: ApiProblemResponseDto;
8191
+ };
8192
+ };
8193
+ };
8194
+ '/api/v1/{region}/bean/commodities/{symbol}/ensure': {
8195
+ post: {
8196
+ req: CommodityControllerGetOrCreateData;
8197
+ res: {
8198
+ /**
8199
+ * Commodity retrieved or created
8200
+ */
8201
+ 200: CommodityResponseDto;
8202
+ };
8203
+ };
8204
+ };
8205
+ '/api/v1/{region}/bean/commodities/bulk': {
8206
+ post: {
8207
+ req: CommodityControllerBulkCreateData;
8208
+ res: {
8209
+ /**
8210
+ * Commodities created successfully
8211
+ */
8212
+ 201: Array<CommodityResponseDto>;
6535
8213
  };
6536
8214
  };
6537
8215
  };
6538
- '/api/v1/{region}/bean/commodities': {
8216
+ '/api/v1/{region}/bean/prices': {
6539
8217
  post: {
6540
- req: CommodityControllerCreateData;
8218
+ req: PriceControllerCreateData;
6541
8219
  res: {
6542
8220
  /**
6543
- * Commodity created successfully
8221
+ * Price created successfully
6544
8222
  */
6545
- 201: CommodityResponseDto;
8223
+ 201: PriceResponseDto;
6546
8224
  /**
6547
- * Invalid input data
8225
+ * Currency or quoteCurrency commodity not found
6548
8226
  */
6549
- 400: ApiProblemResponseDto;
8227
+ 404: unknown;
6550
8228
  /**
6551
- * Commodity already exists
8229
+ * Price already exists for this currency pair and date
6552
8230
  */
6553
- 409: ApiProblemResponseDto;
8231
+ 409: unknown;
6554
8232
  };
6555
8233
  };
6556
8234
  get: {
6557
- req: CommodityControllerFindAllData;
8235
+ req: PriceControllerFindAllData;
6558
8236
  res: {
6559
8237
  /**
6560
- * Commodities retrieved successfully
8238
+ * Prices retrieved successfully
6561
8239
  */
6562
- 200: CommodityListResponseDto;
8240
+ 200: PriceListResponseDto;
6563
8241
  };
6564
8242
  };
6565
8243
  };
6566
- '/api/v1/{region}/bean/commodities/{symbol}': {
8244
+ '/api/v1/{region}/bean/prices/{id}': {
6567
8245
  get: {
6568
- req: CommodityControllerFindOneData;
8246
+ req: PriceControllerFindOneData;
6569
8247
  res: {
6570
8248
  /**
6571
- * Commodity retrieved successfully
8249
+ * Price retrieved successfully
6572
8250
  */
6573
- 200: CommodityResponseDto;
8251
+ 200: PriceResponseDto;
6574
8252
  /**
6575
- * Commodity not found
8253
+ * Price not found
6576
8254
  */
6577
- 404: ApiProblemResponseDto;
8255
+ 404: unknown;
6578
8256
  };
6579
8257
  };
6580
8258
  put: {
6581
- req: CommodityControllerUpdateData;
8259
+ req: PriceControllerUpdateData;
6582
8260
  res: {
6583
8261
  /**
6584
- * Commodity updated successfully
8262
+ * Price updated successfully
6585
8263
  */
6586
- 200: CommodityResponseDto;
8264
+ 200: PriceResponseDto;
6587
8265
  /**
6588
- * Invalid input data
8266
+ * Price not found
6589
8267
  */
6590
- 400: ApiProblemResponseDto;
8268
+ 404: unknown;
6591
8269
  /**
6592
- * Commodity not found
8270
+ * Updated price conflicts with existing price
6593
8271
  */
6594
- 404: ApiProblemResponseDto;
8272
+ 409: unknown;
6595
8273
  };
6596
8274
  };
6597
8275
  delete: {
6598
- req: CommodityControllerDeleteData;
8276
+ req: PriceControllerDeleteData;
6599
8277
  res: {
6600
8278
  /**
6601
- * Commodity deleted successfully
8279
+ * Price deleted successfully
6602
8280
  */
6603
8281
  204: void;
6604
8282
  /**
6605
- * Commodity not found
6606
- */
6607
- 404: ApiProblemResponseDto;
6608
- };
6609
- };
6610
- };
6611
- '/api/v1/{region}/bean/commodities/{symbol}/ensure': {
6612
- post: {
6613
- req: CommodityControllerGetOrCreateData;
6614
- res: {
6615
- /**
6616
- * Commodity retrieved or created
8283
+ * Price not found
6617
8284
  */
6618
- 200: CommodityResponseDto;
8285
+ 404: unknown;
6619
8286
  };
6620
8287
  };
6621
8288
  };
6622
- '/api/v1/{region}/bean/commodities/bulk': {
8289
+ '/api/v1/{region}/bean/prices/bulk': {
6623
8290
  post: {
6624
- req: CommodityControllerBulkCreateData;
8291
+ req: PriceControllerBulkCreateData;
6625
8292
  res: {
6626
8293
  /**
6627
- * Commodities created successfully
8294
+ * Prices created successfully
6628
8295
  */
6629
- 201: Array<CommodityResponseDto>;
8296
+ 201: Array<PriceResponseDto>;
6630
8297
  };
6631
8298
  };
6632
8299
  };
@@ -7117,7 +8784,7 @@ export type $OpenApiTs = {
7117
8784
  /**
7118
8785
  * User created successfully
7119
8786
  */
7120
- 201: unknown;
8787
+ 201: SignupResponseDto;
7121
8788
  /**
7122
8789
  * Invalid Turnstile token (when Turnstile is enabled)
7123
8790
  */
@@ -7218,57 +8885,304 @@ export type $OpenApiTs = {
7218
8885
  req: PropertyControllerGetByKeyData;
7219
8886
  res: {
7220
8887
  /**
7221
- * Property retrieved successfully
8888
+ * Property retrieved successfully
8889
+ */
8890
+ 200: unknown;
8891
+ /**
8892
+ * Unauthorized
8893
+ */
8894
+ 401: unknown;
8895
+ /**
8896
+ * Forbidden - insufficient permissions
8897
+ */
8898
+ 403: unknown;
8899
+ /**
8900
+ * Property not found
8901
+ */
8902
+ 404: unknown;
8903
+ };
8904
+ };
8905
+ put: {
8906
+ req: PropertyControllerUpdateData;
8907
+ res: {
8908
+ /**
8909
+ * Property updated successfully
8910
+ */
8911
+ 200: unknown;
8912
+ /**
8913
+ * Unauthorized
8914
+ */
8915
+ 401: unknown;
8916
+ /**
8917
+ * Forbidden - insufficient permissions
8918
+ */
8919
+ 403: unknown;
8920
+ };
8921
+ };
8922
+ delete: {
8923
+ req: PropertyControllerDeleteData;
8924
+ res: {
8925
+ /**
8926
+ * Property deleted successfully
8927
+ */
8928
+ 204: void;
8929
+ /**
8930
+ * Unauthorized
8931
+ */
8932
+ 401: unknown;
8933
+ /**
8934
+ * Forbidden - insufficient permissions
8935
+ */
8936
+ 403: unknown;
8937
+ /**
8938
+ * Property not found
8939
+ */
8940
+ 404: unknown;
8941
+ };
8942
+ };
8943
+ };
8944
+ '/api/v1/{region}/reporting/portfolio/trends': {
8945
+ get: {
8946
+ req: ReportingControllerGetPortfolioTrendsData;
8947
+ res: {
8948
+ /**
8949
+ * Trends retrieved successfully
8950
+ */
8951
+ 200: PortfolioTrendsResponseDto;
8952
+ /**
8953
+ * User not authenticated
8954
+ */
8955
+ 401: unknown;
8956
+ };
8957
+ };
8958
+ };
8959
+ '/api/v1/{region}/reporting/cash-flow/trends': {
8960
+ get: {
8961
+ req: ReportingControllerGetCashFlowTrendsData;
8962
+ res: {
8963
+ /**
8964
+ * Cash-flow trends retrieved successfully
8965
+ */
8966
+ 200: CashFlowTrendsResponseDto;
8967
+ /**
8968
+ * User not authenticated
8969
+ */
8970
+ 401: unknown;
8971
+ };
8972
+ };
8973
+ };
8974
+ '/api/v1/{region}/reporting/snapshots/generate': {
8975
+ post: {
8976
+ req: ReportingControllerGenerateSnapshotData;
8977
+ res: {
8978
+ /**
8979
+ * Snapshot generated successfully
8980
+ */
8981
+ 200: GenerateSnapshotResponse;
8982
+ /**
8983
+ * Invalid date format
8984
+ */
8985
+ 400: unknown;
8986
+ /**
8987
+ * User not authenticated
8988
+ */
8989
+ 401: unknown;
8990
+ };
8991
+ };
8992
+ };
8993
+ '/api/v1/{region}/reporting/snapshots/backfill': {
8994
+ post: {
8995
+ req: ReportingControllerBackfillSnapshotsData;
8996
+ res: {
8997
+ /**
8998
+ * Backfill completed successfully
8999
+ */
9000
+ 200: BackfillSnapshotsResponse;
9001
+ /**
9002
+ * Invalid date format or range
9003
+ */
9004
+ 400: unknown;
9005
+ /**
9006
+ * User not authenticated
9007
+ */
9008
+ 401: unknown;
9009
+ /**
9010
+ * Backfill already in progress for this user
9011
+ */
9012
+ 409: unknown;
9013
+ };
9014
+ };
9015
+ };
9016
+ '/api/v1/{region}/bean/events': {
9017
+ post: {
9018
+ req: EventControllerCreateData;
9019
+ res: {
9020
+ /**
9021
+ * Life event created successfully
9022
+ */
9023
+ 201: EventResponseDto;
9024
+ /**
9025
+ * Life event already exists for this (userId, type, date) combination
9026
+ */
9027
+ 409: unknown;
9028
+ };
9029
+ };
9030
+ get: {
9031
+ req: EventControllerFindAllData;
9032
+ res: {
9033
+ /**
9034
+ * Life events retrieved successfully
9035
+ */
9036
+ 200: EventListResponseDto;
9037
+ };
9038
+ };
9039
+ };
9040
+ '/api/v1/{region}/bean/events/{id}': {
9041
+ get: {
9042
+ req: EventControllerFindOneData;
9043
+ res: {
9044
+ /**
9045
+ * Life event retrieved successfully
9046
+ */
9047
+ 200: EventResponseDto;
9048
+ /**
9049
+ * Life event not found
9050
+ */
9051
+ 404: unknown;
9052
+ };
9053
+ };
9054
+ put: {
9055
+ req: EventControllerUpdateData;
9056
+ res: {
9057
+ /**
9058
+ * Life event updated successfully
9059
+ */
9060
+ 200: EventResponseDto;
9061
+ /**
9062
+ * If-Match header is not a valid ISO 8601 date
9063
+ */
9064
+ 400: unknown;
9065
+ /**
9066
+ * Life event not found
9067
+ */
9068
+ 404: unknown;
9069
+ /**
9070
+ * Updated event conflicts with an existing (userId, type, date) combination
9071
+ */
9072
+ 409: unknown;
9073
+ /**
9074
+ * If-Match precondition failed (updatedAt mismatch)
9075
+ */
9076
+ 412: unknown;
9077
+ };
9078
+ };
9079
+ delete: {
9080
+ req: EventControllerDeleteData;
9081
+ res: {
9082
+ /**
9083
+ * Life event deleted successfully
9084
+ */
9085
+ 204: void;
9086
+ /**
9087
+ * Life event not found
9088
+ */
9089
+ 404: unknown;
9090
+ };
9091
+ };
9092
+ };
9093
+ '/api/v1/{region}/bean/events/{id}/slice': {
9094
+ get: {
9095
+ req: EventControllerGetSliceData;
9096
+ res: {
9097
+ /**
9098
+ * Time-series sliced by the life event range
9099
+ */
9100
+ 200: unknown;
9101
+ /**
9102
+ * accountPattern query param is empty
9103
+ */
9104
+ 400: unknown;
9105
+ /**
9106
+ * Life event not found
9107
+ */
9108
+ 404: unknown;
9109
+ };
9110
+ };
9111
+ };
9112
+ '/api/v1/{region}/bean/onboarding': {
9113
+ post: {
9114
+ req: OnboardingControllerBootstrapData;
9115
+ res: {
9116
+ /**
9117
+ * Onboarding bootstrap result.
9118
+ */
9119
+ 201: unknown;
9120
+ /**
9121
+ * Invalid region/account path/duplicate paths.
9122
+ */
9123
+ 422: unknown;
9124
+ };
9125
+ };
9126
+ };
9127
+ '/api/v1/{region}/bean/reconciliations': {
9128
+ post: {
9129
+ req: ReconciliationControllerComputeData;
9130
+ res: {
9131
+ /**
9132
+ * Reconciliation preview
7222
9133
  */
7223
- 200: unknown;
9134
+ 200: ReconciliationComputeResultDto;
7224
9135
  /**
7225
- * Unauthorized
9136
+ * Account not found
7226
9137
  */
7227
- 401: unknown;
9138
+ 404: unknown;
9139
+ };
9140
+ };
9141
+ };
9142
+ '/api/v1/{region}/bean/reconciliations/assert': {
9143
+ post: {
9144
+ req: ReconciliationControllerAssertData;
9145
+ res: {
7228
9146
  /**
7229
- * Forbidden - insufficient permissions
9147
+ * Balance assertion recorded
7230
9148
  */
7231
- 403: unknown;
9149
+ 201: ReconciliationRecordDto;
7232
9150
  /**
7233
- * Property not found
9151
+ * Account not found
7234
9152
  */
7235
9153
  404: unknown;
7236
9154
  };
7237
9155
  };
7238
- put: {
7239
- req: PropertyControllerUpdateData;
9156
+ };
9157
+ '/api/v1/{region}/bean/reconciliations/pad': {
9158
+ post: {
9159
+ req: ReconciliationControllerPadData;
7240
9160
  res: {
7241
9161
  /**
7242
- * Property updated successfully
9162
+ * Pad adjusting entry generated
7243
9163
  */
7244
- 200: unknown;
9164
+ 201: PadResultDto;
7245
9165
  /**
7246
- * Unauthorized
9166
+ * Book already within tolerance — no pad needed
7247
9167
  */
7248
- 401: unknown;
9168
+ 400: unknown;
7249
9169
  /**
7250
- * Forbidden - insufficient permissions
9170
+ * Account not found
7251
9171
  */
7252
- 403: unknown;
9172
+ 404: unknown;
7253
9173
  };
7254
9174
  };
7255
- delete: {
7256
- req: PropertyControllerDeleteData;
9175
+ };
9176
+ '/api/v1/{region}/bean/accounts/{accountId}/reconciliations': {
9177
+ get: {
9178
+ req: ReconciliationControllerHistoryData;
7257
9179
  res: {
7258
9180
  /**
7259
- * Property deleted successfully
7260
- */
7261
- 204: void;
7262
- /**
7263
- * Unauthorized
7264
- */
7265
- 401: unknown;
7266
- /**
7267
- * Forbidden - insufficient permissions
9181
+ * Reconciliation history
7268
9182
  */
7269
- 403: unknown;
9183
+ 200: Array<ReconciliationRecordDto>;
7270
9184
  /**
7271
- * Property not found
9185
+ * Account not found
7272
9186
  */
7273
9187
  404: unknown;
7274
9188
  };
@@ -7424,143 +9338,145 @@ export type $OpenApiTs = {
7424
9338
  };
7425
9339
  };
7426
9340
  };
7427
- '/api/v1/bean/platforms': {
7428
- get: {
9341
+ '/api/v1/{region}/bean/import/provider/{providerName}/sync': {
9342
+ post: {
9343
+ req: ProviderSyncControllerSyncData;
7429
9344
  res: {
7430
9345
  /**
7431
- * List of platforms with binding and account counts
9346
+ * Sync completed successfully
7432
9347
  */
7433
- 200: unknown;
7434
- };
7435
- };
7436
- post: {
7437
- req: PlatformControllerCreateData;
7438
- res: {
9348
+ 200: ProviderSyncResponseDto;
7439
9349
  /**
7440
- * Platform created successfully
9350
+ * Invalid request data
7441
9351
  */
7442
- 201: unknown;
9352
+ 400: unknown;
7443
9353
  /**
7444
- * Platform already exists
9354
+ * Missing or invalid authentication
7445
9355
  */
7446
- 409: unknown;
9356
+ 401: unknown;
9357
+ /**
9358
+ * Provider not supported
9359
+ */
9360
+ 404: unknown;
7447
9361
  };
7448
9362
  };
7449
9363
  };
7450
- '/api/v1/bean/platforms/list': {
9364
+ '/api/v1/{region}/bean/import/provider/supported': {
7451
9365
  get: {
9366
+ req: ProviderSyncControllerGetSupportedProvidersData;
7452
9367
  res: {
7453
9368
  /**
7454
- * List of platforms with user binding status
9369
+ * List of supported providers
7455
9370
  */
7456
- 200: unknown;
9371
+ 200: SupportedProvidersResponseDto;
9372
+ /**
9373
+ * Missing or invalid authentication
9374
+ */
9375
+ 401: unknown;
7457
9376
  };
7458
9377
  };
7459
9378
  };
7460
- '/api/v1/bean/platforms/match': {
9379
+ '/api/v1/{region}/bean/import/provider/{providerName}/supported': {
7461
9380
  get: {
7462
- req: PlatformControllerMatchPlatformsData;
9381
+ req: ProviderSyncControllerIsProviderSupportedData;
7463
9382
  res: {
7464
9383
  /**
7465
- * List of matching platforms with suggested segment names
9384
+ * Provider support status
7466
9385
  */
7467
9386
  200: unknown;
9387
+ /**
9388
+ * Missing or invalid authentication
9389
+ */
9390
+ 401: unknown;
7468
9391
  };
7469
9392
  };
7470
9393
  };
7471
- '/api/v1/bean/platforms/{id}': {
7472
- put: {
7473
- req: PlatformControllerUpdateData;
9394
+ '/api/v1/{region}/bean/external-account-links': {
9395
+ post: {
9396
+ req: ExternalAccountLinkControllerCreateData;
7474
9397
  res: {
7475
9398
  /**
7476
- * Platform updated successfully
9399
+ * Link created.
7477
9400
  */
7478
- 200: unknown;
9401
+ 201: ExternalAccountLinkResponseDto;
7479
9402
  /**
7480
- * Platform not found
9403
+ * beanAccountId not owned, or an active link already exists.
7481
9404
  */
7482
- 404: unknown;
9405
+ 422: unknown;
7483
9406
  };
7484
9407
  };
7485
- delete: {
7486
- req: PlatformControllerDeleteData;
9408
+ get: {
9409
+ req: ExternalAccountLinkControllerFindAllData;
7487
9410
  res: {
7488
9411
  /**
7489
- * Platform deleted successfully
7490
- */
7491
- 204: void;
7492
- /**
7493
- * Platform not found
9412
+ * Links retrieved.
7494
9413
  */
7495
- 404: unknown;
9414
+ 200: ExternalAccountLinkListResponseDto;
7496
9415
  };
7497
9416
  };
7498
9417
  };
7499
- '/api/v1/{region}/bean/import/provider/{providerName}/sync': {
7500
- post: {
7501
- req: ProviderSyncControllerSyncData;
9418
+ '/api/v1/{region}/bean/external-account-links/{id}': {
9419
+ get: {
9420
+ req: ExternalAccountLinkControllerFindOneData;
7502
9421
  res: {
7503
9422
  /**
7504
- * Sync completed successfully
7505
- */
7506
- 200: ProviderSyncResponseDto;
7507
- /**
7508
- * Invalid request data
9423
+ * Link retrieved.
7509
9424
  */
7510
- 400: unknown;
9425
+ 200: ExternalAccountLinkResponseDto;
7511
9426
  /**
7512
- * Missing or invalid authentication
9427
+ * Link not found or not owned by the user.
7513
9428
  */
7514
- 401: unknown;
9429
+ 422: unknown;
9430
+ };
9431
+ };
9432
+ delete: {
9433
+ req: ExternalAccountLinkControllerRemoveData;
9434
+ res: {
7515
9435
  /**
7516
- * Provider not supported
9436
+ * Link soft-deleted; historical transactions are unaffected.
7517
9437
  */
7518
- 404: unknown;
9438
+ 204: void;
7519
9439
  };
7520
9440
  };
7521
9441
  };
7522
- '/api/v1/{region}/bean/import/provider/supported': {
7523
- get: {
7524
- req: ProviderSyncControllerGetSupportedProvidersData;
9442
+ '/api/v1/{region}/bean/import/parser-telemetry': {
9443
+ post: {
9444
+ req: TelemetryControllerReportTelemetryData;
7525
9445
  res: {
7526
9446
  /**
7527
- * List of supported providers
9447
+ * Telemetry report received
7528
9448
  */
7529
- 200: SupportedProvidersResponseDto;
9449
+ 200: unknown;
7530
9450
  /**
7531
- * Missing or invalid authentication
9451
+ * Unauthorized
7532
9452
  */
7533
9453
  401: unknown;
7534
9454
  };
7535
9455
  };
7536
9456
  };
7537
- '/api/v1/{region}/bean/import/provider/{providerName}/supported': {
7538
- get: {
7539
- req: ProviderSyncControllerIsProviderSupportedData;
9457
+ '/api/v1/{region}/bean/import/parser-coverage-miss': {
9458
+ post: {
9459
+ req: TelemetryControllerReportCoverageMissData;
7540
9460
  res: {
7541
9461
  /**
7542
- * Provider support status
9462
+ * Coverage miss report received
7543
9463
  */
7544
9464
  200: unknown;
7545
9465
  /**
7546
- * Missing or invalid authentication
9466
+ * Unauthorized
7547
9467
  */
7548
9468
  401: unknown;
7549
9469
  };
7550
9470
  };
7551
9471
  };
7552
- '/api/v1/{region}/bean/import/parser-telemetry': {
7553
- post: {
7554
- req: TelemetryControllerReportTelemetryData;
9472
+ '/api/v1/{region}/bean/import/parser-coverage-metrics': {
9473
+ get: {
9474
+ req: TelemetryControllerGetCoverageMetricsData;
7555
9475
  res: {
7556
9476
  /**
7557
- * Telemetry report received
9477
+ * Coverage metrics
7558
9478
  */
7559
9479
  200: unknown;
7560
- /**
7561
- * Unauthorized
7562
- */
7563
- 401: unknown;
7564
9480
  };
7565
9481
  };
7566
9482
  };
@@ -7611,6 +9527,78 @@ export type $OpenApiTs = {
7611
9527
  };
7612
9528
  };
7613
9529
  };
9530
+ '/api/v1/bean/platforms': {
9531
+ get: {
9532
+ res: {
9533
+ /**
9534
+ * List of platforms with binding and account counts
9535
+ */
9536
+ 200: unknown;
9537
+ };
9538
+ };
9539
+ post: {
9540
+ req: PlatformControllerCreateData;
9541
+ res: {
9542
+ /**
9543
+ * Platform created successfully
9544
+ */
9545
+ 201: unknown;
9546
+ /**
9547
+ * Platform already exists
9548
+ */
9549
+ 409: unknown;
9550
+ };
9551
+ };
9552
+ };
9553
+ '/api/v1/bean/platforms/list': {
9554
+ get: {
9555
+ res: {
9556
+ /**
9557
+ * List of platforms with user binding status
9558
+ */
9559
+ 200: Array<PlatformListItemDto>;
9560
+ };
9561
+ };
9562
+ };
9563
+ '/api/v1/bean/platforms/match': {
9564
+ get: {
9565
+ req: PlatformControllerMatchPlatformsData;
9566
+ res: {
9567
+ /**
9568
+ * Matching platforms with overall match type and truncation flag
9569
+ */
9570
+ 200: PlatformMatchResponseDto;
9571
+ };
9572
+ };
9573
+ };
9574
+ '/api/v1/bean/platforms/{id}': {
9575
+ put: {
9576
+ req: PlatformControllerUpdateData;
9577
+ res: {
9578
+ /**
9579
+ * Platform updated successfully
9580
+ */
9581
+ 200: unknown;
9582
+ /**
9583
+ * Platform not found
9584
+ */
9585
+ 404: unknown;
9586
+ };
9587
+ };
9588
+ delete: {
9589
+ req: PlatformControllerDeleteData;
9590
+ res: {
9591
+ /**
9592
+ * Platform deleted successfully
9593
+ */
9594
+ 204: void;
9595
+ /**
9596
+ * Platform not found
9597
+ */
9598
+ 404: unknown;
9599
+ };
9600
+ };
9601
+ };
7614
9602
  '/api/v1/{region}/dashboard/net-worth': {
7615
9603
  get: {
7616
9604
  req: DashboardControllerGetNetWorthData;
@@ -7633,7 +9621,10 @@ export type $OpenApiTs = {
7633
9621
  /**
7634
9622
  * Accounts retrieved successfully. Response type depends on groupBy parameter.
7635
9623
  */
7636
- 200: AccountsResponseDto | AssetClassAccountsResponseDto;
9624
+ 200:
9625
+ | AccountsResponseDto
9626
+ | AssetClassAccountsResponseDto
9627
+ | HoldingAssetClassCrossAccountResponseDto;
7637
9628
  /**
7638
9629
  * User not authenticated
7639
9630
  */
@@ -7660,31 +9651,16 @@ export type $OpenApiTs = {
7660
9651
  };
7661
9652
  };
7662
9653
  };
7663
- '/api/v1/{region}/reporting/portfolio/trends': {
9654
+ '/api/v1/{region}/dashboard/expenses': {
7664
9655
  get: {
7665
- req: ReportingControllerGetPortfolioTrendsData;
7666
- res: {
7667
- /**
7668
- * Trends retrieved successfully
7669
- */
7670
- 200: PortfolioTrendsResponseDto;
7671
- /**
7672
- * User not authenticated
7673
- */
7674
- 401: unknown;
7675
- };
7676
- };
7677
- };
7678
- '/api/v1/{region}/reporting/snapshots/generate': {
7679
- post: {
7680
- req: ReportingControllerGenerateSnapshotData;
9656
+ req: DashboardControllerGetExpensesData;
7681
9657
  res: {
7682
9658
  /**
7683
- * Snapshot generated successfully
9659
+ * Expenses retrieved successfully
7684
9660
  */
7685
- 200: GenerateSnapshotResponse;
9661
+ 200: ExpensesByCategoryResponseDto;
7686
9662
  /**
7687
- * Invalid date format
9663
+ * Invalid groupBy or period
7688
9664
  */
7689
9665
  400: unknown;
7690
9666
  /**
@@ -7694,26 +9670,22 @@ export type $OpenApiTs = {
7694
9670
  };
7695
9671
  };
7696
9672
  };
7697
- '/api/v1/{region}/reporting/snapshots/backfill': {
7698
- post: {
7699
- req: ReportingControllerBackfillSnapshotsData;
9673
+ '/api/v1/{region}/investment/holdings/pnl': {
9674
+ get: {
9675
+ req: HoldingPnlControllerGetHoldingPnlData;
7700
9676
  res: {
7701
9677
  /**
7702
- * Backfill completed successfully
9678
+ * Holding P&L retrieved successfully
7703
9679
  */
7704
- 200: BackfillSnapshotsResponse;
9680
+ 200: HoldingPnlResponseDto;
7705
9681
  /**
7706
- * Invalid date format or range
9682
+ * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
7707
9683
  */
7708
9684
  400: unknown;
7709
9685
  /**
7710
9686
  * User not authenticated
7711
9687
  */
7712
9688
  401: unknown;
7713
- /**
7714
- * Backfill already in progress for this user
7715
- */
7716
- 409: unknown;
7717
9689
  };
7718
9690
  };
7719
9691
  };
@@ -7738,7 +9710,7 @@ export type $OpenApiTs = {
7738
9710
  /**
7739
9711
  * Login successful
7740
9712
  */
7741
- 200: unknown;
9713
+ 200: AnonymousLoginResponseDto;
7742
9714
  /**
7743
9715
  * Invalid access token
7744
9716
  */