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

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 = {
@@ -643,6 +715,10 @@ export type PostingDetailDto = {
643
715
  * Cost date
644
716
  */
645
717
  costDate?: string;
718
+ /**
719
+ * Booking-resolved cost (mirrors engine Cost). Undefined when the posting has no cost basis.
720
+ */
721
+ cost?: CostDetailDto;
646
722
  /**
647
723
  * Price amount
648
724
  */
@@ -766,6 +842,51 @@ export type flag2 =
766
842
  */
767
843
  export type status2 = 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
768
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
+
769
890
  export type TransactionListResponseDto = {
770
891
  /**
771
892
  * List of transactions
@@ -783,6 +904,10 @@ export type TransactionListResponseDto = {
783
904
  * Number of items skipped
784
905
  */
785
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;
786
911
  };
787
912
 
788
913
  export type TagSuggestionDto = {
@@ -1242,17 +1367,17 @@ export type ResolveResultDto = {
1242
1367
  [key: string]: string;
1243
1368
  };
1244
1369
  /**
1245
- * Resolution ID for undo
1370
+ * Resolution ID for undo. Absent when the resolver rejected the decision (review stayed PENDING).
1246
1371
  */
1247
- resolutionId: string;
1372
+ resolutionId?: string;
1248
1373
  /**
1249
1374
  * Whether this decision can be undone
1250
1375
  */
1251
- canUndo: boolean;
1376
+ canUndo?: boolean;
1252
1377
  /**
1253
1378
  * Deadline for undo (24h from resolution)
1254
1379
  */
1255
- undoDeadline: string;
1380
+ undoDeadline?: string;
1256
1381
  /**
1257
1382
  * Rule ID if learning was triggered (ACCEPT_AND_LEARN actions). Use this to deep-link to the rule management page.
1258
1383
  */
@@ -1835,6 +1960,108 @@ export type UpdateCommodityDto = {
1835
1960
  };
1836
1961
  };
1837
1962
 
1963
+ export type CreateBeanPriceDto = {
1964
+ /**
1965
+ * Currency being priced (e.g., USD, AAPL, BTC)
1966
+ */
1967
+ currency: string;
1968
+ /**
1969
+ * Quote currency (pricing currency, e.g., CNY, EUR)
1970
+ */
1971
+ quoteCurrency: string;
1972
+ /**
1973
+ * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
1974
+ */
1975
+ amount: number;
1976
+ /**
1977
+ * Price date (ISO 8601 format)
1978
+ */
1979
+ date: string;
1980
+ /**
1981
+ * Metadata (validated by Zod schema, max field lengths enforced)
1982
+ */
1983
+ metadata?: {
1984
+ [key: string]: unknown;
1985
+ };
1986
+ };
1987
+
1988
+ export type PriceResponseDto = {
1989
+ /**
1990
+ * Unique identifier
1991
+ */
1992
+ id: string;
1993
+ /**
1994
+ * User ID (owner of the price)
1995
+ */
1996
+ userId: string;
1997
+ /**
1998
+ * Currency being priced (e.g., USD, AAPL, BTC)
1999
+ */
2000
+ currency: string;
2001
+ /**
2002
+ * Quote currency (pricing currency, e.g., USD, CNY)
2003
+ */
2004
+ quoteCurrency: string;
2005
+ /**
2006
+ * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
2007
+ */
2008
+ amount: number;
2009
+ /**
2010
+ * Price date (ISO 8601 format). Represents the date this price was valid.
2011
+ */
2012
+ date: string;
2013
+ /**
2014
+ * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
2015
+ */
2016
+ meta: {
2017
+ [key: string]: unknown;
2018
+ };
2019
+ /**
2020
+ * Creation timestamp
2021
+ */
2022
+ createdAt: string;
2023
+ /**
2024
+ * Last update timestamp
2025
+ */
2026
+ updatedAt: string;
2027
+ };
2028
+
2029
+ export type PriceListResponseDto = {
2030
+ /**
2031
+ * List of prices
2032
+ */
2033
+ items: Array<PriceResponseDto>;
2034
+ /**
2035
+ * Total number of prices
2036
+ */
2037
+ total: number;
2038
+ };
2039
+
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
+
1838
2065
  export type CreateRecurringRuleDto = {
1839
2066
  /**
1840
2067
  * Rule name (unique per user)
@@ -2947,29 +3174,273 @@ export type UpdatePropertyDto = {
2947
3174
  value: string;
2948
3175
  };
2949
3176
 
2950
- export type FileImportDto = {
3177
+ export type CreateBeanEventDto = {
2951
3178
  /**
2952
- * Bill file to import (CSV, PDF, OFX, etc.)
3179
+ * Life event date (ISO 8601)
2953
3180
  */
2954
- file: Blob | File;
2955
- };
2956
-
2957
- export type ImportErrorDto = {
3181
+ date: string;
2958
3182
  /**
2959
- * Index of failed transaction in the file
3183
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
2960
3184
  */
2961
- index: number;
3185
+ type: string;
2962
3186
  /**
2963
- * Error message
3187
+ * Life event description. Empty string is a VALID value (distinct from absence).
2964
3188
  */
2965
- error: string;
3189
+ description: string;
3190
+ /**
3191
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3192
+ */
3193
+ meta?: {
3194
+ [key: string]: unknown;
3195
+ };
2966
3196
  };
2967
3197
 
2968
- export type ReviewItemPreviewDto = {
3198
+ export type EventResponseDto = {
2969
3199
  /**
2970
- * Index in the import batch (for tracking)
3200
+ * Unique identifier
2971
3201
  */
2972
- index: number;
3202
+ id: string;
3203
+ /**
3204
+ * User ID (owner of the life event)
3205
+ */
3206
+ userId: string;
3207
+ /**
3208
+ * Life event date (ISO 8601 format)
3209
+ */
3210
+ date: string;
3211
+ /**
3212
+ * Life event type (user-defined, e.g., "employer", "location")
3213
+ */
3214
+ type: string;
3215
+ /**
3216
+ * Life event description. May be an empty string (a valid value distinct from absence).
3217
+ */
3218
+ description: string;
3219
+ /**
3220
+ * Product-side metadata (free-form JSON)
3221
+ */
3222
+ meta: {
3223
+ [key: string]: unknown;
3224
+ };
3225
+ /**
3226
+ * Creation timestamp
3227
+ */
3228
+ createdAt: string;
3229
+ /**
3230
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3231
+ */
3232
+ updatedAt: string;
3233
+ };
3234
+
3235
+ export type EventListResponseDto = {
3236
+ /**
3237
+ * List of life events
3238
+ */
3239
+ items: Array<EventResponseDto>;
3240
+ /**
3241
+ * Total number of life events matching the query
3242
+ */
3243
+ total: number;
3244
+ };
3245
+
3246
+ export type UpdateBeanEventDto = {
3247
+ /**
3248
+ * Life event date (ISO 8601)
3249
+ */
3250
+ date?: string;
3251
+ /**
3252
+ * Life event type (user-defined)
3253
+ */
3254
+ type?: string;
3255
+ /**
3256
+ * Life event description. Empty string is a VALID value (distinct from absence).
3257
+ */
3258
+ description?: string;
3259
+ /**
3260
+ * Product-side metadata (free-form JSON)
3261
+ */
3262
+ meta?: {
3263
+ [key: string]: unknown;
3264
+ };
3265
+ };
3266
+
3267
+ export type OnboardingAccountDto = {
3268
+ /**
3269
+ * Account path (Assets/Liabilities only; format validated by the account service)
3270
+ */
3271
+ path: string;
3272
+ /**
3273
+ * ISO 4217 currency code (3 letters)
3274
+ */
3275
+ currency: string;
3276
+ /**
3277
+ * Opening balance as a non-negative Decimal string (e.g. "1000.00")
3278
+ */
3279
+ openingBalance?: string;
3280
+ /**
3281
+ * Platform ID to bind the account to (references Platform.id); omit for unbound
3282
+ */
3283
+ platformId?: string;
3284
+ };
3285
+
3286
+ export type OnboardingDto = {
3287
+ /**
3288
+ * Asset/Liability accounts to register with opening balances
3289
+ */
3290
+ accounts?: Array<OnboardingAccountDto>;
3291
+ /**
3292
+ * Skip asset registration; only bootstrap the core account set
3293
+ */
3294
+ skipAssetRegistration?: boolean;
3295
+ };
3296
+
3297
+ export type ActualBalanceDto = {
3298
+ /**
3299
+ * Actual balance amount as a decimal string (preserves precision for tolerance inference).
3300
+ */
3301
+ amount: string;
3302
+ /**
3303
+ * Currency code (ISO 4217 or commodity ticker).
3304
+ */
3305
+ ccy: string;
3306
+ };
3307
+
3308
+ export type ComputeReconciliationDto = {
3309
+ /**
3310
+ * BeanAccount id to reconcile.
3311
+ */
3312
+ accountId: string;
3313
+ /**
3314
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3315
+ */
3316
+ asOfDate: string;
3317
+ /**
3318
+ * Actual balance from the external statement.
3319
+ */
3320
+ actualBalance: ActualBalanceDto;
3321
+ };
3322
+
3323
+ export type ReconciliationComputeResultDto = {
3324
+ accountId: string;
3325
+ asOfDate: string;
3326
+ /**
3327
+ * System-computed book balance (decimal string).
3328
+ */
3329
+ bookBalance: string;
3330
+ /**
3331
+ * User-entered actual balance (decimal string).
3332
+ */
3333
+ actualBalance: string;
3334
+ currency: string;
3335
+ /**
3336
+ * Diff = book − actual (decimal string).
3337
+ */
3338
+ diff: string;
3339
+ /**
3340
+ * Applied tolerance (decimal string).
3341
+ */
3342
+ tolerance: string;
3343
+ /**
3344
+ * true when |diff| ≤ tolerance.
3345
+ */
3346
+ withinTolerance: boolean;
3347
+ /**
3348
+ * Suggested next action: assert when within tolerance, pad otherwise.
3349
+ */
3350
+ suggestedAction: 'assert' | 'pad';
3351
+ };
3352
+
3353
+ /**
3354
+ * Suggested next action: assert when within tolerance, pad otherwise.
3355
+ */
3356
+ export type suggestedAction = 'assert' | 'pad';
3357
+
3358
+ export type AssertReconciliationDto = {
3359
+ /**
3360
+ * BeanAccount id to reconcile.
3361
+ */
3362
+ accountId: string;
3363
+ /**
3364
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3365
+ */
3366
+ asOfDate: string;
3367
+ /**
3368
+ * Actual balance from the external statement.
3369
+ */
3370
+ actualBalance: ActualBalanceDto;
3371
+ /**
3372
+ * Optional explicit tolerance override. Omit to infer from amount precision (Beancount default).
3373
+ */
3374
+ tolerance?: string;
3375
+ };
3376
+
3377
+ export type ReconciliationRecordDto = {
3378
+ id: string;
3379
+ accountId: string;
3380
+ date: string;
3381
+ /**
3382
+ * Asserted (actual) amount.
3383
+ */
3384
+ amount: string;
3385
+ currency: string;
3386
+ tolerance?: string;
3387
+ /**
3388
+ * book − actual.
3389
+ */
3390
+ diffAmount?: string;
3391
+ diffCurrency?: string;
3392
+ createdAt: string;
3393
+ };
3394
+
3395
+ export type PadReconciliationDto = {
3396
+ /**
3397
+ * BeanAccount id to reconcile.
3398
+ */
3399
+ accountId: string;
3400
+ /**
3401
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3402
+ */
3403
+ asOfDate: string;
3404
+ /**
3405
+ * Actual balance from the external statement.
3406
+ */
3407
+ actualBalance: ActualBalanceDto;
3408
+ /**
3409
+ * Pad source account. Defaults to Equity:Opening-Balances (official Beancount convention).
3410
+ */
3411
+ sourceAccount?: string;
3412
+ };
3413
+
3414
+ export type PadResultDto = {
3415
+ /**
3416
+ * Created pad adjusting transaction id.
3417
+ */
3418
+ transactionId: string;
3419
+ };
3420
+
3421
+ export type FileImportDto = {
3422
+ /**
3423
+ * Bill file to import (CSV, PDF, OFX, etc.)
3424
+ */
3425
+ file: Blob | File;
3426
+ };
3427
+
3428
+ export type ImportErrorDto = {
3429
+ /**
3430
+ * Index of failed transaction in the file
3431
+ */
3432
+ index: number;
3433
+ /**
3434
+ * Error message
3435
+ */
3436
+ error: string;
3437
+ };
3438
+
3439
+ export type ReviewItemPreviewDto = {
3440
+ /**
3441
+ * Index in the import batch (for tracking)
3442
+ */
3443
+ index: number;
2973
3444
  /**
2974
3445
  * Transaction date (ISO format)
2975
3446
  */
@@ -3245,168 +3716,139 @@ export type UpdateImporterConfigDto = {
3245
3716
  data?: UpdateConfigDataDto;
3246
3717
  };
3247
3718
 
3248
- export type CreatePlatformDto = {
3249
- /**
3250
- * Platform name
3251
- */
3252
- name: string;
3719
+ export type ProviderSyncConfigDto = {
3253
3720
  /**
3254
- * Platform canonical identifier (lowercase, kebab-case)
3721
+ * Source account for the first posting
3255
3722
  */
3256
- canonical: string;
3723
+ sourceAccount: string;
3257
3724
  /**
3258
- * Platform aliases (multi-language names for lookup)
3725
+ * Default currency for transactions
3259
3726
  */
3260
- aliases: Array<string>;
3727
+ defaultCurrency: string;
3261
3728
  /**
3262
- * Platform URL
3729
+ * Default expense account for the second posting
3263
3730
  */
3264
- url: string;
3731
+ defaultExpenseAccount: string;
3265
3732
  /**
3266
- * Platform type
3733
+ * Default income account for the second posting
3267
3734
  */
3268
- type:
3269
- | 'BANK'
3270
- | 'BROKERAGE'
3271
- | 'CRYPTO_EXCHANGE'
3272
- | 'PAYMENT'
3273
- | 'INVESTMENT'
3274
- | 'INSURANCE'
3275
- | 'OTHER';
3735
+ defaultIncomeAccount: string;
3276
3736
  /**
3277
- * Platform logo URL
3737
+ * Filter pending transactions
3278
3738
  */
3279
- logoUrl?: string;
3739
+ filterPending?: boolean;
3280
3740
  /**
3281
- * Whether the platform is active
3741
+ * External account ID for per-batch providers (e.g. GoCardless). Overrides sourceAccount when an ExternalAccountLink mapping exists.
3282
3742
  */
3283
- isActive?: boolean;
3743
+ externalAccountId?: string;
3284
3744
  };
3285
3745
 
3286
- /**
3287
- * Platform type
3288
- */
3289
- export type type3 =
3290
- | 'BANK'
3291
- | 'BROKERAGE'
3292
- | 'CRYPTO_EXCHANGE'
3293
- | 'PAYMENT'
3294
- | 'INVESTMENT'
3295
- | 'INSURANCE'
3296
- | 'OTHER';
3297
-
3298
- export type UpdatePlatformDto = {
3746
+ export type ProviderSyncDto = {
3299
3747
  /**
3300
- * Platform name
3748
+ * Provider name (already in URL path, optional here for reference)
3301
3749
  */
3302
- name?: string;
3750
+ provider?: string;
3303
3751
  /**
3304
- * Platform canonical identifier (lowercase, kebab-case)
3752
+ * Unique sync identifier for idempotency
3305
3753
  */
3306
- canonical?: string;
3754
+ syncId?: string;
3307
3755
  /**
3308
- * Platform aliases (multi-language names for lookup)
3756
+ * Provider sync configuration
3309
3757
  */
3310
- aliases?: Array<string>;
3758
+ config: ProviderSyncConfigDto;
3311
3759
  /**
3312
- * Platform URL
3760
+ * Raw transactions from provider
3313
3761
  */
3314
- url?: string;
3762
+ transactions: unknown[];
3763
+ };
3764
+
3765
+ export type ProviderSyncResponseDto = {
3315
3766
  /**
3316
- * Platform type
3767
+ * Number of transactions successfully imported
3317
3768
  */
3318
- type?:
3319
- | 'BANK'
3320
- | 'BROKERAGE'
3321
- | 'CRYPTO_EXCHANGE'
3322
- | 'PAYMENT'
3323
- | 'INVESTMENT'
3324
- | 'INSURANCE'
3325
- | 'OTHER';
3769
+ imported: number;
3326
3770
  /**
3327
- * Platform logo URL
3771
+ * Number of transactions skipped (duplicates)
3328
3772
  */
3329
- logoUrl?: string;
3773
+ skipped: number;
3330
3774
  /**
3331
- * Whether the platform is active
3775
+ * Number of transactions pending review
3332
3776
  */
3333
- isActive?: boolean;
3334
- };
3335
-
3336
- export type ProviderSyncConfigDto = {
3337
- /**
3338
- * Source account for the first posting
3339
- */
3340
- sourceAccount: string;
3341
- /**
3342
- * Default currency for transactions
3343
- */
3344
- defaultCurrency: string;
3777
+ pendingReview: number;
3345
3778
  /**
3346
- * Default expense account for the second posting
3779
+ * Number of transactions that failed to import
3347
3780
  */
3348
- defaultExpenseAccount: string;
3781
+ failed: number;
3349
3782
  /**
3350
- * Default income account for the second posting
3783
+ * IDs of successfully imported transactions
3351
3784
  */
3352
- defaultIncomeAccount: string;
3785
+ importedTransactionIds?: Array<string>;
3353
3786
  /**
3354
- * Filter pending transactions
3787
+ * IDs of review items created for branched transactions
3355
3788
  */
3356
- filterPending?: boolean;
3789
+ reviewItemIds?: Array<string>;
3357
3790
  };
3358
3791
 
3359
- export type ProviderSyncDto = {
3360
- /**
3361
- * Provider name (already in URL path, optional here for reference)
3362
- */
3363
- provider?: string;
3364
- /**
3365
- * Unique sync identifier for idempotency
3366
- */
3367
- syncId?: string;
3368
- /**
3369
- * Provider sync configuration
3370
- */
3371
- config: ProviderSyncConfigDto;
3792
+ export type SupportedProvidersResponseDto = {
3372
3793
  /**
3373
- * Raw transactions from provider
3794
+ * List of supported provider names
3374
3795
  */
3375
- transactions: unknown[];
3796
+ providers: Array<string>;
3376
3797
  };
3377
3798
 
3378
- export type ProviderSyncResponseDto = {
3379
- /**
3380
- * Number of transactions successfully imported
3381
- */
3382
- imported: number;
3383
- /**
3384
- * Number of transactions skipped (duplicates)
3385
- */
3386
- skipped: number;
3387
- /**
3388
- * Number of transactions pending review
3389
- */
3390
- pendingReview: number;
3799
+ export type CreateExternalAccountLinkDto = {
3391
3800
  /**
3392
- * Number of transactions that failed to import
3801
+ * Open Banking provider (whitelist)
3393
3802
  */
3394
- failed: number;
3803
+ provider:
3804
+ | 'plaid'
3805
+ | 'teller'
3806
+ | 'truelayer'
3807
+ | 'gocardless'
3808
+ | 'simplefin'
3809
+ | 'yodlee'
3810
+ | 'beancount-direct'
3811
+ | 'parsed-bill';
3395
3812
  /**
3396
- * IDs of successfully imported transactions
3813
+ * External account ID from the provider
3397
3814
  */
3398
- importedTransactionIds?: Array<string>;
3815
+ externalAccountId: string;
3399
3816
  /**
3400
- * IDs of review items created for branched transactions
3817
+ * Target BeanAccount ID (must belong to the JWT user)
3401
3818
  */
3402
- reviewItemIds?: Array<string>;
3819
+ beanAccountId: string;
3403
3820
  };
3404
3821
 
3405
- export type SupportedProvidersResponseDto = {
3822
+ /**
3823
+ * Open Banking provider (whitelist)
3824
+ */
3825
+ export type provider =
3826
+ | 'plaid'
3827
+ | 'teller'
3828
+ | 'truelayer'
3829
+ | 'gocardless'
3830
+ | 'simplefin'
3831
+ | 'yodlee'
3832
+ | 'beancount-direct'
3833
+ | 'parsed-bill';
3834
+
3835
+ export type ExternalAccountLinkResponseDto = {
3836
+ id: string;
3837
+ provider: string;
3838
+ externalAccountId: string;
3839
+ beanAccountId: string;
3840
+ isActive: boolean;
3841
+ createdAt: string;
3842
+ updatedAt: string;
3843
+ };
3844
+
3845
+ export type ExternalAccountLinkListResponseDto = {
3846
+ items: Array<ExternalAccountLinkResponseDto>;
3847
+ total: number;
3406
3848
  /**
3407
- * List of supported provider names
3849
+ * Filter by provider (query param)
3408
3850
  */
3409
- providers: Array<string>;
3851
+ provider?: string;
3410
3852
  };
3411
3853
 
3412
3854
  export type ParserTelemetryReportDto = unknown;
@@ -3988,15 +4430,92 @@ export type liabilitySubType = 'borrow' | 'repay';
3988
4430
  */
3989
4431
  export type equitySubType = 'opening' | 'adjustment';
3990
4432
 
3991
- export type BalanceByCurrencyDto = {
4433
+ export type CreatePlatformDto = {
3992
4434
  /**
3993
- * ISO 4217 currency code
4435
+ * Platform name
3994
4436
  */
3995
- currency: string;
4437
+ name: string;
3996
4438
  /**
3997
- * Balance amount
4439
+ * Platform canonical identifier (lowercase, kebab-case)
3998
4440
  */
3999
- balance: string;
4441
+ canonical: string;
4442
+ /**
4443
+ * Platform aliases (multi-language names for lookup)
4444
+ */
4445
+ aliases: Array<string>;
4446
+ /**
4447
+ * Platform URL
4448
+ */
4449
+ url: string;
4450
+ /**
4451
+ * Platform type
4452
+ */
4453
+ type:
4454
+ | 'BANK'
4455
+ | 'BROKERAGE'
4456
+ | 'CRYPTO_EXCHANGE'
4457
+ | 'PAYMENT'
4458
+ | 'INVESTMENT'
4459
+ | 'INSURANCE'
4460
+ | 'OTHER';
4461
+ /**
4462
+ * Platform logo URL
4463
+ */
4464
+ logoUrl?: string;
4465
+ /**
4466
+ * Whether the platform is active
4467
+ */
4468
+ isActive?: boolean;
4469
+ };
4470
+
4471
+ /**
4472
+ * Platform type
4473
+ */
4474
+ export type type3 =
4475
+ | 'BANK'
4476
+ | 'BROKERAGE'
4477
+ | 'CRYPTO_EXCHANGE'
4478
+ | 'PAYMENT'
4479
+ | 'INVESTMENT'
4480
+ | 'INSURANCE'
4481
+ | 'OTHER';
4482
+
4483
+ export type UpdatePlatformDto = {
4484
+ /**
4485
+ * Platform name
4486
+ */
4487
+ name?: string;
4488
+ /**
4489
+ * Platform canonical identifier (lowercase, kebab-case)
4490
+ */
4491
+ canonical?: string;
4492
+ /**
4493
+ * Platform aliases (multi-language names for lookup)
4494
+ */
4495
+ aliases?: Array<string>;
4496
+ /**
4497
+ * Platform URL
4498
+ */
4499
+ url?: string;
4500
+ /**
4501
+ * Platform type
4502
+ */
4503
+ type?:
4504
+ | 'BANK'
4505
+ | 'BROKERAGE'
4506
+ | 'CRYPTO_EXCHANGE'
4507
+ | 'PAYMENT'
4508
+ | 'INVESTMENT'
4509
+ | 'INSURANCE'
4510
+ | 'OTHER';
4511
+ /**
4512
+ * Platform logo URL
4513
+ */
4514
+ logoUrl?: string;
4515
+ /**
4516
+ * Whether the platform is active
4517
+ */
4518
+ isActive?: boolean;
4000
4519
  };
4001
4520
 
4002
4521
  export type NetWorthByCurrencyDto = {
@@ -4039,21 +4558,6 @@ export type ConvertedNetWorthDto = {
4039
4558
  };
4040
4559
  };
4041
4560
 
4042
- export type ExchangeRateWarningDto = {
4043
- /**
4044
- * Warning type
4045
- */
4046
- type: string;
4047
- /**
4048
- * Currency without exchange rate
4049
- */
4050
- currency: string;
4051
- /**
4052
- * Total amount affected
4053
- */
4054
- totalAmount: string;
4055
- };
4056
-
4057
4561
  export type NetWorthResponseDto = {
4058
4562
  /**
4059
4563
  * Total net worth (assets - liabilities, converted to base currency)
@@ -4118,6 +4622,10 @@ export type AccountItemDto = {
4118
4622
  * Currency code
4119
4623
  */
4120
4624
  currency: string;
4625
+ /**
4626
+ * FX-converted balance in base currency; omitted when not convertible
4627
+ */
4628
+ convertedBalance?: string;
4121
4629
  };
4122
4630
 
4123
4631
  export type PlatformGroupDto = {
@@ -4134,9 +4642,40 @@ export type PlatformGroupDto = {
4134
4642
  */
4135
4643
  accounts: Array<AccountItemDto>;
4136
4644
  /**
4137
- * Total balance across all accounts in platform
4645
+ * FX-converted total balance in base currency
4138
4646
  */
4139
4647
  totalBalance: string;
4648
+ /**
4649
+ * Raw (unconverted) balances grouped by currency
4650
+ */
4651
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4652
+ /**
4653
+ * Converted balance in base currency (omitted when no currency is convertible)
4654
+ */
4655
+ convertedBalance?: string;
4656
+ /**
4657
+ * Share of the grand converted total (0-100); 0 when grand total is 0
4658
+ */
4659
+ sharePct: number;
4660
+ };
4661
+
4662
+ export type AccountExchangeRateWarningDto = {
4663
+ /**
4664
+ * Warning type
4665
+ */
4666
+ type: string;
4667
+ /**
4668
+ * Currency without exchange rate
4669
+ */
4670
+ currency: string;
4671
+ /**
4672
+ * Affected account paths
4673
+ */
4674
+ accounts: Array<string>;
4675
+ /**
4676
+ * Total amount in this currency
4677
+ */
4678
+ totalAmount: string;
4140
4679
  };
4141
4680
 
4142
4681
  export type AccountsSummaryDto = {
@@ -4148,6 +4687,14 @@ export type AccountsSummaryDto = {
4148
4687
  * Total number of platforms
4149
4688
  */
4150
4689
  totalPlatforms: number;
4690
+ /**
4691
+ * Base currency for conversion
4692
+ */
4693
+ baseCurrency: string;
4694
+ /**
4695
+ * Per-account exchange rate warnings
4696
+ */
4697
+ warnings?: Array<AccountExchangeRateWarningDto>;
4151
4698
  };
4152
4699
 
4153
4700
  export type AccountsResponseDto = {
@@ -4182,6 +4729,10 @@ export type AccountItemWithAssetClassDto = {
4182
4729
  * Currency code
4183
4730
  */
4184
4731
  currency: string;
4732
+ /**
4733
+ * FX-converted balance in base currency; omitted when not convertible
4734
+ */
4735
+ convertedBalance?: string;
4185
4736
  /**
4186
4737
  * Asset class
4187
4738
  */
@@ -4263,25 +4814,6 @@ export type assetClass =
4263
4814
  | 'REAL_ESTATE'
4264
4815
  | 'INDEX';
4265
4816
 
4266
- export type AccountExchangeRateWarningDto = {
4267
- /**
4268
- * Warning type
4269
- */
4270
- type: string;
4271
- /**
4272
- * Currency without exchange rate
4273
- */
4274
- currency: string;
4275
- /**
4276
- * Affected account paths
4277
- */
4278
- accounts: Array<string>;
4279
- /**
4280
- * Total amount in this currency
4281
- */
4282
- totalAmount: string;
4283
- };
4284
-
4285
4817
  export type AssetClassSummaryDto = {
4286
4818
  /**
4287
4819
  * Total number of accounts
@@ -4447,26 +4979,83 @@ export type CashFlowResponseDto = {
4447
4979
  warnings?: Array<ExchangeRateWarningDto>;
4448
4980
  };
4449
4981
 
4450
- export type MonetaryDto = {
4982
+ export type CategoryGroupDto = {
4451
4983
  /**
4452
- * Amount (Decimal string)
4984
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
4453
4985
  */
4454
- amount: string;
4986
+ category: string;
4455
4987
  /**
4456
- * ISO 4217 currency
4988
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
4457
4989
  */
4458
- currency: string;
4990
+ totalExpense: string;
4459
4991
  /**
4460
- * Converted to user base currency (Decimal string)
4992
+ * Share of grand total (0-100); 0 when grand total is 0
4461
4993
  */
4462
- baseCcyEquivalent?: {
4463
- [key: string]: unknown;
4464
- } | null;
4465
- };
4466
-
4467
- export type CurrentPriceDto = {
4994
+ sharePct: number;
4468
4995
  /**
4469
- * Price amount (Decimal string)
4996
+ * Raw (unconverted) expense per currency
4997
+ */
4998
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4999
+ /**
5000
+ * Converted total in base currency (omitted when FX missing for all currencies in this category)
5001
+ */
5002
+ convertedBalance?: string;
5003
+ };
5004
+
5005
+ export type ExpensesByCategorySummaryDto = {
5006
+ /**
5007
+ * Total across all categories, converted (convertible categories only); expense totals when flow=expense, income totals when flow=income
5008
+ */
5009
+ totalExpense: string;
5010
+ /**
5011
+ * Number of categories
5012
+ */
5013
+ categoryCount: number;
5014
+ };
5015
+
5016
+ export type ExpensesByCategoryResponseDto = {
5017
+ /**
5018
+ * Period requested
5019
+ */
5020
+ period: string;
5021
+ /**
5022
+ * Base currency for converted values
5023
+ */
5024
+ baseCurrency: string;
5025
+ /**
5026
+ * Expense groups by functional category, sorted by converted total desc
5027
+ */
5028
+ groups: Array<CategoryGroupDto>;
5029
+ /**
5030
+ * Summary statistics
5031
+ */
5032
+ summary: ExpensesByCategorySummaryDto;
5033
+ /**
5034
+ * Exchange rate warnings (e.g. missing rate for a currency)
5035
+ */
5036
+ warnings?: Array<ExchangeRateWarningDto>;
5037
+ };
5038
+
5039
+ export type MonetaryDto = {
5040
+ /**
5041
+ * Amount (Decimal string)
5042
+ */
5043
+ amount: string;
5044
+ /**
5045
+ * ISO 4217 currency
5046
+ */
5047
+ currency: string;
5048
+ /**
5049
+ * Converted to user base currency (Decimal string)
5050
+ */
5051
+ baseCcyEquivalent?: {
5052
+ [key: string]: unknown;
5053
+ } | null;
5054
+ };
5055
+
5056
+ export type CurrentPriceDto = {
5057
+ /**
5058
+ * Price amount (Decimal string)
4470
5059
  */
4471
5060
  amount: string;
4472
5061
  /**
@@ -4642,108 +5231,6 @@ export type HoldingPnlResponseDto = {
4642
5231
  */
4643
5232
  export type method = 'average' | 'FIFO';
4644
5233
 
4645
- export type CreateBeanPriceDto = {
4646
- /**
4647
- * Currency being priced (e.g., USD, AAPL, BTC)
4648
- */
4649
- currency: string;
4650
- /**
4651
- * Quote currency (pricing currency, e.g., CNY, EUR)
4652
- */
4653
- quoteCurrency: string;
4654
- /**
4655
- * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
4656
- */
4657
- amount: number;
4658
- /**
4659
- * Price date (ISO 8601 format)
4660
- */
4661
- date: string;
4662
- /**
4663
- * Metadata (validated by Zod schema, max field lengths enforced)
4664
- */
4665
- metadata?: {
4666
- [key: string]: unknown;
4667
- };
4668
- };
4669
-
4670
- export type PriceResponseDto = {
4671
- /**
4672
- * Unique identifier
4673
- */
4674
- id: string;
4675
- /**
4676
- * User ID (owner of the price)
4677
- */
4678
- userId: string;
4679
- /**
4680
- * Currency being priced (e.g., USD, AAPL, BTC)
4681
- */
4682
- currency: string;
4683
- /**
4684
- * Quote currency (pricing currency, e.g., USD, CNY)
4685
- */
4686
- quoteCurrency: string;
4687
- /**
4688
- * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
4689
- */
4690
- amount: number;
4691
- /**
4692
- * Price date (ISO 8601 format). Represents the date this price was valid.
4693
- */
4694
- date: string;
4695
- /**
4696
- * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
4697
- */
4698
- meta: {
4699
- [key: string]: unknown;
4700
- };
4701
- /**
4702
- * Creation timestamp
4703
- */
4704
- createdAt: string;
4705
- /**
4706
- * Last update timestamp
4707
- */
4708
- updatedAt: string;
4709
- };
4710
-
4711
- export type PriceListResponseDto = {
4712
- /**
4713
- * List of prices
4714
- */
4715
- items: Array<PriceResponseDto>;
4716
- /**
4717
- * Total number of prices
4718
- */
4719
- total: number;
4720
- };
4721
-
4722
- export type UpdateBeanPriceDto = {
4723
- /**
4724
- * Currency being priced
4725
- */
4726
- currency?: string;
4727
- /**
4728
- * Quote currency (pricing currency)
4729
- */
4730
- quoteCurrency?: string;
4731
- /**
4732
- * Price amount (MUST be >= 0 per Beancount spec)
4733
- */
4734
- amount?: number;
4735
- /**
4736
- * Price date (ISO 8601 format)
4737
- */
4738
- date?: string;
4739
- /**
4740
- * Metadata
4741
- */
4742
- metadata?: {
4743
- [key: string]: unknown;
4744
- };
4745
- };
4746
-
4747
5234
  export type CurrencyBalanceDto = {
4748
5235
  /**
4749
5236
  * ISO 4217 currency code
@@ -4770,6 +5257,14 @@ export type TimeSeriesPointDto = {
4770
5257
  change?: {
4771
5258
  [key: string]: unknown;
4772
5259
  };
5260
+ /**
5261
+ * Total assets at this date (in base currency)
5262
+ */
5263
+ assets?: string;
5264
+ /**
5265
+ * Total liabilities at this date (in base currency)
5266
+ */
5267
+ liabilities?: string;
4773
5268
  /**
4774
5269
  * Multi-currency breakdown for this point
4775
5270
  */
@@ -4837,6 +5332,71 @@ export type PortfolioTrendsResponseDto = {
4837
5332
  warnings?: Array<ExchangeRateWarningDto>;
4838
5333
  };
4839
5334
 
5335
+ export type CashFlowPointDto = {
5336
+ /**
5337
+ * Month key (YYYY-MM)
5338
+ */
5339
+ month: string;
5340
+ /**
5341
+ * Income in base currency (absolute, converted)
5342
+ */
5343
+ income: string;
5344
+ /**
5345
+ * Expense in base currency (absolute, converted)
5346
+ */
5347
+ expense: string;
5348
+ /**
5349
+ * netSavings = income − expense (savings positive)
5350
+ */
5351
+ netSavings: string;
5352
+ };
5353
+
5354
+ export type CashFlowTrendSummaryDto = {
5355
+ /**
5356
+ * Total income across the period
5357
+ */
5358
+ totalIncome: string;
5359
+ /**
5360
+ * Total expense across the period
5361
+ */
5362
+ totalExpense: string;
5363
+ /**
5364
+ * income − expense across the period
5365
+ */
5366
+ totalNetSavings: string;
5367
+ /**
5368
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
5369
+ */
5370
+ averageMonthlyNetSavings: string;
5371
+ };
5372
+
5373
+ export type CashFlowTrendsResponseDto = {
5374
+ /**
5375
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
5376
+ */
5377
+ series: Array<CashFlowPointDto>;
5378
+ /**
5379
+ * Period totals
5380
+ */
5381
+ summary: CashFlowTrendSummaryDto;
5382
+ /**
5383
+ * Period requested
5384
+ */
5385
+ period: string;
5386
+ /**
5387
+ * Data granularity (v1 returns month buckets)
5388
+ */
5389
+ granularity: string;
5390
+ /**
5391
+ * Base currency for converted values
5392
+ */
5393
+ currency: string;
5394
+ /**
5395
+ * Exchange rate warnings (e.g. missing rate for a currency)
5396
+ */
5397
+ warnings?: Array<ExchangeRateWarningDto>;
5398
+ };
5399
+
4840
5400
  export type GenerateSnapshotBody = unknown;
4841
5401
 
4842
5402
  export type GenerateSnapshotResponse = unknown;
@@ -4880,7 +5440,7 @@ export type AccountControllerFindAllData = {
4880
5440
  */
4881
5441
  region: 'cn' | 'us' | 'de' | 'gb';
4882
5442
  /**
4883
- * Search term for path or i18nKey
5443
+ * Search term for account path
4884
5444
  */
4885
5445
  search?: string;
4886
5446
  /**
@@ -4963,6 +5523,21 @@ export type AccountControllerReopenData = {
4963
5523
 
4964
5524
  export type AccountControllerReopenResponse = AccountResponseDto;
4965
5525
 
5526
+ export type AccountControllerAddOpeningBalanceData = {
5527
+ /**
5528
+ * Account UUID
5529
+ */
5530
+ id: string;
5531
+ /**
5532
+ * Region code for tenant context
5533
+ */
5534
+ region: 'cn' | 'us' | 'de' | 'gb';
5535
+ requestBody: CreateOpeningBalanceDto;
5536
+ };
5537
+
5538
+ export type AccountControllerAddOpeningBalanceResponse =
5539
+ OpeningBalanceResultDto;
5540
+
4966
5541
  export type AccountStandardsControllerGetTemplatesData = {
4967
5542
  /**
4968
5543
  * Region code (cn, us, de)
@@ -5023,6 +5598,10 @@ export type TransactionControllerListData = {
5023
5598
  * Filter by account ID (transactions with postings to this account)
5024
5599
  */
5025
5600
  accountId?: string;
5601
+ /**
5602
+ * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
5603
+ */
5604
+ category?: string;
5026
5605
  /**
5027
5606
  * Filter by start date (inclusive), format: YYYY-MM-DD
5028
5607
  */
@@ -5147,7 +5726,7 @@ export type TransactionControllerDeleteResponse = void;
5147
5726
 
5148
5727
  export type BalanceControllerGetBalanceData = {
5149
5728
  /**
5150
- * Account name (e.g., "Assets:Bank:Checking")
5729
+ * Account name (e.g., "Assets:Checking")
5151
5730
  */
5152
5731
  account: string;
5153
5732
  /**
@@ -5549,46 +6128,143 @@ export type CommodityControllerBulkCreateData = {
5549
6128
 
5550
6129
  export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
5551
6130
 
5552
- export type RecurringRuleControllerCreateData = {
6131
+ export type PriceControllerCreateData = {
5553
6132
  /**
5554
6133
  * Region code for tenant context
5555
6134
  */
5556
6135
  region: 'cn' | 'us' | 'de' | 'gb';
5557
- requestBody: CreateRecurringRuleDto;
6136
+ requestBody: CreateBeanPriceDto;
5558
6137
  };
5559
6138
 
5560
- export type RecurringRuleControllerCreateResponse = RecurringRuleResponseDto;
6139
+ export type PriceControllerCreateResponse = PriceResponseDto;
5561
6140
 
5562
- export type RecurringRuleControllerFindAllData = {
6141
+ export type PriceControllerFindAllData = {
5563
6142
  /**
5564
- * Filter by frequency (WEEKLY, MONTHLY, etc.)
6143
+ * Filter by currency (e.g., BTC, AAPL, USD)
5565
6144
  */
5566
- frequency?: string;
6145
+ currency?: string;
5567
6146
  /**
5568
- * Filter by autoCreate enabled
6147
+ * Filter prices from this date (ISO 8601 format)
5569
6148
  */
5570
- hasAutoCreate?: boolean;
6149
+ dateFrom?: string;
5571
6150
  /**
5572
- * Filter by active status
6151
+ * Filter prices to this date (ISO 8601 format)
5573
6152
  */
5574
- isActive?: boolean;
6153
+ dateTo?: string;
5575
6154
  /**
5576
- * Region code for tenant context
6155
+ * Number of items per page (default: 20, max: 100)
5577
6156
  */
5578
- region: 'cn' | 'us' | 'de' | 'gb';
5579
- };
5580
-
5581
- export type RecurringRuleControllerFindAllResponse =
5582
- Array<RecurringRuleResponseDto>;
5583
-
5584
- export type RecurringRuleControllerCreateFromTransactionData = {
6157
+ limit?: number;
6158
+ /**
6159
+ * Page number for pagination (default: 1)
6160
+ */
6161
+ page?: number;
6162
+ /**
6163
+ * Filter by quote currency (pricing currency, e.g., USD, CNY)
6164
+ */
6165
+ quoteCurrency?: string;
5585
6166
  /**
5586
6167
  * Region code for tenant context
5587
6168
  */
5588
6169
  region: 'cn' | 'us' | 'de' | 'gb';
5589
- requestBody: CreateRuleFromTransactionDto;
5590
6170
  /**
5591
- * Source transaction ID
6171
+ * Search term for currency or quoteCurrency (case-insensitive partial match)
6172
+ */
6173
+ search?: string;
6174
+ };
6175
+
6176
+ export type PriceControllerFindAllResponse = PriceListResponseDto;
6177
+
6178
+ export type PriceControllerFindOneData = {
6179
+ /**
6180
+ * Price ID
6181
+ */
6182
+ id: string;
6183
+ /**
6184
+ * Region code for tenant context
6185
+ */
6186
+ region: 'cn' | 'us' | 'de' | 'gb';
6187
+ };
6188
+
6189
+ export type PriceControllerFindOneResponse = PriceResponseDto;
6190
+
6191
+ export type PriceControllerUpdateData = {
6192
+ /**
6193
+ * Price ID
6194
+ */
6195
+ id: string;
6196
+ /**
6197
+ * Region code for tenant context
6198
+ */
6199
+ region: 'cn' | 'us' | 'de' | 'gb';
6200
+ requestBody: UpdateBeanPriceDto;
6201
+ };
6202
+
6203
+ export type PriceControllerUpdateResponse = PriceResponseDto;
6204
+
6205
+ export type PriceControllerDeleteData = {
6206
+ /**
6207
+ * Price ID
6208
+ */
6209
+ id: string;
6210
+ /**
6211
+ * Region code for tenant context
6212
+ */
6213
+ region: 'cn' | 'us' | 'de' | 'gb';
6214
+ };
6215
+
6216
+ export type PriceControllerDeleteResponse = void;
6217
+
6218
+ export type PriceControllerBulkCreateData = {
6219
+ /**
6220
+ * Region code for tenant context
6221
+ */
6222
+ region: 'cn' | 'us' | 'de' | 'gb';
6223
+ requestBody: Array<string>;
6224
+ };
6225
+
6226
+ export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
6227
+
6228
+ export type RecurringRuleControllerCreateData = {
6229
+ /**
6230
+ * Region code for tenant context
6231
+ */
6232
+ region: 'cn' | 'us' | 'de' | 'gb';
6233
+ requestBody: CreateRecurringRuleDto;
6234
+ };
6235
+
6236
+ export type RecurringRuleControllerCreateResponse = RecurringRuleResponseDto;
6237
+
6238
+ export type RecurringRuleControllerFindAllData = {
6239
+ /**
6240
+ * Filter by frequency (WEEKLY, MONTHLY, etc.)
6241
+ */
6242
+ frequency?: string;
6243
+ /**
6244
+ * Filter by autoCreate enabled
6245
+ */
6246
+ hasAutoCreate?: boolean;
6247
+ /**
6248
+ * Filter by active status
6249
+ */
6250
+ isActive?: boolean;
6251
+ /**
6252
+ * Region code for tenant context
6253
+ */
6254
+ region: 'cn' | 'us' | 'de' | 'gb';
6255
+ };
6256
+
6257
+ export type RecurringRuleControllerFindAllResponse =
6258
+ Array<RecurringRuleResponseDto>;
6259
+
6260
+ export type RecurringRuleControllerCreateFromTransactionData = {
6261
+ /**
6262
+ * Region code for tenant context
6263
+ */
6264
+ region: 'cn' | 'us' | 'de' | 'gb';
6265
+ requestBody: CreateRuleFromTransactionDto;
6266
+ /**
6267
+ * Source transaction ID
5592
6268
  */
5593
6269
  transactionId: string;
5594
6270
  };
@@ -6014,6 +6690,159 @@ export type PropertyControllerDeleteData = {
6014
6690
 
6015
6691
  export type PropertyControllerDeleteResponse = void;
6016
6692
 
6693
+ export type EventControllerCreateData = {
6694
+ /**
6695
+ * Region code for tenant context (decorative for life events)
6696
+ */
6697
+ region: 'cn' | 'us' | 'de' | 'gb';
6698
+ requestBody: CreateBeanEventDto;
6699
+ };
6700
+
6701
+ export type EventControllerCreateResponse = EventResponseDto;
6702
+
6703
+ export type EventControllerFindAllData = {
6704
+ /**
6705
+ * Filter life events from this date (ISO 8601 format)
6706
+ */
6707
+ from?: string;
6708
+ /**
6709
+ * Number of items per page (default: 20, max: 100)
6710
+ */
6711
+ limit?: number;
6712
+ /**
6713
+ * Page number for pagination (default: 1)
6714
+ */
6715
+ page?: number;
6716
+ /**
6717
+ * Search term for description (case-insensitive partial match)
6718
+ */
6719
+ q?: string;
6720
+ /**
6721
+ * Region code for tenant context (decorative for life events)
6722
+ */
6723
+ region: 'cn' | 'us' | 'de' | 'gb';
6724
+ /**
6725
+ * Filter life events to this date (ISO 8601 format)
6726
+ */
6727
+ to?: string;
6728
+ /**
6729
+ * Filter by life event type (exact match)
6730
+ */
6731
+ type?: string;
6732
+ };
6733
+
6734
+ export type EventControllerFindAllResponse = EventListResponseDto;
6735
+
6736
+ export type EventControllerFindOneData = {
6737
+ /**
6738
+ * Life event ID
6739
+ */
6740
+ id: string;
6741
+ /**
6742
+ * Region code for tenant context (decorative for life events)
6743
+ */
6744
+ region: 'cn' | 'us' | 'de' | 'gb';
6745
+ };
6746
+
6747
+ export type EventControllerFindOneResponse = EventResponseDto;
6748
+
6749
+ export type EventControllerUpdateData = {
6750
+ /**
6751
+ * Life event ID
6752
+ */
6753
+ id: string;
6754
+ /**
6755
+ * Region code for tenant context (decorative for life events)
6756
+ */
6757
+ region: 'cn' | 'us' | 'de' | 'gb';
6758
+ requestBody: UpdateBeanEventDto;
6759
+ };
6760
+
6761
+ export type EventControllerUpdateResponse = EventResponseDto;
6762
+
6763
+ export type EventControllerDeleteData = {
6764
+ /**
6765
+ * Life event ID
6766
+ */
6767
+ id: string;
6768
+ /**
6769
+ * Region code for tenant context (decorative for life events)
6770
+ */
6771
+ region: 'cn' | 'us' | 'de' | 'gb';
6772
+ };
6773
+
6774
+ export type EventControllerDeleteResponse = void;
6775
+
6776
+ export type EventControllerGetSliceData = {
6777
+ accountPattern: string;
6778
+ granularity: string;
6779
+ /**
6780
+ * Life event ID
6781
+ */
6782
+ id: string;
6783
+ /**
6784
+ * Region code for tenant context (decorative for life events)
6785
+ */
6786
+ region: 'cn' | 'us' | 'de' | 'gb';
6787
+ };
6788
+
6789
+ export type EventControllerGetSliceResponse = unknown;
6790
+
6791
+ export type OnboardingControllerBootstrapData = {
6792
+ /**
6793
+ * Region code for tenant context
6794
+ */
6795
+ region: 'cn' | 'us' | 'de' | 'gb';
6796
+ requestBody: OnboardingDto;
6797
+ };
6798
+
6799
+ export type OnboardingControllerBootstrapResponse = unknown;
6800
+
6801
+ export type ReconciliationControllerComputeData = {
6802
+ /**
6803
+ * Region code for tenant context (decorative for reconciliation)
6804
+ */
6805
+ region: 'cn' | 'us' | 'de' | 'gb';
6806
+ requestBody: ComputeReconciliationDto;
6807
+ };
6808
+
6809
+ export type ReconciliationControllerComputeResponse =
6810
+ ReconciliationComputeResultDto;
6811
+
6812
+ export type ReconciliationControllerAssertData = {
6813
+ /**
6814
+ * Region code for tenant context (decorative for reconciliation)
6815
+ */
6816
+ region: 'cn' | 'us' | 'de' | 'gb';
6817
+ requestBody: AssertReconciliationDto;
6818
+ };
6819
+
6820
+ export type ReconciliationControllerAssertResponse = ReconciliationRecordDto;
6821
+
6822
+ export type ReconciliationControllerPadData = {
6823
+ /**
6824
+ * Region code for tenant context (decorative for reconciliation)
6825
+ */
6826
+ region: 'cn' | 'us' | 'de' | 'gb';
6827
+ requestBody: PadReconciliationDto;
6828
+ };
6829
+
6830
+ export type ReconciliationControllerPadResponse = PadResultDto;
6831
+
6832
+ export type ReconciliationControllerHistoryData = {
6833
+ /**
6834
+ * BeanAccount id
6835
+ */
6836
+ accountId: string;
6837
+ /**
6838
+ * Region code for tenant context (decorative for reconciliation)
6839
+ */
6840
+ region: 'cn' | 'us' | 'de' | 'gb';
6841
+ };
6842
+
6843
+ export type ReconciliationControllerHistoryResponse =
6844
+ Array<ReconciliationRecordDto>;
6845
+
6017
6846
  export type ExportControllerExportBeancountResponse = unknown;
6018
6847
 
6019
6848
  export type FileImportControllerImportFileData = {
@@ -6106,48 +6935,6 @@ export type ImporterConfigControllerResetConfigData = {
6106
6935
 
6107
6936
  export type ImporterConfigControllerResetConfigResponse = ImporterConfigDto;
6108
6937
 
6109
- export type PlatformControllerFindAllResponse = unknown;
6110
-
6111
- export type PlatformControllerCreateData = {
6112
- requestBody: CreatePlatformDto;
6113
- };
6114
-
6115
- export type PlatformControllerCreateResponse = unknown;
6116
-
6117
- export type PlatformControllerGetPlatformListResponse = unknown;
6118
-
6119
- export type PlatformControllerMatchPlatformsData = {
6120
- /**
6121
- * Search query — Chinese name, English name, or abbreviation
6122
- */
6123
- q: string;
6124
- /**
6125
- * Region code for category override lookup
6126
- */
6127
- region?: string;
6128
- };
6129
-
6130
- export type PlatformControllerMatchPlatformsResponse = unknown;
6131
-
6132
- export type PlatformControllerUpdateData = {
6133
- /**
6134
- * Platform ID
6135
- */
6136
- id: string;
6137
- requestBody: UpdatePlatformDto;
6138
- };
6139
-
6140
- export type PlatformControllerUpdateResponse = unknown;
6141
-
6142
- export type PlatformControllerDeleteData = {
6143
- /**
6144
- * Platform ID
6145
- */
6146
- id: string;
6147
- };
6148
-
6149
- export type PlatformControllerDeleteResponse = void;
6150
-
6151
6938
  export type ProviderSyncControllerSyncData = {
6152
6939
  /**
6153
6940
  * Provider name
@@ -6193,47 +6980,90 @@ export type ProviderSyncControllerIsProviderSupportedData = {
6193
6980
 
6194
6981
  export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
6195
6982
 
6196
- export type TelemetryControllerReportTelemetryData = {
6983
+ export type ExternalAccountLinkControllerCreateData = {
6197
6984
  /**
6198
6985
  * Region code for tenant context
6199
6986
  */
6200
6987
  region: 'cn' | 'us' | 'de' | 'gb';
6201
- requestBody: ParserTelemetryReportDto;
6988
+ requestBody: CreateExternalAccountLinkDto;
6202
6989
  };
6203
6990
 
6204
- export type TelemetryControllerReportTelemetryResponse = unknown;
6991
+ export type ExternalAccountLinkControllerCreateResponse =
6992
+ ExternalAccountLinkResponseDto;
6205
6993
 
6206
- export type TelemetryControllerReportCoverageMissData = {
6994
+ export type ExternalAccountLinkControllerFindAllData = {
6995
+ provider: string;
6207
6996
  /**
6208
6997
  * Region code for tenant context
6209
6998
  */
6210
6999
  region: 'cn' | 'us' | 'de' | 'gb';
6211
- requestBody: UncoveredFormatMissDto;
6212
7000
  };
6213
7001
 
6214
- export type TelemetryControllerReportCoverageMissResponse = unknown;
7002
+ export type ExternalAccountLinkControllerFindAllResponse =
7003
+ ExternalAccountLinkListResponseDto;
6215
7004
 
6216
- export type TelemetryControllerGetCoverageMetricsData = {
7005
+ export type ExternalAccountLinkControllerFindOneData = {
7006
+ id: string;
6217
7007
  /**
6218
7008
  * Region code for tenant context
6219
7009
  */
6220
7010
  region: 'cn' | 'us' | 'de' | 'gb';
6221
- /**
6222
- * Top-N uncovered formats (default 10)
6223
- */
6224
- topN?: unknown;
6225
7011
  };
6226
7012
 
6227
- export type TelemetryControllerGetCoverageMetricsResponse = unknown;
7013
+ export type ExternalAccountLinkControllerFindOneResponse =
7014
+ ExternalAccountLinkResponseDto;
6228
7015
 
6229
- export type NlpControllerProcessNaturalLanguageData = {
7016
+ export type ExternalAccountLinkControllerRemoveData = {
7017
+ id: string;
6230
7018
  /**
6231
7019
  * Region code for tenant context
6232
7020
  */
6233
7021
  region: 'cn' | 'us' | 'de' | 'gb';
6234
- /**
6235
- * Natural language transaction input with optional session ID
6236
- */
7022
+ };
7023
+
7024
+ export type ExternalAccountLinkControllerRemoveResponse = void;
7025
+
7026
+ export type TelemetryControllerReportTelemetryData = {
7027
+ /**
7028
+ * Region code for tenant context
7029
+ */
7030
+ region: 'cn' | 'us' | 'de' | 'gb';
7031
+ requestBody: ParserTelemetryReportDto;
7032
+ };
7033
+
7034
+ export type TelemetryControllerReportTelemetryResponse = unknown;
7035
+
7036
+ export type TelemetryControllerReportCoverageMissData = {
7037
+ /**
7038
+ * Region code for tenant context
7039
+ */
7040
+ region: 'cn' | 'us' | 'de' | 'gb';
7041
+ requestBody: UncoveredFormatMissDto;
7042
+ };
7043
+
7044
+ export type TelemetryControllerReportCoverageMissResponse = unknown;
7045
+
7046
+ export type TelemetryControllerGetCoverageMetricsData = {
7047
+ /**
7048
+ * Region code for tenant context
7049
+ */
7050
+ region: 'cn' | 'us' | 'de' | 'gb';
7051
+ /**
7052
+ * Top-N uncovered formats (default 10)
7053
+ */
7054
+ topN?: unknown;
7055
+ };
7056
+
7057
+ export type TelemetryControllerGetCoverageMetricsResponse = unknown;
7058
+
7059
+ export type NlpControllerProcessNaturalLanguageData = {
7060
+ /**
7061
+ * Region code for tenant context
7062
+ */
7063
+ region: 'cn' | 'us' | 'de' | 'gb';
7064
+ /**
7065
+ * Natural language transaction input with optional session ID
7066
+ */
6237
7067
  requestBody: ProcessNlpDto;
6238
7068
  };
6239
7069
 
@@ -6265,6 +7095,48 @@ export type NlpControllerGetSessionData = {
6265
7095
 
6266
7096
  export type NlpControllerGetSessionResponse = unknown;
6267
7097
 
7098
+ export type PlatformControllerFindAllResponse = unknown;
7099
+
7100
+ export type PlatformControllerCreateData = {
7101
+ requestBody: CreatePlatformDto;
7102
+ };
7103
+
7104
+ export type PlatformControllerCreateResponse = unknown;
7105
+
7106
+ export type PlatformControllerGetPlatformListResponse = unknown;
7107
+
7108
+ export type PlatformControllerMatchPlatformsData = {
7109
+ /**
7110
+ * Search query — Chinese name, English name, or abbreviation
7111
+ */
7112
+ q: string;
7113
+ /**
7114
+ * Region code for category override lookup
7115
+ */
7116
+ region?: string;
7117
+ };
7118
+
7119
+ export type PlatformControllerMatchPlatformsResponse = unknown;
7120
+
7121
+ export type PlatformControllerUpdateData = {
7122
+ /**
7123
+ * Platform ID
7124
+ */
7125
+ id: string;
7126
+ requestBody: UpdatePlatformDto;
7127
+ };
7128
+
7129
+ export type PlatformControllerUpdateResponse = unknown;
7130
+
7131
+ export type PlatformControllerDeleteData = {
7132
+ /**
7133
+ * Platform ID
7134
+ */
7135
+ id: string;
7136
+ };
7137
+
7138
+ export type PlatformControllerDeleteResponse = void;
7139
+
6268
7140
  export type DashboardControllerGetNetWorthData = {
6269
7141
  /**
6270
7142
  * Date for balance calculation (ISO 8601 format)
@@ -6319,127 +7191,70 @@ export type DashboardControllerGetCashFlowData = {
6319
7191
 
6320
7192
  export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
6321
7193
 
6322
- export type HoldingPnlControllerGetHoldingPnlData = {
6323
- /**
6324
- * Scope to a single account
6325
- */
6326
- accountId?: string;
6327
- /**
6328
- * As-of date (ISO 8601), defaults to today
6329
- */
6330
- asOf?: string;
6331
- /**
6332
- * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
6333
- */
6334
- method?: 'FIFO' | 'average';
6335
- /**
6336
- * Region code for tenant context
6337
- */
6338
- region: 'cn' | 'us' | 'de' | 'gb';
6339
- };
6340
-
6341
- export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
6342
-
6343
- export type PriceControllerCreateData = {
6344
- /**
6345
- * Region code for tenant context
6346
- */
6347
- region: 'cn' | 'us' | 'de' | 'gb';
6348
- requestBody: CreateBeanPriceDto;
6349
- };
6350
-
6351
- export type PriceControllerCreateResponse = PriceResponseDto;
6352
-
6353
- export type PriceControllerFindAllData = {
6354
- /**
6355
- * Filter by currency (e.g., BTC, AAPL, USD)
6356
- */
6357
- currency?: string;
6358
- /**
6359
- * Filter prices from this date (ISO 8601 format)
6360
- */
6361
- dateFrom?: string;
6362
- /**
6363
- * Filter prices to this date (ISO 8601 format)
6364
- */
6365
- dateTo?: string;
7194
+ export type DashboardControllerGetExpensesData = {
6366
7195
  /**
6367
- * Number of items per page (default: 20, max: 100)
7196
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
6368
7197
  */
6369
- limit?: number;
7198
+ flow?: 'expense' | 'income';
6370
7199
  /**
6371
- * Page number for pagination (default: 1)
7200
+ * Grouping strategy
6372
7201
  */
6373
- page?: number;
7202
+ groupBy?: 'category';
6374
7203
  /**
6375
- * Filter by quote currency (pricing currency, e.g., USD, CNY)
7204
+ * Time window (1m = current calendar month)
6376
7205
  */
6377
- quoteCurrency?: string;
7206
+ period?: '1m' | '3m' | '6m' | '1y';
6378
7207
  /**
6379
7208
  * Region code for tenant context
6380
7209
  */
6381
7210
  region: 'cn' | 'us' | 'de' | 'gb';
6382
- /**
6383
- * Search term for currency or quoteCurrency (case-insensitive partial match)
6384
- */
6385
- search?: string;
6386
7211
  };
6387
7212
 
6388
- export type PriceControllerFindAllResponse = PriceListResponseDto;
7213
+ export type DashboardControllerGetExpensesResponse =
7214
+ ExpensesByCategoryResponseDto;
6389
7215
 
6390
- export type PriceControllerFindOneData = {
7216
+ export type HoldingPnlControllerGetHoldingPnlData = {
6391
7217
  /**
6392
- * Price ID
7218
+ * Scope to a single account
6393
7219
  */
6394
- id: string;
7220
+ accountId?: string;
6395
7221
  /**
6396
- * Region code for tenant context
7222
+ * As-of date (ISO 8601), defaults to today
6397
7223
  */
6398
- region: 'cn' | 'us' | 'de' | 'gb';
6399
- };
6400
-
6401
- export type PriceControllerFindOneResponse = PriceResponseDto;
6402
-
6403
- export type PriceControllerUpdateData = {
7224
+ asOf?: string;
6404
7225
  /**
6405
- * Price ID
7226
+ * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
6406
7227
  */
6407
- id: string;
7228
+ method?: 'FIFO' | 'average';
6408
7229
  /**
6409
7230
  * Region code for tenant context
6410
7231
  */
6411
7232
  region: 'cn' | 'us' | 'de' | 'gb';
6412
- requestBody: UpdateBeanPriceDto;
6413
7233
  };
6414
7234
 
6415
- export type PriceControllerUpdateResponse = PriceResponseDto;
7235
+ export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
6416
7236
 
6417
- export type PriceControllerDeleteData = {
7237
+ export type ReportingControllerGetPortfolioTrendsData = {
6418
7238
  /**
6419
- * Price ID
7239
+ * Data granularity
6420
7240
  */
6421
- id: string;
7241
+ granularity?: 'day' | 'week' | 'month';
6422
7242
  /**
6423
- * Region code for tenant context
7243
+ * Time period
6424
7244
  */
6425
- region: 'cn' | 'us' | 'de' | 'gb';
6426
- };
6427
-
6428
- export type PriceControllerDeleteResponse = void;
6429
-
6430
- export type PriceControllerBulkCreateData = {
7245
+ period?: '1m' | '3m' | '6m' | '1y';
6431
7246
  /**
6432
7247
  * Region code for tenant context
6433
7248
  */
6434
7249
  region: 'cn' | 'us' | 'de' | 'gb';
6435
- requestBody: Array<string>;
6436
7250
  };
6437
7251
 
6438
- export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
7252
+ export type ReportingControllerGetPortfolioTrendsResponse =
7253
+ PortfolioTrendsResponseDto;
6439
7254
 
6440
- export type ReportingControllerGetPortfolioTrendsData = {
7255
+ export type ReportingControllerGetCashFlowTrendsData = {
6441
7256
  /**
6442
- * Data granularity
7257
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6443
7258
  */
6444
7259
  granularity?: 'day' | 'week' | 'month';
6445
7260
  /**
@@ -6452,8 +7267,8 @@ export type ReportingControllerGetPortfolioTrendsData = {
6452
7267
  region: 'cn' | 'us' | 'de' | 'gb';
6453
7268
  };
6454
7269
 
6455
- export type ReportingControllerGetPortfolioTrendsResponse =
6456
- PortfolioTrendsResponseDto;
7270
+ export type ReportingControllerGetCashFlowTrendsResponse =
7271
+ CashFlowTrendsResponseDto;
6457
7272
 
6458
7273
  export type ReportingControllerGenerateSnapshotData = {
6459
7274
  /**
@@ -6634,6 +7449,25 @@ export type $OpenApiTs = {
6634
7449
  };
6635
7450
  };
6636
7451
  };
7452
+ '/api/v1/{region}/bean/accounts/{id}/opening-balance': {
7453
+ post: {
7454
+ req: AccountControllerAddOpeningBalanceData;
7455
+ res: {
7456
+ /**
7457
+ * Opening-balance transaction created
7458
+ */
7459
+ 201: OpeningBalanceResultDto;
7460
+ /**
7461
+ * Account not found
7462
+ */
7463
+ 404: unknown;
7464
+ /**
7465
+ * An opening balance already exists for this account
7466
+ */
7467
+ 409: unknown;
7468
+ };
7469
+ };
7470
+ };
6637
7471
  '/api/v1/{region}/bean/account-standards': {
6638
7472
  get: {
6639
7473
  req: AccountStandardsControllerGetTemplatesData;
@@ -7242,63 +8076,147 @@ export type $OpenApiTs = {
7242
8076
  };
7243
8077
  };
7244
8078
  };
7245
- '/api/v1/{region}/bean/recurring-rules': {
8079
+ '/api/v1/{region}/bean/prices': {
7246
8080
  post: {
7247
- req: RecurringRuleControllerCreateData;
8081
+ req: PriceControllerCreateData;
7248
8082
  res: {
7249
8083
  /**
7250
- * Rule created successfully
8084
+ * Price created successfully
7251
8085
  */
7252
- 201: RecurringRuleResponseDto;
8086
+ 201: PriceResponseDto;
7253
8087
  /**
7254
- * Invalid input data (e.g., autoCreate without accounts)
8088
+ * Currency or quoteCurrency commodity not found
7255
8089
  */
7256
- 400: unknown;
8090
+ 404: unknown;
7257
8091
  /**
7258
- * Rule with same name already exists
8092
+ * Price already exists for this currency pair and date
7259
8093
  */
7260
8094
  409: unknown;
7261
8095
  };
7262
8096
  };
7263
8097
  get: {
7264
- req: RecurringRuleControllerFindAllData;
8098
+ req: PriceControllerFindAllData;
7265
8099
  res: {
7266
8100
  /**
7267
- * Rules retrieved successfully
8101
+ * Prices retrieved successfully
7268
8102
  */
7269
- 200: Array<RecurringRuleResponseDto>;
8103
+ 200: PriceListResponseDto;
7270
8104
  };
7271
8105
  };
7272
8106
  };
7273
- '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}': {
7274
- post: {
7275
- req: RecurringRuleControllerCreateFromTransactionData;
8107
+ '/api/v1/{region}/bean/prices/{id}': {
8108
+ get: {
8109
+ req: PriceControllerFindOneData;
7276
8110
  res: {
7277
8111
  /**
7278
- * Rule created successfully
7279
- */
7280
- 201: RecurringRuleResponseDto;
7281
- /**
7282
- * Transaction not found
8112
+ * Price retrieved successfully
7283
8113
  */
7284
- 404: ApiProblemResponseDto;
8114
+ 200: PriceResponseDto;
7285
8115
  /**
7286
- * Rule with same name already exists or transaction already linked
8116
+ * Price not found
7287
8117
  */
7288
- 409: ApiProblemResponseDto;
8118
+ 404: unknown;
7289
8119
  };
7290
8120
  };
7291
- };
7292
- '/api/v1/{region}/bean/recurring-rules/{id}': {
7293
- get: {
7294
- req: RecurringRuleControllerFindOneData;
8121
+ put: {
8122
+ req: PriceControllerUpdateData;
7295
8123
  res: {
7296
8124
  /**
7297
- * Rule retrieved successfully
8125
+ * Price updated successfully
7298
8126
  */
7299
- 200: RecurringRuleResponseDto;
8127
+ 200: PriceResponseDto;
7300
8128
  /**
7301
- * Rule not found
8129
+ * Price not found
8130
+ */
8131
+ 404: unknown;
8132
+ /**
8133
+ * Updated price conflicts with existing price
8134
+ */
8135
+ 409: unknown;
8136
+ };
8137
+ };
8138
+ delete: {
8139
+ req: PriceControllerDeleteData;
8140
+ res: {
8141
+ /**
8142
+ * Price deleted successfully
8143
+ */
8144
+ 204: void;
8145
+ /**
8146
+ * Price not found
8147
+ */
8148
+ 404: unknown;
8149
+ };
8150
+ };
8151
+ };
8152
+ '/api/v1/{region}/bean/prices/bulk': {
8153
+ post: {
8154
+ req: PriceControllerBulkCreateData;
8155
+ res: {
8156
+ /**
8157
+ * Prices created successfully
8158
+ */
8159
+ 201: Array<PriceResponseDto>;
8160
+ };
8161
+ };
8162
+ };
8163
+ '/api/v1/{region}/bean/recurring-rules': {
8164
+ post: {
8165
+ req: RecurringRuleControllerCreateData;
8166
+ res: {
8167
+ /**
8168
+ * Rule created successfully
8169
+ */
8170
+ 201: RecurringRuleResponseDto;
8171
+ /**
8172
+ * Invalid input data (e.g., autoCreate without accounts)
8173
+ */
8174
+ 400: unknown;
8175
+ /**
8176
+ * Rule with same name already exists
8177
+ */
8178
+ 409: unknown;
8179
+ };
8180
+ };
8181
+ get: {
8182
+ req: RecurringRuleControllerFindAllData;
8183
+ res: {
8184
+ /**
8185
+ * Rules retrieved successfully
8186
+ */
8187
+ 200: Array<RecurringRuleResponseDto>;
8188
+ };
8189
+ };
8190
+ };
8191
+ '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}': {
8192
+ post: {
8193
+ req: RecurringRuleControllerCreateFromTransactionData;
8194
+ res: {
8195
+ /**
8196
+ * Rule created successfully
8197
+ */
8198
+ 201: RecurringRuleResponseDto;
8199
+ /**
8200
+ * Transaction not found
8201
+ */
8202
+ 404: ApiProblemResponseDto;
8203
+ /**
8204
+ * Rule with same name already exists or transaction already linked
8205
+ */
8206
+ 409: ApiProblemResponseDto;
8207
+ };
8208
+ };
8209
+ };
8210
+ '/api/v1/{region}/bean/recurring-rules/{id}': {
8211
+ get: {
8212
+ req: RecurringRuleControllerFindOneData;
8213
+ res: {
8214
+ /**
8215
+ * Rule retrieved successfully
8216
+ */
8217
+ 200: RecurringRuleResponseDto;
8218
+ /**
8219
+ * Rule not found
7302
8220
  */
7303
8221
  404: unknown;
7304
8222
  };
@@ -7886,6 +8804,181 @@ export type $OpenApiTs = {
7886
8804
  };
7887
8805
  };
7888
8806
  };
8807
+ '/api/v1/{region}/bean/events': {
8808
+ post: {
8809
+ req: EventControllerCreateData;
8810
+ res: {
8811
+ /**
8812
+ * Life event created successfully
8813
+ */
8814
+ 201: EventResponseDto;
8815
+ /**
8816
+ * Life event already exists for this (userId, type, date) combination
8817
+ */
8818
+ 409: unknown;
8819
+ };
8820
+ };
8821
+ get: {
8822
+ req: EventControllerFindAllData;
8823
+ res: {
8824
+ /**
8825
+ * Life events retrieved successfully
8826
+ */
8827
+ 200: EventListResponseDto;
8828
+ };
8829
+ };
8830
+ };
8831
+ '/api/v1/{region}/bean/events/{id}': {
8832
+ get: {
8833
+ req: EventControllerFindOneData;
8834
+ res: {
8835
+ /**
8836
+ * Life event retrieved successfully
8837
+ */
8838
+ 200: EventResponseDto;
8839
+ /**
8840
+ * Life event not found
8841
+ */
8842
+ 404: unknown;
8843
+ };
8844
+ };
8845
+ put: {
8846
+ req: EventControllerUpdateData;
8847
+ res: {
8848
+ /**
8849
+ * Life event updated successfully
8850
+ */
8851
+ 200: EventResponseDto;
8852
+ /**
8853
+ * If-Match header is not a valid ISO 8601 date
8854
+ */
8855
+ 400: unknown;
8856
+ /**
8857
+ * Life event not found
8858
+ */
8859
+ 404: unknown;
8860
+ /**
8861
+ * Updated event conflicts with an existing (userId, type, date) combination
8862
+ */
8863
+ 409: unknown;
8864
+ /**
8865
+ * If-Match precondition failed (updatedAt mismatch)
8866
+ */
8867
+ 412: unknown;
8868
+ };
8869
+ };
8870
+ delete: {
8871
+ req: EventControllerDeleteData;
8872
+ res: {
8873
+ /**
8874
+ * Life event deleted successfully
8875
+ */
8876
+ 204: void;
8877
+ /**
8878
+ * Life event not found
8879
+ */
8880
+ 404: unknown;
8881
+ };
8882
+ };
8883
+ };
8884
+ '/api/v1/{region}/bean/events/{id}/slice': {
8885
+ get: {
8886
+ req: EventControllerGetSliceData;
8887
+ res: {
8888
+ /**
8889
+ * Time-series sliced by the life event range
8890
+ */
8891
+ 200: unknown;
8892
+ /**
8893
+ * accountPattern query param is empty
8894
+ */
8895
+ 400: unknown;
8896
+ /**
8897
+ * Life event not found
8898
+ */
8899
+ 404: unknown;
8900
+ };
8901
+ };
8902
+ };
8903
+ '/api/v1/{region}/bean/onboarding': {
8904
+ post: {
8905
+ req: OnboardingControllerBootstrapData;
8906
+ res: {
8907
+ /**
8908
+ * Onboarding bootstrap result.
8909
+ */
8910
+ 201: unknown;
8911
+ /**
8912
+ * Invalid region/account path/duplicate paths.
8913
+ */
8914
+ 422: unknown;
8915
+ };
8916
+ };
8917
+ };
8918
+ '/api/v1/{region}/bean/reconciliations': {
8919
+ post: {
8920
+ req: ReconciliationControllerComputeData;
8921
+ res: {
8922
+ /**
8923
+ * Reconciliation preview
8924
+ */
8925
+ 200: ReconciliationComputeResultDto;
8926
+ /**
8927
+ * Account not found
8928
+ */
8929
+ 404: unknown;
8930
+ };
8931
+ };
8932
+ };
8933
+ '/api/v1/{region}/bean/reconciliations/assert': {
8934
+ post: {
8935
+ req: ReconciliationControllerAssertData;
8936
+ res: {
8937
+ /**
8938
+ * Balance assertion recorded
8939
+ */
8940
+ 201: ReconciliationRecordDto;
8941
+ /**
8942
+ * Account not found
8943
+ */
8944
+ 404: unknown;
8945
+ };
8946
+ };
8947
+ };
8948
+ '/api/v1/{region}/bean/reconciliations/pad': {
8949
+ post: {
8950
+ req: ReconciliationControllerPadData;
8951
+ res: {
8952
+ /**
8953
+ * Pad adjusting entry generated
8954
+ */
8955
+ 201: PadResultDto;
8956
+ /**
8957
+ * Book already within tolerance — no pad needed
8958
+ */
8959
+ 400: unknown;
8960
+ /**
8961
+ * Account not found
8962
+ */
8963
+ 404: unknown;
8964
+ };
8965
+ };
8966
+ };
8967
+ '/api/v1/{region}/bean/accounts/{accountId}/reconciliations': {
8968
+ get: {
8969
+ req: ReconciliationControllerHistoryData;
8970
+ res: {
8971
+ /**
8972
+ * Reconciliation history
8973
+ */
8974
+ 200: Array<ReconciliationRecordDto>;
8975
+ /**
8976
+ * Account not found
8977
+ */
8978
+ 404: unknown;
8979
+ };
8980
+ };
8981
+ };
7889
8982
  '/api/v1/{region}/bean/export/beancount': {
7890
8983
  get: {
7891
8984
  res: {
@@ -8036,128 +9129,104 @@ export type $OpenApiTs = {
8036
9129
  };
8037
9130
  };
8038
9131
  };
8039
- '/api/v1/bean/platforms': {
8040
- get: {
9132
+ '/api/v1/{region}/bean/import/provider/{providerName}/sync': {
9133
+ post: {
9134
+ req: ProviderSyncControllerSyncData;
8041
9135
  res: {
8042
9136
  /**
8043
- * List of platforms with binding and account counts
9137
+ * Sync completed successfully
8044
9138
  */
8045
- 200: unknown;
8046
- };
8047
- };
8048
- post: {
8049
- req: PlatformControllerCreateData;
8050
- res: {
9139
+ 200: ProviderSyncResponseDto;
8051
9140
  /**
8052
- * Platform created successfully
9141
+ * Invalid request data
8053
9142
  */
8054
- 201: unknown;
9143
+ 400: unknown;
8055
9144
  /**
8056
- * Platform already exists
9145
+ * Missing or invalid authentication
8057
9146
  */
8058
- 409: unknown;
8059
- };
8060
- };
8061
- };
8062
- '/api/v1/bean/platforms/list': {
8063
- get: {
8064
- res: {
9147
+ 401: unknown;
8065
9148
  /**
8066
- * List of platforms with user binding status
9149
+ * Provider not supported
8067
9150
  */
8068
- 200: unknown;
9151
+ 404: unknown;
8069
9152
  };
8070
9153
  };
8071
9154
  };
8072
- '/api/v1/bean/platforms/match': {
9155
+ '/api/v1/{region}/bean/import/provider/supported': {
8073
9156
  get: {
8074
- req: PlatformControllerMatchPlatformsData;
9157
+ req: ProviderSyncControllerGetSupportedProvidersData;
8075
9158
  res: {
8076
9159
  /**
8077
- * List of matching platforms with suggested segment names
9160
+ * List of supported providers
8078
9161
  */
8079
- 200: unknown;
9162
+ 200: SupportedProvidersResponseDto;
9163
+ /**
9164
+ * Missing or invalid authentication
9165
+ */
9166
+ 401: unknown;
8080
9167
  };
8081
9168
  };
8082
9169
  };
8083
- '/api/v1/bean/platforms/{id}': {
8084
- put: {
8085
- req: PlatformControllerUpdateData;
9170
+ '/api/v1/{region}/bean/import/provider/{providerName}/supported': {
9171
+ get: {
9172
+ req: ProviderSyncControllerIsProviderSupportedData;
8086
9173
  res: {
8087
9174
  /**
8088
- * Platform updated successfully
9175
+ * Provider support status
8089
9176
  */
8090
9177
  200: unknown;
8091
9178
  /**
8092
- * Platform not found
9179
+ * Missing or invalid authentication
8093
9180
  */
8094
- 404: unknown;
9181
+ 401: unknown;
8095
9182
  };
8096
9183
  };
8097
- delete: {
8098
- req: PlatformControllerDeleteData;
9184
+ };
9185
+ '/api/v1/{region}/bean/external-account-links': {
9186
+ post: {
9187
+ req: ExternalAccountLinkControllerCreateData;
8099
9188
  res: {
8100
9189
  /**
8101
- * Platform deleted successfully
9190
+ * Link created.
8102
9191
  */
8103
- 204: void;
9192
+ 201: ExternalAccountLinkResponseDto;
8104
9193
  /**
8105
- * Platform not found
9194
+ * beanAccountId not owned, or an active link already exists.
8106
9195
  */
8107
- 404: unknown;
9196
+ 422: unknown;
8108
9197
  };
8109
9198
  };
8110
- };
8111
- '/api/v1/{region}/bean/import/provider/{providerName}/sync': {
8112
- post: {
8113
- req: ProviderSyncControllerSyncData;
9199
+ get: {
9200
+ req: ExternalAccountLinkControllerFindAllData;
8114
9201
  res: {
8115
9202
  /**
8116
- * Sync completed successfully
9203
+ * Links retrieved.
8117
9204
  */
8118
- 200: ProviderSyncResponseDto;
8119
- /**
8120
- * Invalid request data
8121
- */
8122
- 400: unknown;
8123
- /**
8124
- * Missing or invalid authentication
8125
- */
8126
- 401: unknown;
8127
- /**
8128
- * Provider not supported
8129
- */
8130
- 404: unknown;
9205
+ 200: ExternalAccountLinkListResponseDto;
8131
9206
  };
8132
9207
  };
8133
9208
  };
8134
- '/api/v1/{region}/bean/import/provider/supported': {
9209
+ '/api/v1/{region}/bean/external-account-links/{id}': {
8135
9210
  get: {
8136
- req: ProviderSyncControllerGetSupportedProvidersData;
9211
+ req: ExternalAccountLinkControllerFindOneData;
8137
9212
  res: {
8138
9213
  /**
8139
- * List of supported providers
9214
+ * Link retrieved.
8140
9215
  */
8141
- 200: SupportedProvidersResponseDto;
9216
+ 200: ExternalAccountLinkResponseDto;
8142
9217
  /**
8143
- * Missing or invalid authentication
9218
+ * Link not found or not owned by the user.
8144
9219
  */
8145
- 401: unknown;
9220
+ 422: unknown;
8146
9221
  };
8147
9222
  };
8148
- };
8149
- '/api/v1/{region}/bean/import/provider/{providerName}/supported': {
8150
- get: {
8151
- req: ProviderSyncControllerIsProviderSupportedData;
9223
+ delete: {
9224
+ req: ExternalAccountLinkControllerRemoveData;
8152
9225
  res: {
8153
9226
  /**
8154
- * Provider support status
9227
+ * Link soft-deleted; historical transactions are unaffected.
8155
9228
  */
8156
- 200: unknown;
8157
- /**
8158
- * Missing or invalid authentication
8159
- */
8160
- 401: unknown;
9229
+ 204: void;
8161
9230
  };
8162
9231
  };
8163
9232
  };
@@ -8249,6 +9318,78 @@ export type $OpenApiTs = {
8249
9318
  };
8250
9319
  };
8251
9320
  };
9321
+ '/api/v1/bean/platforms': {
9322
+ get: {
9323
+ res: {
9324
+ /**
9325
+ * List of platforms with binding and account counts
9326
+ */
9327
+ 200: unknown;
9328
+ };
9329
+ };
9330
+ post: {
9331
+ req: PlatformControllerCreateData;
9332
+ res: {
9333
+ /**
9334
+ * Platform created successfully
9335
+ */
9336
+ 201: unknown;
9337
+ /**
9338
+ * Platform already exists
9339
+ */
9340
+ 409: unknown;
9341
+ };
9342
+ };
9343
+ };
9344
+ '/api/v1/bean/platforms/list': {
9345
+ get: {
9346
+ res: {
9347
+ /**
9348
+ * List of platforms with user binding status
9349
+ */
9350
+ 200: unknown;
9351
+ };
9352
+ };
9353
+ };
9354
+ '/api/v1/bean/platforms/match': {
9355
+ get: {
9356
+ req: PlatformControllerMatchPlatformsData;
9357
+ res: {
9358
+ /**
9359
+ * List of matching platforms with suggested segment names
9360
+ */
9361
+ 200: unknown;
9362
+ };
9363
+ };
9364
+ };
9365
+ '/api/v1/bean/platforms/{id}': {
9366
+ put: {
9367
+ req: PlatformControllerUpdateData;
9368
+ res: {
9369
+ /**
9370
+ * Platform updated successfully
9371
+ */
9372
+ 200: unknown;
9373
+ /**
9374
+ * Platform not found
9375
+ */
9376
+ 404: unknown;
9377
+ };
9378
+ };
9379
+ delete: {
9380
+ req: PlatformControllerDeleteData;
9381
+ res: {
9382
+ /**
9383
+ * Platform deleted successfully
9384
+ */
9385
+ 204: void;
9386
+ /**
9387
+ * Platform not found
9388
+ */
9389
+ 404: unknown;
9390
+ };
9391
+ };
9392
+ };
8252
9393
  '/api/v1/{region}/dashboard/net-worth': {
8253
9394
  get: {
8254
9395
  req: DashboardControllerGetNetWorthData;
@@ -8301,16 +9442,16 @@ export type $OpenApiTs = {
8301
9442
  };
8302
9443
  };
8303
9444
  };
8304
- '/api/v1/{region}/investment/holdings/pnl': {
9445
+ '/api/v1/{region}/dashboard/expenses': {
8305
9446
  get: {
8306
- req: HoldingPnlControllerGetHoldingPnlData;
9447
+ req: DashboardControllerGetExpensesData;
8307
9448
  res: {
8308
9449
  /**
8309
- * Holding P&L retrieved successfully
9450
+ * Expenses retrieved successfully
8310
9451
  */
8311
- 200: HoldingPnlResponseDto;
9452
+ 200: ExpensesByCategoryResponseDto;
8312
9453
  /**
8313
- * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
9454
+ * Invalid groupBy or period
8314
9455
  */
8315
9456
  400: unknown;
8316
9457
  /**
@@ -8320,98 +9461,48 @@ export type $OpenApiTs = {
8320
9461
  };
8321
9462
  };
8322
9463
  };
8323
- '/api/v1/{region}/bean/prices': {
8324
- post: {
8325
- req: PriceControllerCreateData;
9464
+ '/api/v1/{region}/investment/holdings/pnl': {
9465
+ get: {
9466
+ req: HoldingPnlControllerGetHoldingPnlData;
8326
9467
  res: {
8327
9468
  /**
8328
- * Price created successfully
8329
- */
8330
- 201: PriceResponseDto;
8331
- /**
8332
- * Currency or quoteCurrency commodity not found
9469
+ * Holding P&L retrieved successfully
8333
9470
  */
8334
- 404: unknown;
9471
+ 200: HoldingPnlResponseDto;
8335
9472
  /**
8336
- * Price already exists for this currency pair and date
9473
+ * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
8337
9474
  */
8338
- 409: unknown;
8339
- };
8340
- };
8341
- get: {
8342
- req: PriceControllerFindAllData;
8343
- res: {
9475
+ 400: unknown;
8344
9476
  /**
8345
- * Prices retrieved successfully
9477
+ * User not authenticated
8346
9478
  */
8347
- 200: PriceListResponseDto;
9479
+ 401: unknown;
8348
9480
  };
8349
9481
  };
8350
9482
  };
8351
- '/api/v1/{region}/bean/prices/{id}': {
9483
+ '/api/v1/{region}/reporting/portfolio/trends': {
8352
9484
  get: {
8353
- req: PriceControllerFindOneData;
8354
- res: {
8355
- /**
8356
- * Price retrieved successfully
8357
- */
8358
- 200: PriceResponseDto;
8359
- /**
8360
- * Price not found
8361
- */
8362
- 404: unknown;
8363
- };
8364
- };
8365
- put: {
8366
- req: PriceControllerUpdateData;
8367
- res: {
8368
- /**
8369
- * Price updated successfully
8370
- */
8371
- 200: PriceResponseDto;
8372
- /**
8373
- * Price not found
8374
- */
8375
- 404: unknown;
8376
- /**
8377
- * Updated price conflicts with existing price
8378
- */
8379
- 409: unknown;
8380
- };
8381
- };
8382
- delete: {
8383
- req: PriceControllerDeleteData;
9485
+ req: ReportingControllerGetPortfolioTrendsData;
8384
9486
  res: {
8385
9487
  /**
8386
- * Price deleted successfully
8387
- */
8388
- 204: void;
8389
- /**
8390
- * Price not found
9488
+ * Trends retrieved successfully
8391
9489
  */
8392
- 404: unknown;
8393
- };
8394
- };
8395
- };
8396
- '/api/v1/{region}/bean/prices/bulk': {
8397
- post: {
8398
- req: PriceControllerBulkCreateData;
8399
- res: {
9490
+ 200: PortfolioTrendsResponseDto;
8400
9491
  /**
8401
- * Prices created successfully
9492
+ * User not authenticated
8402
9493
  */
8403
- 201: Array<PriceResponseDto>;
9494
+ 401: unknown;
8404
9495
  };
8405
9496
  };
8406
9497
  };
8407
- '/api/v1/{region}/reporting/portfolio/trends': {
9498
+ '/api/v1/{region}/reporting/cash-flow/trends': {
8408
9499
  get: {
8409
- req: ReportingControllerGetPortfolioTrendsData;
9500
+ req: ReportingControllerGetCashFlowTrendsData;
8410
9501
  res: {
8411
9502
  /**
8412
- * Trends retrieved successfully
9503
+ * Cash-flow trends retrieved successfully
8413
9504
  */
8414
- 200: PortfolioTrendsResponseDto;
9505
+ 200: CashFlowTrendsResponseDto;
8415
9506
  /**
8416
9507
  * User not authenticated
8417
9508
  */