@firela/api-types 0.0.0-canary.2b8fcbd8 → 0.0.0-canary.2d71872c

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
  */
@@ -848,6 +842,51 @@ export type flag2 =
848
842
  */
849
843
  export type status2 = 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
850
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
+
851
890
  export type TransactionListResponseDto = {
852
891
  /**
853
892
  * List of transactions
@@ -865,6 +904,10 @@ export type TransactionListResponseDto = {
865
904
  * Number of items skipped
866
905
  */
867
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;
868
911
  };
869
912
 
870
913
  export type TagSuggestionDto = {
@@ -1917,6 +1960,108 @@ export type UpdateCommodityDto = {
1917
1960
  };
1918
1961
  };
1919
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
+
1920
2065
  export type CreateRecurringRuleDto = {
1921
2066
  /**
1922
2067
  * Rule name (unique per user)
@@ -3029,85 +3174,329 @@ export type UpdatePropertyDto = {
3029
3174
  value: string;
3030
3175
  };
3031
3176
 
3032
- export type FileImportDto = {
3177
+ export type CreateBeanEventDto = {
3033
3178
  /**
3034
- * Bill file to import (CSV, PDF, OFX, etc.)
3179
+ * Life event date (ISO 8601)
3035
3180
  */
3036
- file: Blob | File;
3037
- };
3038
-
3039
- export type ImportErrorDto = {
3181
+ date: string;
3040
3182
  /**
3041
- * 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
3042
3184
  */
3043
- index: number;
3185
+ type: string;
3044
3186
  /**
3045
- * Error message
3187
+ * Life event description. Empty string is a VALID value (distinct from absence).
3046
3188
  */
3047
- 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
+ };
3048
3196
  };
3049
3197
 
3050
- export type ReviewItemPreviewDto = {
3198
+ export type EventResponseDto = {
3051
3199
  /**
3052
- * Index in the import batch (for tracking)
3200
+ * Unique identifier
3053
3201
  */
3054
- index: number;
3202
+ id: string;
3055
3203
  /**
3056
- * Transaction date (ISO format)
3204
+ * User ID (owner of the life event)
3057
3205
  */
3058
- date: string;
3206
+ userId: string;
3059
3207
  /**
3060
- * Transaction amount (absolute value)
3208
+ * Life event date (ISO 8601 format)
3061
3209
  */
3062
- amount?: number;
3210
+ date: string;
3063
3211
  /**
3064
- * Currency code
3212
+ * Life event type (user-defined, e.g., "employer", "location")
3065
3213
  */
3066
- currency?: string;
3214
+ type: string;
3067
3215
  /**
3068
- * Transaction narration/description
3216
+ * Life event description. May be an empty string (a valid value distinct from absence).
3069
3217
  */
3070
- narration: string;
3218
+ description: string;
3071
3219
  /**
3072
- * Payee name
3220
+ * Product-side metadata (free-form JSON)
3073
3221
  */
3074
- payee?: string;
3222
+ meta: {
3223
+ [key: string]: unknown;
3224
+ };
3075
3225
  /**
3076
- * Inferred category from rule matching
3226
+ * Creation timestamp
3077
3227
  */
3078
- category?: string;
3228
+ createdAt: string;
3079
3229
  /**
3080
- * Confidence score for the match (0-1)
3230
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3081
3231
  */
3082
- confidence?: number;
3232
+ updatedAt: string;
3233
+ };
3234
+
3235
+ export type EventListResponseDto = {
3083
3236
  /**
3084
- * Type of branch requiring review
3237
+ * List of life events
3085
3238
  */
3086
- branchType?:
3087
- | 'DUPLICATE'
3088
- | 'PAYEE_MATCH'
3089
- | 'RULE_MATCH'
3090
- | 'ACCOUNT_VALIDATION'
3091
- | 'PIPELINE_ERROR';
3239
+ items: Array<EventResponseDto>;
3092
3240
  /**
3093
- * Human-readable reasons for requiring review
3241
+ * Total number of life events matching the query
3094
3242
  */
3095
- reasons?: Array<string>;
3243
+ total: number;
3096
3244
  };
3097
3245
 
3098
- /**
3099
- * Type of branch requiring review
3100
- */
3101
- export type branchType =
3102
- | 'DUPLICATE'
3103
- | 'PAYEE_MATCH'
3104
- | 'RULE_MATCH'
3105
- | 'ACCOUNT_VALIDATION'
3106
- | 'PIPELINE_ERROR';
3107
-
3108
- export type ImportResultDto = {
3246
+ export type UpdateBeanEventDto = {
3109
3247
  /**
3110
- * Number of successfully imported transactions
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;
3444
+ /**
3445
+ * Transaction date (ISO format)
3446
+ */
3447
+ date: string;
3448
+ /**
3449
+ * Transaction amount (absolute value)
3450
+ */
3451
+ amount?: number;
3452
+ /**
3453
+ * Currency code
3454
+ */
3455
+ currency?: string;
3456
+ /**
3457
+ * Transaction narration/description
3458
+ */
3459
+ narration: string;
3460
+ /**
3461
+ * Payee name
3462
+ */
3463
+ payee?: string;
3464
+ /**
3465
+ * Inferred category from rule matching
3466
+ */
3467
+ category?: string;
3468
+ /**
3469
+ * Confidence score for the match (0-1)
3470
+ */
3471
+ confidence?: number;
3472
+ /**
3473
+ * Type of branch requiring review
3474
+ */
3475
+ branchType?:
3476
+ | 'DUPLICATE'
3477
+ | 'PAYEE_MATCH'
3478
+ | 'RULE_MATCH'
3479
+ | 'ACCOUNT_VALIDATION'
3480
+ | 'PIPELINE_ERROR';
3481
+ /**
3482
+ * Human-readable reasons for requiring review
3483
+ */
3484
+ reasons?: Array<string>;
3485
+ };
3486
+
3487
+ /**
3488
+ * Type of branch requiring review
3489
+ */
3490
+ export type branchType =
3491
+ | 'DUPLICATE'
3492
+ | 'PAYEE_MATCH'
3493
+ | 'RULE_MATCH'
3494
+ | 'ACCOUNT_VALIDATION'
3495
+ | 'PIPELINE_ERROR';
3496
+
3497
+ export type ImportResultDto = {
3498
+ /**
3499
+ * Number of successfully imported transactions
3111
3500
  */
3112
3501
  imported: number;
3113
3502
  /**
@@ -3327,94 +3716,6 @@ export type UpdateImporterConfigDto = {
3327
3716
  data?: UpdateConfigDataDto;
3328
3717
  };
3329
3718
 
3330
- export type CreatePlatformDto = {
3331
- /**
3332
- * Platform name
3333
- */
3334
- name: string;
3335
- /**
3336
- * Platform canonical identifier (lowercase, kebab-case)
3337
- */
3338
- canonical: string;
3339
- /**
3340
- * Platform aliases (multi-language names for lookup)
3341
- */
3342
- aliases: Array<string>;
3343
- /**
3344
- * Platform URL
3345
- */
3346
- url: string;
3347
- /**
3348
- * Platform type
3349
- */
3350
- type:
3351
- | 'BANK'
3352
- | 'BROKERAGE'
3353
- | 'CRYPTO_EXCHANGE'
3354
- | 'PAYMENT'
3355
- | 'INVESTMENT'
3356
- | 'INSURANCE'
3357
- | 'OTHER';
3358
- /**
3359
- * Platform logo URL
3360
- */
3361
- logoUrl?: string;
3362
- /**
3363
- * Whether the platform is active
3364
- */
3365
- isActive?: boolean;
3366
- };
3367
-
3368
- /**
3369
- * Platform type
3370
- */
3371
- export type type3 =
3372
- | 'BANK'
3373
- | 'BROKERAGE'
3374
- | 'CRYPTO_EXCHANGE'
3375
- | 'PAYMENT'
3376
- | 'INVESTMENT'
3377
- | 'INSURANCE'
3378
- | 'OTHER';
3379
-
3380
- export type UpdatePlatformDto = {
3381
- /**
3382
- * Platform name
3383
- */
3384
- name?: string;
3385
- /**
3386
- * Platform canonical identifier (lowercase, kebab-case)
3387
- */
3388
- canonical?: string;
3389
- /**
3390
- * Platform aliases (multi-language names for lookup)
3391
- */
3392
- aliases?: Array<string>;
3393
- /**
3394
- * Platform URL
3395
- */
3396
- url?: string;
3397
- /**
3398
- * Platform type
3399
- */
3400
- type?:
3401
- | 'BANK'
3402
- | 'BROKERAGE'
3403
- | 'CRYPTO_EXCHANGE'
3404
- | 'PAYMENT'
3405
- | 'INVESTMENT'
3406
- | 'INSURANCE'
3407
- | 'OTHER';
3408
- /**
3409
- * Platform logo URL
3410
- */
3411
- logoUrl?: string;
3412
- /**
3413
- * Whether the platform is active
3414
- */
3415
- isActive?: boolean;
3416
- };
3417
-
3418
3719
  export type ProviderSyncConfigDto = {
3419
3720
  /**
3420
3721
  * Source account for the first posting
@@ -3436,6 +3737,10 @@ export type ProviderSyncConfigDto = {
3436
3737
  * Filter pending transactions
3437
3738
  */
3438
3739
  filterPending?: boolean;
3740
+ /**
3741
+ * External account ID for per-batch providers (e.g. GoCardless). Overrides sourceAccount when an ExternalAccountLink mapping exists.
3742
+ */
3743
+ externalAccountId?: string;
3439
3744
  };
3440
3745
 
3441
3746
  export type ProviderSyncDto = {
@@ -3475,20 +3780,75 @@ export type ProviderSyncResponseDto = {
3475
3780
  */
3476
3781
  failed: number;
3477
3782
  /**
3478
- * IDs of successfully imported transactions
3783
+ * IDs of successfully imported transactions
3784
+ */
3785
+ importedTransactionIds?: Array<string>;
3786
+ /**
3787
+ * IDs of review items created for branched transactions
3788
+ */
3789
+ reviewItemIds?: Array<string>;
3790
+ };
3791
+
3792
+ export type SupportedProvidersResponseDto = {
3793
+ /**
3794
+ * List of supported provider names
3795
+ */
3796
+ providers: Array<string>;
3797
+ };
3798
+
3799
+ export type CreateExternalAccountLinkDto = {
3800
+ /**
3801
+ * Open Banking provider (whitelist)
3802
+ */
3803
+ provider:
3804
+ | 'plaid'
3805
+ | 'teller'
3806
+ | 'truelayer'
3807
+ | 'gocardless'
3808
+ | 'simplefin'
3809
+ | 'yodlee'
3810
+ | 'beancount-direct'
3811
+ | 'parsed-bill';
3812
+ /**
3813
+ * External account ID from the provider
3479
3814
  */
3480
- importedTransactionIds?: Array<string>;
3815
+ externalAccountId: string;
3481
3816
  /**
3482
- * IDs of review items created for branched transactions
3817
+ * Target BeanAccount ID (must belong to the JWT user)
3483
3818
  */
3484
- reviewItemIds?: Array<string>;
3819
+ beanAccountId: string;
3485
3820
  };
3486
3821
 
3487
- 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;
3488
3848
  /**
3489
- * List of supported provider names
3849
+ * Filter by provider (query param)
3490
3850
  */
3491
- providers: Array<string>;
3851
+ provider?: string;
3492
3852
  };
3493
3853
 
3494
3854
  export type ParserTelemetryReportDto = unknown;
@@ -4070,15 +4430,134 @@ export type liabilitySubType = 'borrow' | 'repay';
4070
4430
  */
4071
4431
  export type equitySubType = 'opening' | 'adjustment';
4072
4432
 
4073
- export type BalanceByCurrencyDto = {
4433
+ export type PlatformListItemDto = {
4074
4434
  /**
4075
- * ISO 4217 currency code
4435
+ * Global platform ID
4076
4436
  */
4077
- currency: string;
4437
+ id: string;
4078
4438
  /**
4079
- * Balance amount
4439
+ * Platform name
4080
4440
  */
4081
- balance: string;
4441
+ name: string;
4442
+ /**
4443
+ * Platform URL
4444
+ */
4445
+ url: string;
4446
+ /**
4447
+ * Platform type
4448
+ */
4449
+ type:
4450
+ | 'BANK'
4451
+ | 'BROKERAGE'
4452
+ | 'CRYPTO_EXCHANGE'
4453
+ | 'PAYMENT'
4454
+ | 'INVESTMENT'
4455
+ | 'INSURANCE'
4456
+ | 'OTHER';
4457
+ /**
4458
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
4459
+ */
4460
+ canonical: string;
4461
+ /**
4462
+ * Suggested path segment — canonical with first char uppercased (ACC_COMP_NAME_RE)
4463
+ */
4464
+ suggestedSegment: string;
4465
+ /**
4466
+ * Logo URL
4467
+ */
4468
+ logoUrl: string | null;
4469
+ /**
4470
+ * Whether user has accounts using this platform
4471
+ */
4472
+ isBound: boolean;
4473
+ };
4474
+
4475
+ /**
4476
+ * Platform type
4477
+ */
4478
+ export type type3 =
4479
+ | 'BANK'
4480
+ | 'BROKERAGE'
4481
+ | 'CRYPTO_EXCHANGE'
4482
+ | 'PAYMENT'
4483
+ | 'INVESTMENT'
4484
+ | 'INSURANCE'
4485
+ | 'OTHER';
4486
+
4487
+ export type CreatePlatformDto = {
4488
+ /**
4489
+ * Platform name
4490
+ */
4491
+ name: string;
4492
+ /**
4493
+ * Platform canonical identifier (lowercase, kebab-case)
4494
+ */
4495
+ canonical: string;
4496
+ /**
4497
+ * Platform aliases (multi-language names for lookup)
4498
+ */
4499
+ aliases: Array<string>;
4500
+ /**
4501
+ * Platform URL
4502
+ */
4503
+ url: string;
4504
+ /**
4505
+ * Platform type
4506
+ */
4507
+ type:
4508
+ | 'BANK'
4509
+ | 'BROKERAGE'
4510
+ | 'CRYPTO_EXCHANGE'
4511
+ | 'PAYMENT'
4512
+ | 'INVESTMENT'
4513
+ | 'INSURANCE'
4514
+ | 'OTHER';
4515
+ /**
4516
+ * Platform logo URL
4517
+ */
4518
+ logoUrl?: string;
4519
+ /**
4520
+ * Whether the platform is active
4521
+ */
4522
+ isActive?: boolean;
4523
+ };
4524
+
4525
+ export type UpdatePlatformDto = {
4526
+ /**
4527
+ * Platform name
4528
+ */
4529
+ name?: string;
4530
+ /**
4531
+ * Platform canonical identifier (lowercase, kebab-case)
4532
+ */
4533
+ canonical?: string;
4534
+ /**
4535
+ * Platform aliases (multi-language names for lookup)
4536
+ */
4537
+ aliases?: Array<string>;
4538
+ /**
4539
+ * Platform URL
4540
+ */
4541
+ url?: string;
4542
+ /**
4543
+ * Platform type
4544
+ */
4545
+ type?:
4546
+ | 'BANK'
4547
+ | 'BROKERAGE'
4548
+ | 'CRYPTO_EXCHANGE'
4549
+ | 'PAYMENT'
4550
+ | 'INVESTMENT'
4551
+ | 'INSURANCE'
4552
+ | 'OTHER';
4553
+ /**
4554
+ * Platform logo URL
4555
+ */
4556
+ logoUrl?: string;
4557
+ /**
4558
+ * Whether the platform is active
4559
+ */
4560
+ isActive?: boolean;
4082
4561
  };
4083
4562
 
4084
4563
  export type NetWorthByCurrencyDto = {
@@ -4121,21 +4600,6 @@ export type ConvertedNetWorthDto = {
4121
4600
  };
4122
4601
  };
4123
4602
 
4124
- export type ExchangeRateWarningDto = {
4125
- /**
4126
- * Warning type
4127
- */
4128
- type: string;
4129
- /**
4130
- * Currency without exchange rate
4131
- */
4132
- currency: string;
4133
- /**
4134
- * Total amount affected
4135
- */
4136
- totalAmount: string;
4137
- };
4138
-
4139
4603
  export type NetWorthResponseDto = {
4140
4604
  /**
4141
4605
  * Total net worth (assets - liabilities, converted to base currency)
@@ -4200,6 +4664,10 @@ export type AccountItemDto = {
4200
4664
  * Currency code
4201
4665
  */
4202
4666
  currency: string;
4667
+ /**
4668
+ * FX-converted balance in base currency; omitted when not convertible
4669
+ */
4670
+ convertedBalance?: string;
4203
4671
  };
4204
4672
 
4205
4673
  export type PlatformGroupDto = {
@@ -4216,9 +4684,40 @@ export type PlatformGroupDto = {
4216
4684
  */
4217
4685
  accounts: Array<AccountItemDto>;
4218
4686
  /**
4219
- * Total balance across all accounts in platform
4687
+ * FX-converted total balance in base currency
4220
4688
  */
4221
4689
  totalBalance: string;
4690
+ /**
4691
+ * Raw (unconverted) balances grouped by currency
4692
+ */
4693
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4694
+ /**
4695
+ * Converted balance in base currency (omitted when no currency is convertible)
4696
+ */
4697
+ convertedBalance?: string;
4698
+ /**
4699
+ * Share of the grand converted total (0-100); 0 when grand total is 0
4700
+ */
4701
+ sharePct: number;
4702
+ };
4703
+
4704
+ export type AccountExchangeRateWarningDto = {
4705
+ /**
4706
+ * Warning type
4707
+ */
4708
+ type: string;
4709
+ /**
4710
+ * Currency without exchange rate
4711
+ */
4712
+ currency: string;
4713
+ /**
4714
+ * Affected account paths
4715
+ */
4716
+ accounts: Array<string>;
4717
+ /**
4718
+ * Total amount in this currency
4719
+ */
4720
+ totalAmount: string;
4222
4721
  };
4223
4722
 
4224
4723
  export type AccountsSummaryDto = {
@@ -4230,6 +4729,14 @@ export type AccountsSummaryDto = {
4230
4729
  * Total number of platforms
4231
4730
  */
4232
4731
  totalPlatforms: number;
4732
+ /**
4733
+ * Base currency for conversion
4734
+ */
4735
+ baseCurrency: string;
4736
+ /**
4737
+ * Per-account exchange rate warnings
4738
+ */
4739
+ warnings?: Array<AccountExchangeRateWarningDto>;
4233
4740
  };
4234
4741
 
4235
4742
  export type AccountsResponseDto = {
@@ -4264,6 +4771,10 @@ export type AccountItemWithAssetClassDto = {
4264
4771
  * Currency code
4265
4772
  */
4266
4773
  currency: string;
4774
+ /**
4775
+ * FX-converted balance in base currency; omitted when not convertible
4776
+ */
4777
+ convertedBalance?: string;
4267
4778
  /**
4268
4779
  * Asset class
4269
4780
  */
@@ -4345,25 +4856,6 @@ export type assetClass =
4345
4856
  | 'REAL_ESTATE'
4346
4857
  | 'INDEX';
4347
4858
 
4348
- export type AccountExchangeRateWarningDto = {
4349
- /**
4350
- * Warning type
4351
- */
4352
- type: string;
4353
- /**
4354
- * Currency without exchange rate
4355
- */
4356
- currency: string;
4357
- /**
4358
- * Affected account paths
4359
- */
4360
- accounts: Array<string>;
4361
- /**
4362
- * Total amount in this currency
4363
- */
4364
- totalAmount: string;
4365
- };
4366
-
4367
4859
  export type AssetClassSummaryDto = {
4368
4860
  /**
4369
4861
  * Total number of accounts
@@ -4520,11 +5012,68 @@ export type CashFlowResponseDto = {
4520
5012
  */
4521
5013
  byCurrency?: CashFlowByCurrencyDto;
4522
5014
  /**
4523
- * Converted values in base currency
5015
+ * Converted values in base currency
5016
+ */
5017
+ converted?: ConvertedCashFlowDto;
5018
+ /**
5019
+ * Exchange rate warnings
5020
+ */
5021
+ warnings?: Array<ExchangeRateWarningDto>;
5022
+ };
5023
+
5024
+ export type CategoryGroupDto = {
5025
+ /**
5026
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
5027
+ */
5028
+ category: string;
5029
+ /**
5030
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
5031
+ */
5032
+ totalExpense: string;
5033
+ /**
5034
+ * Share of grand total (0-100); 0 when grand total is 0
5035
+ */
5036
+ sharePct: number;
5037
+ /**
5038
+ * Raw (unconverted) expense per currency
5039
+ */
5040
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
5041
+ /**
5042
+ * Converted total in base currency (omitted when FX missing for all currencies in this category)
5043
+ */
5044
+ convertedBalance?: string;
5045
+ };
5046
+
5047
+ export type ExpensesByCategorySummaryDto = {
5048
+ /**
5049
+ * Total across all categories, converted (convertible categories only); expense totals when flow=expense, income totals when flow=income
5050
+ */
5051
+ totalExpense: string;
5052
+ /**
5053
+ * Number of categories
5054
+ */
5055
+ categoryCount: number;
5056
+ };
5057
+
5058
+ export type ExpensesByCategoryResponseDto = {
5059
+ /**
5060
+ * Period requested
5061
+ */
5062
+ period: string;
5063
+ /**
5064
+ * Base currency for converted values
5065
+ */
5066
+ baseCurrency: string;
5067
+ /**
5068
+ * Expense groups by functional category, sorted by converted total desc
5069
+ */
5070
+ groups: Array<CategoryGroupDto>;
5071
+ /**
5072
+ * Summary statistics
4524
5073
  */
4525
- converted?: ConvertedCashFlowDto;
5074
+ summary: ExpensesByCategorySummaryDto;
4526
5075
  /**
4527
- * Exchange rate warnings
5076
+ * Exchange rate warnings (e.g. missing rate for a currency)
4528
5077
  */
4529
5078
  warnings?: Array<ExchangeRateWarningDto>;
4530
5079
  };
@@ -4724,108 +5273,6 @@ export type HoldingPnlResponseDto = {
4724
5273
  */
4725
5274
  export type method = 'average' | 'FIFO';
4726
5275
 
4727
- export type CreateBeanPriceDto = {
4728
- /**
4729
- * Currency being priced (e.g., USD, AAPL, BTC)
4730
- */
4731
- currency: string;
4732
- /**
4733
- * Quote currency (pricing currency, e.g., CNY, EUR)
4734
- */
4735
- quoteCurrency: string;
4736
- /**
4737
- * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
4738
- */
4739
- amount: number;
4740
- /**
4741
- * Price date (ISO 8601 format)
4742
- */
4743
- date: string;
4744
- /**
4745
- * Metadata (validated by Zod schema, max field lengths enforced)
4746
- */
4747
- metadata?: {
4748
- [key: string]: unknown;
4749
- };
4750
- };
4751
-
4752
- export type PriceResponseDto = {
4753
- /**
4754
- * Unique identifier
4755
- */
4756
- id: string;
4757
- /**
4758
- * User ID (owner of the price)
4759
- */
4760
- userId: string;
4761
- /**
4762
- * Currency being priced (e.g., USD, AAPL, BTC)
4763
- */
4764
- currency: string;
4765
- /**
4766
- * Quote currency (pricing currency, e.g., USD, CNY)
4767
- */
4768
- quoteCurrency: string;
4769
- /**
4770
- * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
4771
- */
4772
- amount: number;
4773
- /**
4774
- * Price date (ISO 8601 format). Represents the date this price was valid.
4775
- */
4776
- date: string;
4777
- /**
4778
- * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
4779
- */
4780
- meta: {
4781
- [key: string]: unknown;
4782
- };
4783
- /**
4784
- * Creation timestamp
4785
- */
4786
- createdAt: string;
4787
- /**
4788
- * Last update timestamp
4789
- */
4790
- updatedAt: string;
4791
- };
4792
-
4793
- export type PriceListResponseDto = {
4794
- /**
4795
- * List of prices
4796
- */
4797
- items: Array<PriceResponseDto>;
4798
- /**
4799
- * Total number of prices
4800
- */
4801
- total: number;
4802
- };
4803
-
4804
- export type UpdateBeanPriceDto = {
4805
- /**
4806
- * Currency being priced
4807
- */
4808
- currency?: string;
4809
- /**
4810
- * Quote currency (pricing currency)
4811
- */
4812
- quoteCurrency?: string;
4813
- /**
4814
- * Price amount (MUST be >= 0 per Beancount spec)
4815
- */
4816
- amount?: number;
4817
- /**
4818
- * Price date (ISO 8601 format)
4819
- */
4820
- date?: string;
4821
- /**
4822
- * Metadata
4823
- */
4824
- metadata?: {
4825
- [key: string]: unknown;
4826
- };
4827
- };
4828
-
4829
5276
  export type CurrencyBalanceDto = {
4830
5277
  /**
4831
5278
  * ISO 4217 currency code
@@ -4852,6 +5299,14 @@ export type TimeSeriesPointDto = {
4852
5299
  change?: {
4853
5300
  [key: string]: unknown;
4854
5301
  };
5302
+ /**
5303
+ * Total assets at this date (in base currency)
5304
+ */
5305
+ assets?: string;
5306
+ /**
5307
+ * Total liabilities at this date (in base currency)
5308
+ */
5309
+ liabilities?: string;
4855
5310
  /**
4856
5311
  * Multi-currency breakdown for this point
4857
5312
  */
@@ -4919,6 +5374,71 @@ export type PortfolioTrendsResponseDto = {
4919
5374
  warnings?: Array<ExchangeRateWarningDto>;
4920
5375
  };
4921
5376
 
5377
+ export type CashFlowPointDto = {
5378
+ /**
5379
+ * Month key (YYYY-MM)
5380
+ */
5381
+ month: string;
5382
+ /**
5383
+ * Income in base currency (absolute, converted)
5384
+ */
5385
+ income: string;
5386
+ /**
5387
+ * Expense in base currency (absolute, converted)
5388
+ */
5389
+ expense: string;
5390
+ /**
5391
+ * netSavings = income − expense (savings positive)
5392
+ */
5393
+ netSavings: string;
5394
+ };
5395
+
5396
+ export type CashFlowTrendSummaryDto = {
5397
+ /**
5398
+ * Total income across the period
5399
+ */
5400
+ totalIncome: string;
5401
+ /**
5402
+ * Total expense across the period
5403
+ */
5404
+ totalExpense: string;
5405
+ /**
5406
+ * income − expense across the period
5407
+ */
5408
+ totalNetSavings: string;
5409
+ /**
5410
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
5411
+ */
5412
+ averageMonthlyNetSavings: string;
5413
+ };
5414
+
5415
+ export type CashFlowTrendsResponseDto = {
5416
+ /**
5417
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
5418
+ */
5419
+ series: Array<CashFlowPointDto>;
5420
+ /**
5421
+ * Period totals
5422
+ */
5423
+ summary: CashFlowTrendSummaryDto;
5424
+ /**
5425
+ * Period requested
5426
+ */
5427
+ period: string;
5428
+ /**
5429
+ * Data granularity (v1 returns month buckets)
5430
+ */
5431
+ granularity: string;
5432
+ /**
5433
+ * Base currency for converted values
5434
+ */
5435
+ currency: string;
5436
+ /**
5437
+ * Exchange rate warnings (e.g. missing rate for a currency)
5438
+ */
5439
+ warnings?: Array<ExchangeRateWarningDto>;
5440
+ };
5441
+
4922
5442
  export type GenerateSnapshotBody = unknown;
4923
5443
 
4924
5444
  export type GenerateSnapshotResponse = unknown;
@@ -4962,7 +5482,7 @@ export type AccountControllerFindAllData = {
4962
5482
  */
4963
5483
  region: 'cn' | 'us' | 'de' | 'gb';
4964
5484
  /**
4965
- * Search term for path or i18nKey
5485
+ * Search term for account path
4966
5486
  */
4967
5487
  search?: string;
4968
5488
  /**
@@ -5045,6 +5565,21 @@ export type AccountControllerReopenData = {
5045
5565
 
5046
5566
  export type AccountControllerReopenResponse = AccountResponseDto;
5047
5567
 
5568
+ export type AccountControllerAddOpeningBalanceData = {
5569
+ /**
5570
+ * Account UUID
5571
+ */
5572
+ id: string;
5573
+ /**
5574
+ * Region code for tenant context
5575
+ */
5576
+ region: 'cn' | 'us' | 'de' | 'gb';
5577
+ requestBody: CreateOpeningBalanceDto;
5578
+ };
5579
+
5580
+ export type AccountControllerAddOpeningBalanceResponse =
5581
+ OpeningBalanceResultDto;
5582
+
5048
5583
  export type AccountStandardsControllerGetTemplatesData = {
5049
5584
  /**
5050
5585
  * Region code (cn, us, de)
@@ -5105,6 +5640,10 @@ export type TransactionControllerListData = {
5105
5640
  * Filter by account ID (transactions with postings to this account)
5106
5641
  */
5107
5642
  accountId?: string;
5643
+ /**
5644
+ * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
5645
+ */
5646
+ category?: string;
5108
5647
  /**
5109
5648
  * Filter by start date (inclusive), format: YYYY-MM-DD
5110
5649
  */
@@ -5229,7 +5768,7 @@ export type TransactionControllerDeleteResponse = void;
5229
5768
 
5230
5769
  export type BalanceControllerGetBalanceData = {
5231
5770
  /**
5232
- * Account name (e.g., "Assets:Bank:Checking")
5771
+ * Account name (e.g., "Assets:Checking")
5233
5772
  */
5234
5773
  account: string;
5235
5774
  /**
@@ -5542,94 +6081,191 @@ export type PayeeProfileAdminControllerUnverifyData = {
5542
6081
  export type PayeeProfileAdminControllerUnverifyResponse =
5543
6082
  PayeeProfileResponseDto;
5544
6083
 
5545
- export type CommodityControllerCreateData = {
6084
+ export type CommodityControllerCreateData = {
6085
+ /**
6086
+ * Region code for tenant context
6087
+ */
6088
+ region: 'cn' | 'us' | 'de' | 'gb';
6089
+ requestBody: CreateCommodityDto;
6090
+ };
6091
+
6092
+ export type CommodityControllerCreateResponse = CommodityResponseDto;
6093
+
6094
+ export type CommodityControllerFindAllData = {
6095
+ /**
6096
+ * Region code for tenant context
6097
+ */
6098
+ region: 'cn' | 'us' | 'de' | 'gb';
6099
+ /**
6100
+ * Search term for symbol or metadata fields (partial match). Searches symbol and metadata.name.
6101
+ */
6102
+ search?: string;
6103
+ /**
6104
+ * Filter by exact symbol match
6105
+ */
6106
+ symbol?: string;
6107
+ };
6108
+
6109
+ export type CommodityControllerFindAllResponse = CommodityListResponseDto;
6110
+
6111
+ export type CommodityControllerFindOneData = {
6112
+ /**
6113
+ * Region code for tenant context
6114
+ */
6115
+ region: 'cn' | 'us' | 'de' | 'gb';
6116
+ /**
6117
+ * Commodity symbol
6118
+ */
6119
+ symbol: string;
6120
+ };
6121
+
6122
+ export type CommodityControllerFindOneResponse = CommodityResponseDto;
6123
+
6124
+ export type CommodityControllerUpdateData = {
6125
+ /**
6126
+ * Region code for tenant context
6127
+ */
6128
+ region: 'cn' | 'us' | 'de' | 'gb';
6129
+ requestBody: UpdateCommodityDto;
6130
+ /**
6131
+ * Commodity symbol
6132
+ */
6133
+ symbol: string;
6134
+ };
6135
+
6136
+ export type CommodityControllerUpdateResponse = CommodityResponseDto;
6137
+
6138
+ export type CommodityControllerDeleteData = {
6139
+ /**
6140
+ * Region code for tenant context
6141
+ */
6142
+ region: 'cn' | 'us' | 'de' | 'gb';
6143
+ /**
6144
+ * Commodity symbol
6145
+ */
6146
+ symbol: string;
6147
+ };
6148
+
6149
+ export type CommodityControllerDeleteResponse = void;
6150
+
6151
+ export type CommodityControllerGetOrCreateData = {
6152
+ /**
6153
+ * Region code for tenant context
6154
+ */
6155
+ region: 'cn' | 'us' | 'de' | 'gb';
6156
+ /**
6157
+ * Commodity symbol
6158
+ */
6159
+ symbol: string;
6160
+ };
6161
+
6162
+ export type CommodityControllerGetOrCreateResponse = CommodityResponseDto;
6163
+
6164
+ export type CommodityControllerBulkCreateData = {
6165
+ /**
6166
+ * Region code for tenant context
6167
+ */
6168
+ region: 'cn' | 'us' | 'de' | 'gb';
6169
+ };
6170
+
6171
+ export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
6172
+
6173
+ export type PriceControllerCreateData = {
5546
6174
  /**
5547
6175
  * Region code for tenant context
5548
6176
  */
5549
6177
  region: 'cn' | 'us' | 'de' | 'gb';
5550
- requestBody: CreateCommodityDto;
6178
+ requestBody: CreateBeanPriceDto;
5551
6179
  };
5552
6180
 
5553
- export type CommodityControllerCreateResponse = CommodityResponseDto;
6181
+ export type PriceControllerCreateResponse = PriceResponseDto;
5554
6182
 
5555
- export type CommodityControllerFindAllData = {
6183
+ export type PriceControllerFindAllData = {
5556
6184
  /**
5557
- * Region code for tenant context
6185
+ * Filter by currency (e.g., BTC, AAPL, USD)
5558
6186
  */
5559
- region: 'cn' | 'us' | 'de' | 'gb';
6187
+ currency?: string;
5560
6188
  /**
5561
- * Search term for symbol or metadata fields (partial match). Searches symbol and metadata.name.
6189
+ * Filter prices from this date (ISO 8601 format)
5562
6190
  */
5563
- search?: string;
6191
+ dateFrom?: string;
5564
6192
  /**
5565
- * Filter by exact symbol match
6193
+ * Filter prices to this date (ISO 8601 format)
5566
6194
  */
5567
- symbol?: string;
5568
- };
5569
-
5570
- export type CommodityControllerFindAllResponse = CommodityListResponseDto;
5571
-
5572
- export type CommodityControllerFindOneData = {
6195
+ dateTo?: string;
6196
+ /**
6197
+ * Number of items per page (default: 20, max: 100)
6198
+ */
6199
+ limit?: number;
6200
+ /**
6201
+ * Page number for pagination (default: 1)
6202
+ */
6203
+ page?: number;
6204
+ /**
6205
+ * Filter by quote currency (pricing currency, e.g., USD, CNY)
6206
+ */
6207
+ quoteCurrency?: string;
5573
6208
  /**
5574
6209
  * Region code for tenant context
5575
6210
  */
5576
6211
  region: 'cn' | 'us' | 'de' | 'gb';
5577
6212
  /**
5578
- * Commodity symbol
6213
+ * Search term for currency or quoteCurrency (case-insensitive partial match)
5579
6214
  */
5580
- symbol: string;
6215
+ search?: string;
5581
6216
  };
5582
6217
 
5583
- export type CommodityControllerFindOneResponse = CommodityResponseDto;
6218
+ export type PriceControllerFindAllResponse = PriceListResponseDto;
5584
6219
 
5585
- export type CommodityControllerUpdateData = {
6220
+ export type PriceControllerFindOneData = {
5586
6221
  /**
5587
- * Region code for tenant context
6222
+ * Price ID
5588
6223
  */
5589
- region: 'cn' | 'us' | 'de' | 'gb';
5590
- requestBody: UpdateCommodityDto;
6224
+ id: string;
5591
6225
  /**
5592
- * Commodity symbol
6226
+ * Region code for tenant context
5593
6227
  */
5594
- symbol: string;
6228
+ region: 'cn' | 'us' | 'de' | 'gb';
5595
6229
  };
5596
6230
 
5597
- export type CommodityControllerUpdateResponse = CommodityResponseDto;
6231
+ export type PriceControllerFindOneResponse = PriceResponseDto;
5598
6232
 
5599
- export type CommodityControllerDeleteData = {
6233
+ export type PriceControllerUpdateData = {
5600
6234
  /**
5601
- * Region code for tenant context
6235
+ * Price ID
5602
6236
  */
5603
- region: 'cn' | 'us' | 'de' | 'gb';
6237
+ id: string;
5604
6238
  /**
5605
- * Commodity symbol
6239
+ * Region code for tenant context
5606
6240
  */
5607
- symbol: string;
6241
+ region: 'cn' | 'us' | 'de' | 'gb';
6242
+ requestBody: UpdateBeanPriceDto;
5608
6243
  };
5609
6244
 
5610
- export type CommodityControllerDeleteResponse = void;
6245
+ export type PriceControllerUpdateResponse = PriceResponseDto;
5611
6246
 
5612
- export type CommodityControllerGetOrCreateData = {
6247
+ export type PriceControllerDeleteData = {
5613
6248
  /**
5614
- * Region code for tenant context
6249
+ * Price ID
5615
6250
  */
5616
- region: 'cn' | 'us' | 'de' | 'gb';
6251
+ id: string;
5617
6252
  /**
5618
- * Commodity symbol
6253
+ * Region code for tenant context
5619
6254
  */
5620
- symbol: string;
6255
+ region: 'cn' | 'us' | 'de' | 'gb';
5621
6256
  };
5622
6257
 
5623
- export type CommodityControllerGetOrCreateResponse = CommodityResponseDto;
6258
+ export type PriceControllerDeleteResponse = void;
5624
6259
 
5625
- export type CommodityControllerBulkCreateData = {
6260
+ export type PriceControllerBulkCreateData = {
5626
6261
  /**
5627
6262
  * Region code for tenant context
5628
6263
  */
5629
6264
  region: 'cn' | 'us' | 'de' | 'gb';
6265
+ requestBody: Array<string>;
5630
6266
  };
5631
6267
 
5632
- export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
6268
+ export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
5633
6269
 
5634
6270
  export type RecurringRuleControllerCreateData = {
5635
6271
  /**
@@ -6096,6 +6732,159 @@ export type PropertyControllerDeleteData = {
6096
6732
 
6097
6733
  export type PropertyControllerDeleteResponse = void;
6098
6734
 
6735
+ export type EventControllerCreateData = {
6736
+ /**
6737
+ * Region code for tenant context (decorative for life events)
6738
+ */
6739
+ region: 'cn' | 'us' | 'de' | 'gb';
6740
+ requestBody: CreateBeanEventDto;
6741
+ };
6742
+
6743
+ export type EventControllerCreateResponse = EventResponseDto;
6744
+
6745
+ export type EventControllerFindAllData = {
6746
+ /**
6747
+ * Filter life events from this date (ISO 8601 format)
6748
+ */
6749
+ from?: string;
6750
+ /**
6751
+ * Number of items per page (default: 20, max: 100)
6752
+ */
6753
+ limit?: number;
6754
+ /**
6755
+ * Page number for pagination (default: 1)
6756
+ */
6757
+ page?: number;
6758
+ /**
6759
+ * Search term for description (case-insensitive partial match)
6760
+ */
6761
+ q?: string;
6762
+ /**
6763
+ * Region code for tenant context (decorative for life events)
6764
+ */
6765
+ region: 'cn' | 'us' | 'de' | 'gb';
6766
+ /**
6767
+ * Filter life events to this date (ISO 8601 format)
6768
+ */
6769
+ to?: string;
6770
+ /**
6771
+ * Filter by life event type (exact match)
6772
+ */
6773
+ type?: string;
6774
+ };
6775
+
6776
+ export type EventControllerFindAllResponse = EventListResponseDto;
6777
+
6778
+ export type EventControllerFindOneData = {
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 EventControllerFindOneResponse = EventResponseDto;
6790
+
6791
+ export type EventControllerUpdateData = {
6792
+ /**
6793
+ * Life event ID
6794
+ */
6795
+ id: string;
6796
+ /**
6797
+ * Region code for tenant context (decorative for life events)
6798
+ */
6799
+ region: 'cn' | 'us' | 'de' | 'gb';
6800
+ requestBody: UpdateBeanEventDto;
6801
+ };
6802
+
6803
+ export type EventControllerUpdateResponse = EventResponseDto;
6804
+
6805
+ export type EventControllerDeleteData = {
6806
+ /**
6807
+ * Life event ID
6808
+ */
6809
+ id: string;
6810
+ /**
6811
+ * Region code for tenant context (decorative for life events)
6812
+ */
6813
+ region: 'cn' | 'us' | 'de' | 'gb';
6814
+ };
6815
+
6816
+ export type EventControllerDeleteResponse = void;
6817
+
6818
+ export type EventControllerGetSliceData = {
6819
+ accountPattern: string;
6820
+ granularity: string;
6821
+ /**
6822
+ * Life event ID
6823
+ */
6824
+ id: string;
6825
+ /**
6826
+ * Region code for tenant context (decorative for life events)
6827
+ */
6828
+ region: 'cn' | 'us' | 'de' | 'gb';
6829
+ };
6830
+
6831
+ export type EventControllerGetSliceResponse = unknown;
6832
+
6833
+ export type OnboardingControllerBootstrapData = {
6834
+ /**
6835
+ * Region code for tenant context
6836
+ */
6837
+ region: 'cn' | 'us' | 'de' | 'gb';
6838
+ requestBody: OnboardingDto;
6839
+ };
6840
+
6841
+ export type OnboardingControllerBootstrapResponse = unknown;
6842
+
6843
+ export type ReconciliationControllerComputeData = {
6844
+ /**
6845
+ * Region code for tenant context (decorative for reconciliation)
6846
+ */
6847
+ region: 'cn' | 'us' | 'de' | 'gb';
6848
+ requestBody: ComputeReconciliationDto;
6849
+ };
6850
+
6851
+ export type ReconciliationControllerComputeResponse =
6852
+ ReconciliationComputeResultDto;
6853
+
6854
+ export type ReconciliationControllerAssertData = {
6855
+ /**
6856
+ * Region code for tenant context (decorative for reconciliation)
6857
+ */
6858
+ region: 'cn' | 'us' | 'de' | 'gb';
6859
+ requestBody: AssertReconciliationDto;
6860
+ };
6861
+
6862
+ export type ReconciliationControllerAssertResponse = ReconciliationRecordDto;
6863
+
6864
+ export type ReconciliationControllerPadData = {
6865
+ /**
6866
+ * Region code for tenant context (decorative for reconciliation)
6867
+ */
6868
+ region: 'cn' | 'us' | 'de' | 'gb';
6869
+ requestBody: PadReconciliationDto;
6870
+ };
6871
+
6872
+ export type ReconciliationControllerPadResponse = PadResultDto;
6873
+
6874
+ export type ReconciliationControllerHistoryData = {
6875
+ /**
6876
+ * BeanAccount id
6877
+ */
6878
+ accountId: string;
6879
+ /**
6880
+ * Region code for tenant context (decorative for reconciliation)
6881
+ */
6882
+ region: 'cn' | 'us' | 'de' | 'gb';
6883
+ };
6884
+
6885
+ export type ReconciliationControllerHistoryResponse =
6886
+ Array<ReconciliationRecordDto>;
6887
+
6099
6888
  export type ExportControllerExportBeancountResponse = unknown;
6100
6889
 
6101
6890
  export type FileImportControllerImportFileData = {
@@ -6188,48 +6977,6 @@ export type ImporterConfigControllerResetConfigData = {
6188
6977
 
6189
6978
  export type ImporterConfigControllerResetConfigResponse = ImporterConfigDto;
6190
6979
 
6191
- export type PlatformControllerFindAllResponse = unknown;
6192
-
6193
- export type PlatformControllerCreateData = {
6194
- requestBody: CreatePlatformDto;
6195
- };
6196
-
6197
- export type PlatformControllerCreateResponse = unknown;
6198
-
6199
- export type PlatformControllerGetPlatformListResponse = unknown;
6200
-
6201
- export type PlatformControllerMatchPlatformsData = {
6202
- /**
6203
- * Search query — Chinese name, English name, or abbreviation
6204
- */
6205
- q: string;
6206
- /**
6207
- * Region code for category override lookup
6208
- */
6209
- region?: string;
6210
- };
6211
-
6212
- export type PlatformControllerMatchPlatformsResponse = unknown;
6213
-
6214
- export type PlatformControllerUpdateData = {
6215
- /**
6216
- * Platform ID
6217
- */
6218
- id: string;
6219
- requestBody: UpdatePlatformDto;
6220
- };
6221
-
6222
- export type PlatformControllerUpdateResponse = unknown;
6223
-
6224
- export type PlatformControllerDeleteData = {
6225
- /**
6226
- * Platform ID
6227
- */
6228
- id: string;
6229
- };
6230
-
6231
- export type PlatformControllerDeleteResponse = void;
6232
-
6233
6980
  export type ProviderSyncControllerSyncData = {
6234
6981
  /**
6235
6982
  * Provider name
@@ -6273,7 +7020,50 @@ export type ProviderSyncControllerIsProviderSupportedData = {
6273
7020
  region: 'cn' | 'us' | 'de' | 'gb';
6274
7021
  };
6275
7022
 
6276
- export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
7023
+ export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
7024
+
7025
+ export type ExternalAccountLinkControllerCreateData = {
7026
+ /**
7027
+ * Region code for tenant context
7028
+ */
7029
+ region: 'cn' | 'us' | 'de' | 'gb';
7030
+ requestBody: CreateExternalAccountLinkDto;
7031
+ };
7032
+
7033
+ export type ExternalAccountLinkControllerCreateResponse =
7034
+ ExternalAccountLinkResponseDto;
7035
+
7036
+ export type ExternalAccountLinkControllerFindAllData = {
7037
+ provider: string;
7038
+ /**
7039
+ * Region code for tenant context
7040
+ */
7041
+ region: 'cn' | 'us' | 'de' | 'gb';
7042
+ };
7043
+
7044
+ export type ExternalAccountLinkControllerFindAllResponse =
7045
+ ExternalAccountLinkListResponseDto;
7046
+
7047
+ export type ExternalAccountLinkControllerFindOneData = {
7048
+ id: string;
7049
+ /**
7050
+ * Region code for tenant context
7051
+ */
7052
+ region: 'cn' | 'us' | 'de' | 'gb';
7053
+ };
7054
+
7055
+ export type ExternalAccountLinkControllerFindOneResponse =
7056
+ ExternalAccountLinkResponseDto;
7057
+
7058
+ export type ExternalAccountLinkControllerRemoveData = {
7059
+ id: string;
7060
+ /**
7061
+ * Region code for tenant context
7062
+ */
7063
+ region: 'cn' | 'us' | 'de' | 'gb';
7064
+ };
7065
+
7066
+ export type ExternalAccountLinkControllerRemoveResponse = void;
6277
7067
 
6278
7068
  export type TelemetryControllerReportTelemetryData = {
6279
7069
  /**
@@ -6347,6 +7137,49 @@ export type NlpControllerGetSessionData = {
6347
7137
 
6348
7138
  export type NlpControllerGetSessionResponse = unknown;
6349
7139
 
7140
+ export type PlatformControllerFindAllResponse = unknown;
7141
+
7142
+ export type PlatformControllerCreateData = {
7143
+ requestBody: CreatePlatformDto;
7144
+ };
7145
+
7146
+ export type PlatformControllerCreateResponse = unknown;
7147
+
7148
+ export type PlatformControllerGetPlatformListResponse =
7149
+ Array<PlatformListItemDto>;
7150
+
7151
+ export type PlatformControllerMatchPlatformsData = {
7152
+ /**
7153
+ * Search query — Chinese name, English name, or abbreviation
7154
+ */
7155
+ q: string;
7156
+ /**
7157
+ * Region code for category override lookup
7158
+ */
7159
+ region?: string;
7160
+ };
7161
+
7162
+ export type PlatformControllerMatchPlatformsResponse = unknown;
7163
+
7164
+ export type PlatformControllerUpdateData = {
7165
+ /**
7166
+ * Platform ID
7167
+ */
7168
+ id: string;
7169
+ requestBody: UpdatePlatformDto;
7170
+ };
7171
+
7172
+ export type PlatformControllerUpdateResponse = unknown;
7173
+
7174
+ export type PlatformControllerDeleteData = {
7175
+ /**
7176
+ * Platform ID
7177
+ */
7178
+ id: string;
7179
+ };
7180
+
7181
+ export type PlatformControllerDeleteResponse = void;
7182
+
6350
7183
  export type DashboardControllerGetNetWorthData = {
6351
7184
  /**
6352
7185
  * Date for balance calculation (ISO 8601 format)
@@ -6401,127 +7234,70 @@ export type DashboardControllerGetCashFlowData = {
6401
7234
 
6402
7235
  export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
6403
7236
 
6404
- export type HoldingPnlControllerGetHoldingPnlData = {
6405
- /**
6406
- * Scope to a single account
6407
- */
6408
- accountId?: string;
6409
- /**
6410
- * As-of date (ISO 8601), defaults to today
6411
- */
6412
- asOf?: string;
6413
- /**
6414
- * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
6415
- */
6416
- method?: 'FIFO' | 'average';
6417
- /**
6418
- * Region code for tenant context
6419
- */
6420
- region: 'cn' | 'us' | 'de' | 'gb';
6421
- };
6422
-
6423
- export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
6424
-
6425
- export type PriceControllerCreateData = {
6426
- /**
6427
- * Region code for tenant context
6428
- */
6429
- region: 'cn' | 'us' | 'de' | 'gb';
6430
- requestBody: CreateBeanPriceDto;
6431
- };
6432
-
6433
- export type PriceControllerCreateResponse = PriceResponseDto;
6434
-
6435
- export type PriceControllerFindAllData = {
6436
- /**
6437
- * Filter by currency (e.g., BTC, AAPL, USD)
6438
- */
6439
- currency?: string;
6440
- /**
6441
- * Filter prices from this date (ISO 8601 format)
6442
- */
6443
- dateFrom?: string;
6444
- /**
6445
- * Filter prices to this date (ISO 8601 format)
6446
- */
6447
- dateTo?: string;
7237
+ export type DashboardControllerGetExpensesData = {
6448
7238
  /**
6449
- * Number of items per page (default: 20, max: 100)
7239
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
6450
7240
  */
6451
- limit?: number;
7241
+ flow?: 'expense' | 'income';
6452
7242
  /**
6453
- * Page number for pagination (default: 1)
7243
+ * Grouping strategy
6454
7244
  */
6455
- page?: number;
7245
+ groupBy?: 'category';
6456
7246
  /**
6457
- * Filter by quote currency (pricing currency, e.g., USD, CNY)
7247
+ * Time window (1m = current calendar month)
6458
7248
  */
6459
- quoteCurrency?: string;
7249
+ period?: '1m' | '3m' | '6m' | '1y';
6460
7250
  /**
6461
7251
  * Region code for tenant context
6462
7252
  */
6463
7253
  region: 'cn' | 'us' | 'de' | 'gb';
6464
- /**
6465
- * Search term for currency or quoteCurrency (case-insensitive partial match)
6466
- */
6467
- search?: string;
6468
7254
  };
6469
7255
 
6470
- export type PriceControllerFindAllResponse = PriceListResponseDto;
7256
+ export type DashboardControllerGetExpensesResponse =
7257
+ ExpensesByCategoryResponseDto;
6471
7258
 
6472
- export type PriceControllerFindOneData = {
7259
+ export type HoldingPnlControllerGetHoldingPnlData = {
6473
7260
  /**
6474
- * Price ID
7261
+ * Scope to a single account
6475
7262
  */
6476
- id: string;
7263
+ accountId?: string;
6477
7264
  /**
6478
- * Region code for tenant context
7265
+ * As-of date (ISO 8601), defaults to today
6479
7266
  */
6480
- region: 'cn' | 'us' | 'de' | 'gb';
6481
- };
6482
-
6483
- export type PriceControllerFindOneResponse = PriceResponseDto;
6484
-
6485
- export type PriceControllerUpdateData = {
7267
+ asOf?: string;
6486
7268
  /**
6487
- * Price ID
7269
+ * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
6488
7270
  */
6489
- id: string;
7271
+ method?: 'FIFO' | 'average';
6490
7272
  /**
6491
7273
  * Region code for tenant context
6492
7274
  */
6493
7275
  region: 'cn' | 'us' | 'de' | 'gb';
6494
- requestBody: UpdateBeanPriceDto;
6495
7276
  };
6496
7277
 
6497
- export type PriceControllerUpdateResponse = PriceResponseDto;
7278
+ export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
6498
7279
 
6499
- export type PriceControllerDeleteData = {
7280
+ export type ReportingControllerGetPortfolioTrendsData = {
6500
7281
  /**
6501
- * Price ID
7282
+ * Data granularity
6502
7283
  */
6503
- id: string;
7284
+ granularity?: 'day' | 'week' | 'month';
6504
7285
  /**
6505
- * Region code for tenant context
7286
+ * Time period
6506
7287
  */
6507
- region: 'cn' | 'us' | 'de' | 'gb';
6508
- };
6509
-
6510
- export type PriceControllerDeleteResponse = void;
6511
-
6512
- export type PriceControllerBulkCreateData = {
7288
+ period?: '1m' | '3m' | '6m' | '1y';
6513
7289
  /**
6514
7290
  * Region code for tenant context
6515
7291
  */
6516
7292
  region: 'cn' | 'us' | 'de' | 'gb';
6517
- requestBody: Array<string>;
6518
7293
  };
6519
7294
 
6520
- export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
7295
+ export type ReportingControllerGetPortfolioTrendsResponse =
7296
+ PortfolioTrendsResponseDto;
6521
7297
 
6522
- export type ReportingControllerGetPortfolioTrendsData = {
7298
+ export type ReportingControllerGetCashFlowTrendsData = {
6523
7299
  /**
6524
- * Data granularity
7300
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6525
7301
  */
6526
7302
  granularity?: 'day' | 'week' | 'month';
6527
7303
  /**
@@ -6534,8 +7310,8 @@ export type ReportingControllerGetPortfolioTrendsData = {
6534
7310
  region: 'cn' | 'us' | 'de' | 'gb';
6535
7311
  };
6536
7312
 
6537
- export type ReportingControllerGetPortfolioTrendsResponse =
6538
- PortfolioTrendsResponseDto;
7313
+ export type ReportingControllerGetCashFlowTrendsResponse =
7314
+ CashFlowTrendsResponseDto;
6539
7315
 
6540
7316
  export type ReportingControllerGenerateSnapshotData = {
6541
7317
  /**
@@ -6716,6 +7492,25 @@ export type $OpenApiTs = {
6716
7492
  };
6717
7493
  };
6718
7494
  };
7495
+ '/api/v1/{region}/bean/accounts/{id}/opening-balance': {
7496
+ post: {
7497
+ req: AccountControllerAddOpeningBalanceData;
7498
+ res: {
7499
+ /**
7500
+ * Opening-balance transaction created
7501
+ */
7502
+ 201: OpeningBalanceResultDto;
7503
+ /**
7504
+ * Account not found
7505
+ */
7506
+ 404: unknown;
7507
+ /**
7508
+ * An opening balance already exists for this account
7509
+ */
7510
+ 409: unknown;
7511
+ };
7512
+ };
7513
+ };
6719
7514
  '/api/v1/{region}/bean/account-standards': {
6720
7515
  get: {
6721
7516
  req: AccountStandardsControllerGetTemplatesData;
@@ -7262,65 +8057,149 @@ export type $OpenApiTs = {
7262
8057
  req: CommodityControllerFindOneData;
7263
8058
  res: {
7264
8059
  /**
7265
- * Commodity retrieved successfully
8060
+ * Commodity retrieved successfully
8061
+ */
8062
+ 200: CommodityResponseDto;
8063
+ /**
8064
+ * Commodity not found
8065
+ */
8066
+ 404: ApiProblemResponseDto;
8067
+ };
8068
+ };
8069
+ put: {
8070
+ req: CommodityControllerUpdateData;
8071
+ res: {
8072
+ /**
8073
+ * Commodity updated successfully
8074
+ */
8075
+ 200: CommodityResponseDto;
8076
+ /**
8077
+ * Invalid input data
8078
+ */
8079
+ 400: ApiProblemResponseDto;
8080
+ /**
8081
+ * Commodity not found
8082
+ */
8083
+ 404: ApiProblemResponseDto;
8084
+ };
8085
+ };
8086
+ delete: {
8087
+ req: CommodityControllerDeleteData;
8088
+ res: {
8089
+ /**
8090
+ * Commodity deleted successfully
8091
+ */
8092
+ 204: void;
8093
+ /**
8094
+ * Commodity not found
8095
+ */
8096
+ 404: ApiProblemResponseDto;
8097
+ };
8098
+ };
8099
+ };
8100
+ '/api/v1/{region}/bean/commodities/{symbol}/ensure': {
8101
+ post: {
8102
+ req: CommodityControllerGetOrCreateData;
8103
+ res: {
8104
+ /**
8105
+ * Commodity retrieved or created
8106
+ */
8107
+ 200: CommodityResponseDto;
8108
+ };
8109
+ };
8110
+ };
8111
+ '/api/v1/{region}/bean/commodities/bulk': {
8112
+ post: {
8113
+ req: CommodityControllerBulkCreateData;
8114
+ res: {
8115
+ /**
8116
+ * Commodities created successfully
8117
+ */
8118
+ 201: Array<CommodityResponseDto>;
8119
+ };
8120
+ };
8121
+ };
8122
+ '/api/v1/{region}/bean/prices': {
8123
+ post: {
8124
+ req: PriceControllerCreateData;
8125
+ res: {
8126
+ /**
8127
+ * Price created successfully
8128
+ */
8129
+ 201: PriceResponseDto;
8130
+ /**
8131
+ * Currency or quoteCurrency commodity not found
8132
+ */
8133
+ 404: unknown;
8134
+ /**
8135
+ * Price already exists for this currency pair and date
8136
+ */
8137
+ 409: unknown;
8138
+ };
8139
+ };
8140
+ get: {
8141
+ req: PriceControllerFindAllData;
8142
+ res: {
8143
+ /**
8144
+ * Prices retrieved successfully
8145
+ */
8146
+ 200: PriceListResponseDto;
8147
+ };
8148
+ };
8149
+ };
8150
+ '/api/v1/{region}/bean/prices/{id}': {
8151
+ get: {
8152
+ req: PriceControllerFindOneData;
8153
+ res: {
8154
+ /**
8155
+ * Price retrieved successfully
7266
8156
  */
7267
- 200: CommodityResponseDto;
8157
+ 200: PriceResponseDto;
7268
8158
  /**
7269
- * Commodity not found
8159
+ * Price not found
7270
8160
  */
7271
- 404: ApiProblemResponseDto;
8161
+ 404: unknown;
7272
8162
  };
7273
8163
  };
7274
8164
  put: {
7275
- req: CommodityControllerUpdateData;
8165
+ req: PriceControllerUpdateData;
7276
8166
  res: {
7277
8167
  /**
7278
- * Commodity updated successfully
8168
+ * Price updated successfully
7279
8169
  */
7280
- 200: CommodityResponseDto;
8170
+ 200: PriceResponseDto;
7281
8171
  /**
7282
- * Invalid input data
8172
+ * Price not found
7283
8173
  */
7284
- 400: ApiProblemResponseDto;
8174
+ 404: unknown;
7285
8175
  /**
7286
- * Commodity not found
8176
+ * Updated price conflicts with existing price
7287
8177
  */
7288
- 404: ApiProblemResponseDto;
8178
+ 409: unknown;
7289
8179
  };
7290
8180
  };
7291
8181
  delete: {
7292
- req: CommodityControllerDeleteData;
8182
+ req: PriceControllerDeleteData;
7293
8183
  res: {
7294
8184
  /**
7295
- * Commodity deleted successfully
8185
+ * Price deleted successfully
7296
8186
  */
7297
8187
  204: void;
7298
8188
  /**
7299
- * Commodity not found
7300
- */
7301
- 404: ApiProblemResponseDto;
7302
- };
7303
- };
7304
- };
7305
- '/api/v1/{region}/bean/commodities/{symbol}/ensure': {
7306
- post: {
7307
- req: CommodityControllerGetOrCreateData;
7308
- res: {
7309
- /**
7310
- * Commodity retrieved or created
8189
+ * Price not found
7311
8190
  */
7312
- 200: CommodityResponseDto;
8191
+ 404: unknown;
7313
8192
  };
7314
8193
  };
7315
8194
  };
7316
- '/api/v1/{region}/bean/commodities/bulk': {
8195
+ '/api/v1/{region}/bean/prices/bulk': {
7317
8196
  post: {
7318
- req: CommodityControllerBulkCreateData;
8197
+ req: PriceControllerBulkCreateData;
7319
8198
  res: {
7320
8199
  /**
7321
- * Commodities created successfully
8200
+ * Prices created successfully
7322
8201
  */
7323
- 201: Array<CommodityResponseDto>;
8202
+ 201: Array<PriceResponseDto>;
7324
8203
  };
7325
8204
  };
7326
8205
  };
@@ -7968,6 +8847,181 @@ export type $OpenApiTs = {
7968
8847
  };
7969
8848
  };
7970
8849
  };
8850
+ '/api/v1/{region}/bean/events': {
8851
+ post: {
8852
+ req: EventControllerCreateData;
8853
+ res: {
8854
+ /**
8855
+ * Life event created successfully
8856
+ */
8857
+ 201: EventResponseDto;
8858
+ /**
8859
+ * Life event already exists for this (userId, type, date) combination
8860
+ */
8861
+ 409: unknown;
8862
+ };
8863
+ };
8864
+ get: {
8865
+ req: EventControllerFindAllData;
8866
+ res: {
8867
+ /**
8868
+ * Life events retrieved successfully
8869
+ */
8870
+ 200: EventListResponseDto;
8871
+ };
8872
+ };
8873
+ };
8874
+ '/api/v1/{region}/bean/events/{id}': {
8875
+ get: {
8876
+ req: EventControllerFindOneData;
8877
+ res: {
8878
+ /**
8879
+ * Life event retrieved successfully
8880
+ */
8881
+ 200: EventResponseDto;
8882
+ /**
8883
+ * Life event not found
8884
+ */
8885
+ 404: unknown;
8886
+ };
8887
+ };
8888
+ put: {
8889
+ req: EventControllerUpdateData;
8890
+ res: {
8891
+ /**
8892
+ * Life event updated successfully
8893
+ */
8894
+ 200: EventResponseDto;
8895
+ /**
8896
+ * If-Match header is not a valid ISO 8601 date
8897
+ */
8898
+ 400: unknown;
8899
+ /**
8900
+ * Life event not found
8901
+ */
8902
+ 404: unknown;
8903
+ /**
8904
+ * Updated event conflicts with an existing (userId, type, date) combination
8905
+ */
8906
+ 409: unknown;
8907
+ /**
8908
+ * If-Match precondition failed (updatedAt mismatch)
8909
+ */
8910
+ 412: unknown;
8911
+ };
8912
+ };
8913
+ delete: {
8914
+ req: EventControllerDeleteData;
8915
+ res: {
8916
+ /**
8917
+ * Life event deleted successfully
8918
+ */
8919
+ 204: void;
8920
+ /**
8921
+ * Life event not found
8922
+ */
8923
+ 404: unknown;
8924
+ };
8925
+ };
8926
+ };
8927
+ '/api/v1/{region}/bean/events/{id}/slice': {
8928
+ get: {
8929
+ req: EventControllerGetSliceData;
8930
+ res: {
8931
+ /**
8932
+ * Time-series sliced by the life event range
8933
+ */
8934
+ 200: unknown;
8935
+ /**
8936
+ * accountPattern query param is empty
8937
+ */
8938
+ 400: unknown;
8939
+ /**
8940
+ * Life event not found
8941
+ */
8942
+ 404: unknown;
8943
+ };
8944
+ };
8945
+ };
8946
+ '/api/v1/{region}/bean/onboarding': {
8947
+ post: {
8948
+ req: OnboardingControllerBootstrapData;
8949
+ res: {
8950
+ /**
8951
+ * Onboarding bootstrap result.
8952
+ */
8953
+ 201: unknown;
8954
+ /**
8955
+ * Invalid region/account path/duplicate paths.
8956
+ */
8957
+ 422: unknown;
8958
+ };
8959
+ };
8960
+ };
8961
+ '/api/v1/{region}/bean/reconciliations': {
8962
+ post: {
8963
+ req: ReconciliationControllerComputeData;
8964
+ res: {
8965
+ /**
8966
+ * Reconciliation preview
8967
+ */
8968
+ 200: ReconciliationComputeResultDto;
8969
+ /**
8970
+ * Account not found
8971
+ */
8972
+ 404: unknown;
8973
+ };
8974
+ };
8975
+ };
8976
+ '/api/v1/{region}/bean/reconciliations/assert': {
8977
+ post: {
8978
+ req: ReconciliationControllerAssertData;
8979
+ res: {
8980
+ /**
8981
+ * Balance assertion recorded
8982
+ */
8983
+ 201: ReconciliationRecordDto;
8984
+ /**
8985
+ * Account not found
8986
+ */
8987
+ 404: unknown;
8988
+ };
8989
+ };
8990
+ };
8991
+ '/api/v1/{region}/bean/reconciliations/pad': {
8992
+ post: {
8993
+ req: ReconciliationControllerPadData;
8994
+ res: {
8995
+ /**
8996
+ * Pad adjusting entry generated
8997
+ */
8998
+ 201: PadResultDto;
8999
+ /**
9000
+ * Book already within tolerance — no pad needed
9001
+ */
9002
+ 400: unknown;
9003
+ /**
9004
+ * Account not found
9005
+ */
9006
+ 404: unknown;
9007
+ };
9008
+ };
9009
+ };
9010
+ '/api/v1/{region}/bean/accounts/{accountId}/reconciliations': {
9011
+ get: {
9012
+ req: ReconciliationControllerHistoryData;
9013
+ res: {
9014
+ /**
9015
+ * Reconciliation history
9016
+ */
9017
+ 200: Array<ReconciliationRecordDto>;
9018
+ /**
9019
+ * Account not found
9020
+ */
9021
+ 404: unknown;
9022
+ };
9023
+ };
9024
+ };
7971
9025
  '/api/v1/{region}/bean/export/beancount': {
7972
9026
  get: {
7973
9027
  res: {
@@ -8051,142 +9105,70 @@ export type $OpenApiTs = {
8051
9105
  /**
8052
9106
  * Beancount file imported successfully
8053
9107
  */
8054
- 200: {
8055
- imported?: number;
8056
- skipped?: number;
8057
- failed?: number;
8058
- accountsCreated?: number;
8059
- errors?: Array<{
8060
- [key: string]: unknown;
8061
- }>;
8062
- };
8063
- /**
8064
- * Bad request - invalid file or no file uploaded
8065
- */
8066
- 400: ApiProblemResponseDto;
8067
- };
8068
- };
8069
- };
8070
- '/api/v1/{region}/bean/import/config/{importerId}': {
8071
- get: {
8072
- req: ImporterConfigControllerGetConfigData;
8073
- res: {
8074
- /**
8075
- * Configuration retrieved successfully
8076
- */
8077
- 200: ImporterConfigDto;
8078
- /**
8079
- * Invalid input - Unsupported importer
8080
- */
8081
- 400: ApiProblemResponseDto;
8082
- /**
8083
- * Unauthorized - Authentication required
8084
- */
8085
- 401: ApiProblemResponseDto;
8086
- };
8087
- };
8088
- put: {
8089
- req: ImporterConfigControllerUpdateConfigData;
8090
- res: {
8091
- /**
8092
- * Configuration updated successfully
8093
- */
8094
- 200: ImporterConfigDto;
8095
- /**
8096
- * Invalid input - Validation failed
8097
- */
8098
- 400: ApiProblemResponseDto;
8099
- /**
8100
- * Configuration not found
8101
- */
8102
- 404: ApiProblemResponseDto;
8103
- };
8104
- };
8105
- };
8106
- '/api/v1/{region}/bean/import/config/{importerId}/reset': {
8107
- post: {
8108
- req: ImporterConfigControllerResetConfigData;
8109
- res: {
8110
- /**
8111
- * Configuration reset successfully
8112
- */
8113
- 200: ImporterConfigDto;
8114
- /**
8115
- * Invalid input - Unsupported importer
8116
- */
8117
- 400: ApiProblemResponseDto;
8118
- };
8119
- };
8120
- };
8121
- '/api/v1/bean/platforms': {
8122
- get: {
8123
- res: {
8124
- /**
8125
- * List of platforms with binding and account counts
8126
- */
8127
- 200: unknown;
8128
- };
8129
- };
8130
- post: {
8131
- req: PlatformControllerCreateData;
8132
- res: {
8133
- /**
8134
- * Platform created successfully
8135
- */
8136
- 201: unknown;
9108
+ 200: {
9109
+ imported?: number;
9110
+ skipped?: number;
9111
+ failed?: number;
9112
+ accountsCreated?: number;
9113
+ errors?: Array<{
9114
+ [key: string]: unknown;
9115
+ }>;
9116
+ };
8137
9117
  /**
8138
- * Platform already exists
9118
+ * Bad request - invalid file or no file uploaded
8139
9119
  */
8140
- 409: unknown;
9120
+ 400: ApiProblemResponseDto;
8141
9121
  };
8142
9122
  };
8143
9123
  };
8144
- '/api/v1/bean/platforms/list': {
9124
+ '/api/v1/{region}/bean/import/config/{importerId}': {
8145
9125
  get: {
9126
+ req: ImporterConfigControllerGetConfigData;
8146
9127
  res: {
8147
9128
  /**
8148
- * List of platforms with user binding status
9129
+ * Configuration retrieved successfully
8149
9130
  */
8150
- 200: unknown;
8151
- };
8152
- };
8153
- };
8154
- '/api/v1/bean/platforms/match': {
8155
- get: {
8156
- req: PlatformControllerMatchPlatformsData;
8157
- res: {
9131
+ 200: ImporterConfigDto;
8158
9132
  /**
8159
- * List of matching platforms with suggested segment names
9133
+ * Invalid input - Unsupported importer
8160
9134
  */
8161
- 200: unknown;
9135
+ 400: ApiProblemResponseDto;
9136
+ /**
9137
+ * Unauthorized - Authentication required
9138
+ */
9139
+ 401: ApiProblemResponseDto;
8162
9140
  };
8163
9141
  };
8164
- };
8165
- '/api/v1/bean/platforms/{id}': {
8166
9142
  put: {
8167
- req: PlatformControllerUpdateData;
9143
+ req: ImporterConfigControllerUpdateConfigData;
8168
9144
  res: {
8169
9145
  /**
8170
- * Platform updated successfully
9146
+ * Configuration updated successfully
8171
9147
  */
8172
- 200: unknown;
9148
+ 200: ImporterConfigDto;
8173
9149
  /**
8174
- * Platform not found
9150
+ * Invalid input - Validation failed
8175
9151
  */
8176
- 404: unknown;
9152
+ 400: ApiProblemResponseDto;
9153
+ /**
9154
+ * Configuration not found
9155
+ */
9156
+ 404: ApiProblemResponseDto;
8177
9157
  };
8178
9158
  };
8179
- delete: {
8180
- req: PlatformControllerDeleteData;
9159
+ };
9160
+ '/api/v1/{region}/bean/import/config/{importerId}/reset': {
9161
+ post: {
9162
+ req: ImporterConfigControllerResetConfigData;
8181
9163
  res: {
8182
9164
  /**
8183
- * Platform deleted successfully
9165
+ * Configuration reset successfully
8184
9166
  */
8185
- 204: void;
9167
+ 200: ImporterConfigDto;
8186
9168
  /**
8187
- * Platform not found
9169
+ * Invalid input - Unsupported importer
8188
9170
  */
8189
- 404: unknown;
9171
+ 400: ApiProblemResponseDto;
8190
9172
  };
8191
9173
  };
8192
9174
  };
@@ -8243,6 +9225,54 @@ export type $OpenApiTs = {
8243
9225
  };
8244
9226
  };
8245
9227
  };
9228
+ '/api/v1/{region}/bean/external-account-links': {
9229
+ post: {
9230
+ req: ExternalAccountLinkControllerCreateData;
9231
+ res: {
9232
+ /**
9233
+ * Link created.
9234
+ */
9235
+ 201: ExternalAccountLinkResponseDto;
9236
+ /**
9237
+ * beanAccountId not owned, or an active link already exists.
9238
+ */
9239
+ 422: unknown;
9240
+ };
9241
+ };
9242
+ get: {
9243
+ req: ExternalAccountLinkControllerFindAllData;
9244
+ res: {
9245
+ /**
9246
+ * Links retrieved.
9247
+ */
9248
+ 200: ExternalAccountLinkListResponseDto;
9249
+ };
9250
+ };
9251
+ };
9252
+ '/api/v1/{region}/bean/external-account-links/{id}': {
9253
+ get: {
9254
+ req: ExternalAccountLinkControllerFindOneData;
9255
+ res: {
9256
+ /**
9257
+ * Link retrieved.
9258
+ */
9259
+ 200: ExternalAccountLinkResponseDto;
9260
+ /**
9261
+ * Link not found or not owned by the user.
9262
+ */
9263
+ 422: unknown;
9264
+ };
9265
+ };
9266
+ delete: {
9267
+ req: ExternalAccountLinkControllerRemoveData;
9268
+ res: {
9269
+ /**
9270
+ * Link soft-deleted; historical transactions are unaffected.
9271
+ */
9272
+ 204: void;
9273
+ };
9274
+ };
9275
+ };
8246
9276
  '/api/v1/{region}/bean/import/parser-telemetry': {
8247
9277
  post: {
8248
9278
  req: TelemetryControllerReportTelemetryData;
@@ -8331,6 +9361,78 @@ export type $OpenApiTs = {
8331
9361
  };
8332
9362
  };
8333
9363
  };
9364
+ '/api/v1/bean/platforms': {
9365
+ get: {
9366
+ res: {
9367
+ /**
9368
+ * List of platforms with binding and account counts
9369
+ */
9370
+ 200: unknown;
9371
+ };
9372
+ };
9373
+ post: {
9374
+ req: PlatformControllerCreateData;
9375
+ res: {
9376
+ /**
9377
+ * Platform created successfully
9378
+ */
9379
+ 201: unknown;
9380
+ /**
9381
+ * Platform already exists
9382
+ */
9383
+ 409: unknown;
9384
+ };
9385
+ };
9386
+ };
9387
+ '/api/v1/bean/platforms/list': {
9388
+ get: {
9389
+ res: {
9390
+ /**
9391
+ * List of platforms with user binding status
9392
+ */
9393
+ 200: Array<PlatformListItemDto>;
9394
+ };
9395
+ };
9396
+ };
9397
+ '/api/v1/bean/platforms/match': {
9398
+ get: {
9399
+ req: PlatformControllerMatchPlatformsData;
9400
+ res: {
9401
+ /**
9402
+ * List of matching platforms with suggested segment names
9403
+ */
9404
+ 200: unknown;
9405
+ };
9406
+ };
9407
+ };
9408
+ '/api/v1/bean/platforms/{id}': {
9409
+ put: {
9410
+ req: PlatformControllerUpdateData;
9411
+ res: {
9412
+ /**
9413
+ * Platform updated successfully
9414
+ */
9415
+ 200: unknown;
9416
+ /**
9417
+ * Platform not found
9418
+ */
9419
+ 404: unknown;
9420
+ };
9421
+ };
9422
+ delete: {
9423
+ req: PlatformControllerDeleteData;
9424
+ res: {
9425
+ /**
9426
+ * Platform deleted successfully
9427
+ */
9428
+ 204: void;
9429
+ /**
9430
+ * Platform not found
9431
+ */
9432
+ 404: unknown;
9433
+ };
9434
+ };
9435
+ };
8334
9436
  '/api/v1/{region}/dashboard/net-worth': {
8335
9437
  get: {
8336
9438
  req: DashboardControllerGetNetWorthData;
@@ -8383,16 +9485,16 @@ export type $OpenApiTs = {
8383
9485
  };
8384
9486
  };
8385
9487
  };
8386
- '/api/v1/{region}/investment/holdings/pnl': {
9488
+ '/api/v1/{region}/dashboard/expenses': {
8387
9489
  get: {
8388
- req: HoldingPnlControllerGetHoldingPnlData;
9490
+ req: DashboardControllerGetExpensesData;
8389
9491
  res: {
8390
9492
  /**
8391
- * Holding P&L retrieved successfully
9493
+ * Expenses retrieved successfully
8392
9494
  */
8393
- 200: HoldingPnlResponseDto;
9495
+ 200: ExpensesByCategoryResponseDto;
8394
9496
  /**
8395
- * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
9497
+ * Invalid groupBy or period
8396
9498
  */
8397
9499
  400: unknown;
8398
9500
  /**
@@ -8402,98 +9504,48 @@ export type $OpenApiTs = {
8402
9504
  };
8403
9505
  };
8404
9506
  };
8405
- '/api/v1/{region}/bean/prices': {
8406
- post: {
8407
- req: PriceControllerCreateData;
9507
+ '/api/v1/{region}/investment/holdings/pnl': {
9508
+ get: {
9509
+ req: HoldingPnlControllerGetHoldingPnlData;
8408
9510
  res: {
8409
9511
  /**
8410
- * Price created successfully
8411
- */
8412
- 201: PriceResponseDto;
8413
- /**
8414
- * Currency or quoteCurrency commodity not found
9512
+ * Holding P&L retrieved successfully
8415
9513
  */
8416
- 404: unknown;
9514
+ 200: HoldingPnlResponseDto;
8417
9515
  /**
8418
- * Price already exists for this currency pair and date
9516
+ * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
8419
9517
  */
8420
- 409: unknown;
8421
- };
8422
- };
8423
- get: {
8424
- req: PriceControllerFindAllData;
8425
- res: {
9518
+ 400: unknown;
8426
9519
  /**
8427
- * Prices retrieved successfully
9520
+ * User not authenticated
8428
9521
  */
8429
- 200: PriceListResponseDto;
9522
+ 401: unknown;
8430
9523
  };
8431
9524
  };
8432
9525
  };
8433
- '/api/v1/{region}/bean/prices/{id}': {
9526
+ '/api/v1/{region}/reporting/portfolio/trends': {
8434
9527
  get: {
8435
- req: PriceControllerFindOneData;
8436
- res: {
8437
- /**
8438
- * Price retrieved successfully
8439
- */
8440
- 200: PriceResponseDto;
8441
- /**
8442
- * Price not found
8443
- */
8444
- 404: unknown;
8445
- };
8446
- };
8447
- put: {
8448
- req: PriceControllerUpdateData;
8449
- res: {
8450
- /**
8451
- * Price updated successfully
8452
- */
8453
- 200: PriceResponseDto;
8454
- /**
8455
- * Price not found
8456
- */
8457
- 404: unknown;
8458
- /**
8459
- * Updated price conflicts with existing price
8460
- */
8461
- 409: unknown;
8462
- };
8463
- };
8464
- delete: {
8465
- req: PriceControllerDeleteData;
9528
+ req: ReportingControllerGetPortfolioTrendsData;
8466
9529
  res: {
8467
9530
  /**
8468
- * Price deleted successfully
8469
- */
8470
- 204: void;
8471
- /**
8472
- * Price not found
9531
+ * Trends retrieved successfully
8473
9532
  */
8474
- 404: unknown;
8475
- };
8476
- };
8477
- };
8478
- '/api/v1/{region}/bean/prices/bulk': {
8479
- post: {
8480
- req: PriceControllerBulkCreateData;
8481
- res: {
9533
+ 200: PortfolioTrendsResponseDto;
8482
9534
  /**
8483
- * Prices created successfully
9535
+ * User not authenticated
8484
9536
  */
8485
- 201: Array<PriceResponseDto>;
9537
+ 401: unknown;
8486
9538
  };
8487
9539
  };
8488
9540
  };
8489
- '/api/v1/{region}/reporting/portfolio/trends': {
9541
+ '/api/v1/{region}/reporting/cash-flow/trends': {
8490
9542
  get: {
8491
- req: ReportingControllerGetPortfolioTrendsData;
9543
+ req: ReportingControllerGetCashFlowTrendsData;
8492
9544
  res: {
8493
9545
  /**
8494
- * Trends retrieved successfully
9546
+ * Cash-flow trends retrieved successfully
8495
9547
  */
8496
- 200: PortfolioTrendsResponseDto;
9548
+ 200: CashFlowTrendsResponseDto;
8497
9549
  /**
8498
9550
  * User not authenticated
8499
9551
  */