@firela/api-types 0.0.0-canary.8cbdced0 → 0.0.0-canary.9256c41b

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)
@@ -2925,6 +3070,26 @@ export type SignupDto = {
2925
3070
  turnstileToken?: string;
2926
3071
  };
2927
3072
 
3073
+ export type SignupResponseDto = {
3074
+ /**
3075
+ * JWT auth token
3076
+ */
3077
+ authToken: string;
3078
+ /**
3079
+ * Auto-generated access token
3080
+ */
3081
+ accessToken: string;
3082
+ /**
3083
+ * Assigned user role
3084
+ */
3085
+ role: 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
3086
+ };
3087
+
3088
+ /**
3089
+ * Assigned user role
3090
+ */
3091
+ export type role = 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
3092
+
2928
3093
  export type UpdateUserSettingDto = {
2929
3094
  /**
2930
3095
  * Security ID
@@ -3029,70 +3194,314 @@ export type UpdatePropertyDto = {
3029
3194
  value: string;
3030
3195
  };
3031
3196
 
3032
- export type FileImportDto = {
3197
+ export type CreateBeanEventDto = {
3033
3198
  /**
3034
- * Bill file to import (CSV, PDF, OFX, etc.)
3199
+ * Life event date (ISO 8601)
3035
3200
  */
3036
- file: Blob | File;
3037
- };
3038
-
3039
- export type ImportErrorDto = {
3201
+ date: string;
3040
3202
  /**
3041
- * Index of failed transaction in the file
3203
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3042
3204
  */
3043
- index: number;
3205
+ type: string;
3044
3206
  /**
3045
- * Error message
3207
+ * Life event description. Empty string is a VALID value (distinct from absence).
3046
3208
  */
3047
- error: string;
3209
+ description: string;
3210
+ /**
3211
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3212
+ */
3213
+ meta?: {
3214
+ [key: string]: unknown;
3215
+ };
3048
3216
  };
3049
3217
 
3050
- export type ReviewItemPreviewDto = {
3218
+ export type EventResponseDto = {
3051
3219
  /**
3052
- * Index in the import batch (for tracking)
3220
+ * Unique identifier
3053
3221
  */
3054
- index: number;
3222
+ id: string;
3055
3223
  /**
3056
- * Transaction date (ISO format)
3224
+ * User ID (owner of the life event)
3057
3225
  */
3058
- date: string;
3226
+ userId: string;
3059
3227
  /**
3060
- * Transaction amount (absolute value)
3228
+ * Life event date (ISO 8601 format)
3061
3229
  */
3062
- amount?: number;
3230
+ date: string;
3063
3231
  /**
3064
- * Currency code
3232
+ * Life event type (user-defined, e.g., "employer", "location")
3065
3233
  */
3066
- currency?: string;
3234
+ type: string;
3067
3235
  /**
3068
- * Transaction narration/description
3236
+ * Life event description. May be an empty string (a valid value distinct from absence).
3069
3237
  */
3070
- narration: string;
3238
+ description: string;
3071
3239
  /**
3072
- * Payee name
3240
+ * Product-side metadata (free-form JSON)
3073
3241
  */
3074
- payee?: string;
3242
+ meta: {
3243
+ [key: string]: unknown;
3244
+ };
3075
3245
  /**
3076
- * Inferred category from rule matching
3246
+ * Creation timestamp
3077
3247
  */
3078
- category?: string;
3248
+ createdAt: string;
3079
3249
  /**
3080
- * Confidence score for the match (0-1)
3250
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3081
3251
  */
3082
- confidence?: number;
3252
+ updatedAt: string;
3253
+ };
3254
+
3255
+ export type EventListResponseDto = {
3083
3256
  /**
3084
- * Type of branch requiring review
3257
+ * List of life events
3085
3258
  */
3086
- branchType?:
3087
- | 'DUPLICATE'
3088
- | 'PAYEE_MATCH'
3089
- | 'RULE_MATCH'
3090
- | 'ACCOUNT_VALIDATION'
3091
- | 'PIPELINE_ERROR';
3259
+ items: Array<EventResponseDto>;
3092
3260
  /**
3093
- * Human-readable reasons for requiring review
3261
+ * Total number of life events matching the query
3094
3262
  */
3095
- reasons?: Array<string>;
3263
+ total: number;
3264
+ };
3265
+
3266
+ export type UpdateBeanEventDto = {
3267
+ /**
3268
+ * Life event date (ISO 8601)
3269
+ */
3270
+ date?: string;
3271
+ /**
3272
+ * Life event type (user-defined)
3273
+ */
3274
+ type?: string;
3275
+ /**
3276
+ * Life event description. Empty string is a VALID value (distinct from absence).
3277
+ */
3278
+ description?: string;
3279
+ /**
3280
+ * Product-side metadata (free-form JSON)
3281
+ */
3282
+ meta?: {
3283
+ [key: string]: unknown;
3284
+ };
3285
+ };
3286
+
3287
+ export type OnboardingAccountDto = {
3288
+ /**
3289
+ * Account path (Assets/Liabilities only; format validated by the account service)
3290
+ */
3291
+ path: string;
3292
+ /**
3293
+ * ISO 4217 currency code (3 letters)
3294
+ */
3295
+ currency: string;
3296
+ /**
3297
+ * Opening balance as a non-negative Decimal string (e.g. "1000.00")
3298
+ */
3299
+ openingBalance?: string;
3300
+ /**
3301
+ * Platform ID to bind the account to (references Platform.id); omit for unbound
3302
+ */
3303
+ platformId?: string;
3304
+ };
3305
+
3306
+ export type OnboardingDto = {
3307
+ /**
3308
+ * Asset/Liability accounts to register with opening balances
3309
+ */
3310
+ accounts?: Array<OnboardingAccountDto>;
3311
+ /**
3312
+ * Skip asset registration; only bootstrap the core account set
3313
+ */
3314
+ skipAssetRegistration?: boolean;
3315
+ };
3316
+
3317
+ export type ActualBalanceDto = {
3318
+ /**
3319
+ * Actual balance amount as a decimal string (preserves precision for tolerance inference).
3320
+ */
3321
+ amount: string;
3322
+ /**
3323
+ * Currency code (ISO 4217 or commodity ticker).
3324
+ */
3325
+ ccy: string;
3326
+ };
3327
+
3328
+ export type ComputeReconciliationDto = {
3329
+ /**
3330
+ * BeanAccount id to reconcile.
3331
+ */
3332
+ accountId: string;
3333
+ /**
3334
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3335
+ */
3336
+ asOfDate: string;
3337
+ /**
3338
+ * Actual balance from the external statement.
3339
+ */
3340
+ actualBalance: ActualBalanceDto;
3341
+ };
3342
+
3343
+ export type ReconciliationComputeResultDto = {
3344
+ accountId: string;
3345
+ asOfDate: string;
3346
+ /**
3347
+ * System-computed book balance (decimal string).
3348
+ */
3349
+ bookBalance: string;
3350
+ /**
3351
+ * User-entered actual balance (decimal string).
3352
+ */
3353
+ actualBalance: string;
3354
+ currency: string;
3355
+ /**
3356
+ * Diff = book − actual (decimal string).
3357
+ */
3358
+ diff: string;
3359
+ /**
3360
+ * Applied tolerance (decimal string).
3361
+ */
3362
+ tolerance: string;
3363
+ /**
3364
+ * true when |diff| ≤ tolerance.
3365
+ */
3366
+ withinTolerance: boolean;
3367
+ /**
3368
+ * Suggested next action: assert when within tolerance, pad otherwise.
3369
+ */
3370
+ suggestedAction: 'assert' | 'pad';
3371
+ };
3372
+
3373
+ /**
3374
+ * Suggested next action: assert when within tolerance, pad otherwise.
3375
+ */
3376
+ export type suggestedAction = 'assert' | 'pad';
3377
+
3378
+ export type AssertReconciliationDto = {
3379
+ /**
3380
+ * BeanAccount id to reconcile.
3381
+ */
3382
+ accountId: string;
3383
+ /**
3384
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3385
+ */
3386
+ asOfDate: string;
3387
+ /**
3388
+ * Actual balance from the external statement.
3389
+ */
3390
+ actualBalance: ActualBalanceDto;
3391
+ /**
3392
+ * Optional explicit tolerance override. Omit to infer from amount precision (Beancount default).
3393
+ */
3394
+ tolerance?: string;
3395
+ };
3396
+
3397
+ export type ReconciliationRecordDto = {
3398
+ id: string;
3399
+ accountId: string;
3400
+ date: string;
3401
+ /**
3402
+ * Asserted (actual) amount.
3403
+ */
3404
+ amount: string;
3405
+ currency: string;
3406
+ tolerance?: string;
3407
+ /**
3408
+ * book − actual.
3409
+ */
3410
+ diffAmount?: string;
3411
+ diffCurrency?: string;
3412
+ createdAt: string;
3413
+ };
3414
+
3415
+ export type PadReconciliationDto = {
3416
+ /**
3417
+ * BeanAccount id to reconcile.
3418
+ */
3419
+ accountId: string;
3420
+ /**
3421
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3422
+ */
3423
+ asOfDate: string;
3424
+ /**
3425
+ * Actual balance from the external statement.
3426
+ */
3427
+ actualBalance: ActualBalanceDto;
3428
+ /**
3429
+ * Pad source account. Defaults to Equity:Opening-Balances (official Beancount convention).
3430
+ */
3431
+ sourceAccount?: string;
3432
+ };
3433
+
3434
+ export type PadResultDto = {
3435
+ /**
3436
+ * Created pad adjusting transaction id.
3437
+ */
3438
+ transactionId: string;
3439
+ };
3440
+
3441
+ export type FileImportDto = {
3442
+ /**
3443
+ * Bill file to import (CSV, PDF, OFX, etc.)
3444
+ */
3445
+ file: Blob | File;
3446
+ };
3447
+
3448
+ export type ImportErrorDto = {
3449
+ /**
3450
+ * Index of failed transaction in the file
3451
+ */
3452
+ index: number;
3453
+ /**
3454
+ * Error message
3455
+ */
3456
+ error: string;
3457
+ };
3458
+
3459
+ export type ReviewItemPreviewDto = {
3460
+ /**
3461
+ * Index in the import batch (for tracking)
3462
+ */
3463
+ index: number;
3464
+ /**
3465
+ * Transaction date (ISO format)
3466
+ */
3467
+ date: string;
3468
+ /**
3469
+ * Transaction amount (absolute value)
3470
+ */
3471
+ amount?: number;
3472
+ /**
3473
+ * Currency code
3474
+ */
3475
+ currency?: string;
3476
+ /**
3477
+ * Transaction narration/description
3478
+ */
3479
+ narration: string;
3480
+ /**
3481
+ * Payee name
3482
+ */
3483
+ payee?: string;
3484
+ /**
3485
+ * Inferred category from rule matching
3486
+ */
3487
+ category?: string;
3488
+ /**
3489
+ * Confidence score for the match (0-1)
3490
+ */
3491
+ confidence?: number;
3492
+ /**
3493
+ * Type of branch requiring review
3494
+ */
3495
+ branchType?:
3496
+ | 'DUPLICATE'
3497
+ | 'PAYEE_MATCH'
3498
+ | 'RULE_MATCH'
3499
+ | 'ACCOUNT_VALIDATION'
3500
+ | 'PIPELINE_ERROR';
3501
+ /**
3502
+ * Human-readable reasons for requiring review
3503
+ */
3504
+ reasons?: Array<string>;
3096
3505
  };
3097
3506
 
3098
3507
  /**
@@ -3327,77 +3736,737 @@ export type UpdateImporterConfigDto = {
3327
3736
  data?: UpdateConfigDataDto;
3328
3737
  };
3329
3738
 
3330
- export type CreatePlatformDto = {
3739
+ export type ProviderSyncConfigDto = {
3331
3740
  /**
3332
- * Platform name
3741
+ * Source account for the first posting
3333
3742
  */
3334
- name: string;
3743
+ sourceAccount: string;
3335
3744
  /**
3336
- * Platform canonical identifier (lowercase, kebab-case)
3745
+ * Default currency for transactions
3337
3746
  */
3338
- canonical: string;
3747
+ defaultCurrency: string;
3339
3748
  /**
3340
- * Platform aliases (multi-language names for lookup)
3749
+ * Default expense account for the second posting
3341
3750
  */
3342
- aliases: Array<string>;
3751
+ defaultExpenseAccount: string;
3343
3752
  /**
3344
- * Platform URL
3753
+ * Default income account for the second posting
3345
3754
  */
3346
- url: string;
3755
+ defaultIncomeAccount: string;
3347
3756
  /**
3348
- * Platform type
3757
+ * Filter pending transactions
3349
3758
  */
3350
- type:
3351
- | 'BANK'
3352
- | 'BROKERAGE'
3353
- | 'CRYPTO_EXCHANGE'
3354
- | 'PAYMENT'
3355
- | 'INVESTMENT'
3356
- | 'INSURANCE'
3357
- | 'OTHER';
3759
+ filterPending?: boolean;
3358
3760
  /**
3359
- * Platform logo URL
3761
+ * External account ID for per-batch providers (e.g. GoCardless). Overrides sourceAccount when an ExternalAccountLink mapping exists.
3360
3762
  */
3361
- logoUrl?: string;
3763
+ externalAccountId?: string;
3764
+ };
3765
+
3766
+ export type ProviderSyncDto = {
3362
3767
  /**
3363
- * Whether the platform is active
3768
+ * Provider name (already in URL path, optional here for reference)
3364
3769
  */
3365
- isActive?: boolean;
3770
+ provider?: string;
3771
+ /**
3772
+ * Unique sync identifier for idempotency
3773
+ */
3774
+ syncId?: string;
3775
+ /**
3776
+ * Provider sync configuration
3777
+ */
3778
+ config: ProviderSyncConfigDto;
3779
+ /**
3780
+ * Raw transactions from provider
3781
+ */
3782
+ transactions: unknown[];
3366
3783
  };
3367
3784
 
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 = {
3785
+ export type ProviderSyncResponseDto = {
3381
3786
  /**
3382
- * Platform name
3787
+ * Number of transactions successfully imported
3383
3788
  */
3384
- name?: string;
3789
+ imported: number;
3385
3790
  /**
3386
- * Platform canonical identifier (lowercase, kebab-case)
3791
+ * Number of transactions skipped (duplicates)
3387
3792
  */
3388
- canonical?: string;
3793
+ skipped: number;
3389
3794
  /**
3390
- * Platform aliases (multi-language names for lookup)
3795
+ * Number of transactions pending review
3391
3796
  */
3392
- aliases?: Array<string>;
3797
+ pendingReview: number;
3393
3798
  /**
3394
- * Platform URL
3799
+ * Number of transactions that failed to import
3395
3800
  */
3396
- url?: string;
3801
+ failed: number;
3397
3802
  /**
3398
- * Platform type
3803
+ * IDs of successfully imported transactions
3399
3804
  */
3400
- type?:
3805
+ importedTransactionIds?: Array<string>;
3806
+ /**
3807
+ * IDs of review items created for branched transactions
3808
+ */
3809
+ reviewItemIds?: Array<string>;
3810
+ };
3811
+
3812
+ export type SupportedProvidersResponseDto = {
3813
+ /**
3814
+ * List of supported provider names
3815
+ */
3816
+ providers: Array<string>;
3817
+ };
3818
+
3819
+ export type CreateExternalAccountLinkDto = {
3820
+ /**
3821
+ * Open Banking provider (whitelist)
3822
+ */
3823
+ provider:
3824
+ | 'plaid'
3825
+ | 'teller'
3826
+ | 'truelayer'
3827
+ | 'gocardless'
3828
+ | 'simplefin'
3829
+ | 'yodlee'
3830
+ | 'beancount-direct'
3831
+ | 'parsed-bill';
3832
+ /**
3833
+ * External account ID from the provider
3834
+ */
3835
+ externalAccountId: string;
3836
+ /**
3837
+ * Target BeanAccount ID (must belong to the JWT user)
3838
+ */
3839
+ beanAccountId: string;
3840
+ };
3841
+
3842
+ /**
3843
+ * Open Banking provider (whitelist)
3844
+ */
3845
+ export type provider =
3846
+ | 'plaid'
3847
+ | 'teller'
3848
+ | 'truelayer'
3849
+ | 'gocardless'
3850
+ | 'simplefin'
3851
+ | 'yodlee'
3852
+ | 'beancount-direct'
3853
+ | 'parsed-bill';
3854
+
3855
+ export type ExternalAccountLinkResponseDto = {
3856
+ id: string;
3857
+ provider: string;
3858
+ externalAccountId: string;
3859
+ beanAccountId: string;
3860
+ isActive: boolean;
3861
+ createdAt: string;
3862
+ updatedAt: string;
3863
+ };
3864
+
3865
+ export type ExternalAccountLinkListResponseDto = {
3866
+ items: Array<ExternalAccountLinkResponseDto>;
3867
+ total: number;
3868
+ /**
3869
+ * Filter by provider (query param)
3870
+ */
3871
+ provider?: string;
3872
+ };
3873
+
3874
+ export type ParserTelemetryReportDto = unknown;
3875
+
3876
+ export type UncoveredFormatMissDto = unknown;
3877
+
3878
+ export type ProcessNlpDto = {
3879
+ /**
3880
+ * Natural language text describing a transaction (Chinese)
3881
+ */
3882
+ message: string;
3883
+ /**
3884
+ * Session ID for multi-turn conversation (auto-generated if not provided)
3885
+ */
3886
+ sessionId?: string;
3887
+ /**
3888
+ * Parsed data from previous NLP response for session recovery. Send back the parsedData received in confirm_payee/confirm responses.
3889
+ */
3890
+ parsedData?: {
3891
+ [key: string]: unknown;
3892
+ };
3893
+ };
3894
+
3895
+ export type NlpTransactionInfoDto = {
3896
+ /**
3897
+ * Transaction ID
3898
+ */
3899
+ id: string;
3900
+ /**
3901
+ * Transaction date (ISO format)
3902
+ */
3903
+ date: string;
3904
+ /**
3905
+ * Transaction amount
3906
+ */
3907
+ amount: number;
3908
+ /**
3909
+ * Currency code
3910
+ */
3911
+ currency: string;
3912
+ /**
3913
+ * Payee name
3914
+ */
3915
+ payee?: string;
3916
+ /**
3917
+ * Transaction narration
3918
+ */
3919
+ narration?: string;
3920
+ /**
3921
+ * Warning message for special transaction scenarios (e.g., cross-currency settlement)
3922
+ */
3923
+ warning?: string;
3924
+ };
3925
+
3926
+ export type NlpParsedDataDto = {
3927
+ /**
3928
+ * Extracted amount
3929
+ */
3930
+ amount?: number;
3931
+ /**
3932
+ * Currency code
3933
+ */
3934
+ currency?: string;
3935
+ /**
3936
+ * Transaction date (ISO format)
3937
+ */
3938
+ date?: string;
3939
+ /**
3940
+ * Payee name
3941
+ */
3942
+ payee?: string;
3943
+ /**
3944
+ * Transaction narration
3945
+ */
3946
+ narration?: string;
3947
+ /**
3948
+ * Category
3949
+ */
3950
+ category?: string;
3951
+ /**
3952
+ * Income type (e.g., Salary, Bonus, Dividend, Interest)
3953
+ */
3954
+ incomeType?: string;
3955
+ /**
3956
+ * Income source (e.g., company name)
3957
+ */
3958
+ incomeSource?: string;
3959
+ /**
3960
+ * Security symbol code (e.g., 600519, AAPL)
3961
+ */
3962
+ symbol?: string;
3963
+ /**
3964
+ * Quantity of shares/units
3965
+ */
3966
+ quantity?: number;
3967
+ /**
3968
+ * Unit price per share/unit
3969
+ */
3970
+ price?: number;
3971
+ /**
3972
+ * Investment action
3973
+ */
3974
+ investmentAction?: 'buy' | 'sell';
3975
+ /**
3976
+ * Payment source: asset (default) or liability (credit card)
3977
+ */
3978
+ paymentSource?: 'asset' | 'liability';
3979
+ /**
3980
+ * Liability account hint (CreditCard/Huabei/Baitiao)
3981
+ */
3982
+ liabilityHint?: string;
3983
+ /**
3984
+ * Warning message for special scenarios (e.g., cross-currency settlement)
3985
+ */
3986
+ warning?: string;
3987
+ };
3988
+
3989
+ /**
3990
+ * Investment action
3991
+ */
3992
+ export type investmentAction = 'buy' | 'sell';
3993
+
3994
+ /**
3995
+ * Payment source: asset (default) or liability (credit card)
3996
+ */
3997
+ export type paymentSource = 'asset' | 'liability';
3998
+
3999
+ export type NlpSourceTransactionDto = {
4000
+ /**
4001
+ * Transaction date (ISO format)
4002
+ */
4003
+ date: string;
4004
+ /**
4005
+ * Amount as string
4006
+ */
4007
+ amount: string;
4008
+ /**
4009
+ * Currency code
4010
+ */
4011
+ currency: string;
4012
+ /**
4013
+ * Payee name
4014
+ */
4015
+ payee?: string;
4016
+ /**
4017
+ * Transaction narration
4018
+ */
4019
+ narration: string;
4020
+ };
4021
+
4022
+ export type NlpTargetTransactionDto = {
4023
+ /**
4024
+ * Existing transaction ID
4025
+ */
4026
+ id: string;
4027
+ /**
4028
+ * Transaction date (ISO format)
4029
+ */
4030
+ date: string;
4031
+ /**
4032
+ * Amount as string
4033
+ */
4034
+ amount: string;
4035
+ /**
4036
+ * Currency code
4037
+ */
4038
+ currency: string;
4039
+ /**
4040
+ * Payee name
4041
+ */
4042
+ payee?: string;
4043
+ /**
4044
+ * Transaction narration
4045
+ */
4046
+ narration: string;
4047
+ };
4048
+
4049
+ export type NlpSimilarityDto = {
4050
+ /**
4051
+ * Whether dates match
4052
+ */
4053
+ dateMatch: boolean;
4054
+ /**
4055
+ * Date difference in days
4056
+ */
4057
+ dateDiff: number;
4058
+ /**
4059
+ * Whether amounts match
4060
+ */
4061
+ amountMatch: boolean;
4062
+ /**
4063
+ * Amount difference as decimal string
4064
+ */
4065
+ amountDiff: string;
4066
+ /**
4067
+ * Whether payees match
4068
+ */
4069
+ payeeMatch: boolean;
4070
+ /**
4071
+ * Payee similarity score (0-1)
4072
+ */
4073
+ payeeSimilarity: number;
4074
+ /**
4075
+ * Account overlap score (0-1)
4076
+ */
4077
+ accountOverlap: number;
4078
+ };
4079
+
4080
+ export type NlpDuplicateConfirmationDataDto = {
4081
+ /**
4082
+ * Duplicate detection confidence score (0.5-0.89)
4083
+ */
4084
+ confidence: number;
4085
+ /**
4086
+ * Source transaction summary (the new transaction being entered)
4087
+ */
4088
+ sourceTransaction: NlpSourceTransactionDto;
4089
+ /**
4090
+ * Target transaction summary (existing potential duplicate)
4091
+ */
4092
+ targetTransaction: NlpTargetTransactionDto;
4093
+ /**
4094
+ * Detailed similarity information
4095
+ */
4096
+ similarity: NlpSimilarityDto;
4097
+ /**
4098
+ * Human-readable reasons for duplicate detection
4099
+ */
4100
+ reasons: Array<string>;
4101
+ };
4102
+
4103
+ export type NlpRuleConfirmationDataDto = {
4104
+ /**
4105
+ * Rule match confidence score (0.5-0.74)
4106
+ */
4107
+ confidence: number;
4108
+ /**
4109
+ * Matched rule information
4110
+ */
4111
+ matchedRule: {
4112
+ [key: string]: unknown;
4113
+ };
4114
+ /**
4115
+ * Suggested accounts from the rule
4116
+ */
4117
+ suggestedAccounts: {
4118
+ [key: string]: unknown;
4119
+ };
4120
+ /**
4121
+ * Alternative rules that also match
4122
+ */
4123
+ alternatives: unknown[];
4124
+ /**
4125
+ * Human-readable reasons for the match
4126
+ */
4127
+ reasons: Array<string>;
4128
+ };
4129
+
4130
+ export type NlpAccountConfirmationDataDto = {
4131
+ /**
4132
+ * The invalid account name
4133
+ */
4134
+ invalidAccount: string;
4135
+ /**
4136
+ * Suggested replacement account
4137
+ */
4138
+ suggestedAccount: string;
4139
+ /**
4140
+ * Similar accounts for user selection
4141
+ */
4142
+ similarAccounts: Array<string>;
4143
+ /**
4144
+ * Error message explaining the issue
4145
+ */
4146
+ errorMessage: string;
4147
+ /**
4148
+ * Transaction context for reference
4149
+ */
4150
+ transactionContext: {
4151
+ [key: string]: unknown;
4152
+ };
4153
+ };
4154
+
4155
+ export type NlpSuggestedPayeeDto = {
4156
+ /**
4157
+ * Payee ID
4158
+ */
4159
+ id: string;
4160
+ /**
4161
+ * Payee name
4162
+ */
4163
+ name: string;
4164
+ /**
4165
+ * Payee category
4166
+ */
4167
+ category?: string;
4168
+ /**
4169
+ * Source of the payee
4170
+ */
4171
+ source?: 'user' | 'global';
4172
+ /**
4173
+ * PayeeProfile ID (if matched from global)
4174
+ */
4175
+ payeeProfileId?: string;
4176
+ };
4177
+
4178
+ /**
4179
+ * Source of the payee
4180
+ */
4181
+ export type source = 'user' | 'global';
4182
+
4183
+ export type NlpAlternativePayeeDto = {
4184
+ /**
4185
+ * Payee ID
4186
+ */
4187
+ id: string;
4188
+ /**
4189
+ * Payee name
4190
+ */
4191
+ name: string;
4192
+ /**
4193
+ * Similarity score (0-1)
4194
+ */
4195
+ similarity: number;
4196
+ };
4197
+
4198
+ export type NlpPayeeConfirmationDataDto = {
4199
+ /**
4200
+ * Confidence score for the payee match (0-1)
4201
+ */
4202
+ confidence: number;
4203
+ /**
4204
+ * Original payee string from user input
4205
+ */
4206
+ originalPayee: string;
4207
+ /**
4208
+ * Suggested payee to use (null when no similar payees found)
4209
+ */
4210
+ suggestedPayee?: NlpSuggestedPayeeDto | null;
4211
+ /**
4212
+ * Similarity score between original and suggested (0-1)
4213
+ */
4214
+ similarity: number;
4215
+ /**
4216
+ * Alternative payee options
4217
+ */
4218
+ alternatives: Array<NlpAlternativePayeeDto>;
4219
+ /**
4220
+ * Human-readable reasons for the match
4221
+ */
4222
+ reasons: Array<string>;
4223
+ };
4224
+
4225
+ export type RecurringMatchInfoDto = {
4226
+ /**
4227
+ * Expected transaction ID
4228
+ */
4229
+ expectedId: string;
4230
+ /**
4231
+ * Recurring rule ID
4232
+ */
4233
+ ruleId: string;
4234
+ /**
4235
+ * Rule name for display
4236
+ */
4237
+ ruleName: string;
4238
+ /**
4239
+ * Rule icon
4240
+ */
4241
+ ruleIcon?: string;
4242
+ /**
4243
+ * Expected date (YYYY-MM-DD)
4244
+ */
4245
+ expectedDate: string;
4246
+ /**
4247
+ * Expected amount
4248
+ */
4249
+ expectedAmount: number;
4250
+ /**
4251
+ * Match confidence score (0-1)
4252
+ */
4253
+ confidence: number;
4254
+ /**
4255
+ * Whether auto-matched (confidence >= 0.82)
4256
+ */
4257
+ isAutoMatched: boolean;
4258
+ };
4259
+
4260
+ export type NlpSuggestedAccountDto = {
4261
+ /**
4262
+ * Suggested account path
4263
+ */
4264
+ account: string;
4265
+ /**
4266
+ * Confidence score for this suggestion (0-1)
4267
+ */
4268
+ confidence?: number;
4269
+ };
4270
+
4271
+ export type NlpSuggestedAccountsDto = {
4272
+ /**
4273
+ * Source account suggestion (where money comes from). For expense: asset/liability account. For income: income account.
4274
+ */
4275
+ source?: NlpSuggestedAccountDto;
4276
+ /**
4277
+ * Destination account suggestion (where money goes to). For expense: expense account. For income: asset/liability account.
4278
+ */
4279
+ destination?: NlpSuggestedAccountDto;
4280
+ };
4281
+
4282
+ export type NlpDefaultAccountsDto = {
4283
+ /**
4284
+ * Default asset account
4285
+ */
4286
+ asset: string;
4287
+ /**
4288
+ * Default expense account
4289
+ */
4290
+ expense: string;
4291
+ /**
4292
+ * Default income account
4293
+ */
4294
+ income: string;
4295
+ /**
4296
+ * Default liability account
4297
+ */
4298
+ liability: string;
4299
+ };
4300
+
4301
+ export type NlpResponseDto = {
4302
+ /**
4303
+ * Response status
4304
+ */
4305
+ status: 'success' | 'pending' | 'error';
4306
+ /**
4307
+ * Action taken or requested
4308
+ */
4309
+ action:
4310
+ | 'created'
4311
+ | 'ask'
4312
+ | 'confirm'
4313
+ | 'confirm_duplicate'
4314
+ | 'confirm_rule'
4315
+ | 'confirm_account'
4316
+ | 'confirm_payee'
4317
+ | 'cancel';
4318
+ /**
4319
+ * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4320
+ */
4321
+ intent?: 'expense' | 'asset' | 'income' | 'liability' | 'equity';
4322
+ /**
4323
+ * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4324
+ */
4325
+ assetSubType?: 'transfer' | 'banking' | 'investment';
4326
+ /**
4327
+ * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
4328
+ */
4329
+ liabilitySubType?: 'borrow' | 'repay';
4330
+ /**
4331
+ * Equity sub-type (only present when intent is "equity"). opening: account opening balance (Equity → Assets), adjustment: balance correction.
4332
+ */
4333
+ equitySubType?: 'opening' | 'adjustment';
4334
+ /**
4335
+ * Payment source for expense transactions (v6.1). Indicates whether payment comes from asset or liability account. Only present when intent is "expense".
4336
+ */
4337
+ paymentSource?: 'asset' | 'liability';
4338
+ /**
4339
+ * Liability account type hint for credit card/BNPL spending (v6.1). Only present when paymentSource is "liability". Values: CreditCard, Huabei, Baitiao
4340
+ */
4341
+ liabilityHint?: string;
4342
+ /**
4343
+ * Human-readable message (for ask or error actions). Deprecated: Use messageKey for i18n support.
4344
+ * @deprecated
4345
+ */
4346
+ message?: string;
4347
+ /**
4348
+ * i18n message key for frontend translation. Use this instead of message for internationalization support.
4349
+ */
4350
+ messageKey?: string;
4351
+ /**
4352
+ * Parameters for message interpolation. Used with messageKey for dynamic values in translated messages.
4353
+ */
4354
+ messageParams?: {
4355
+ [key: string]: unknown;
4356
+ };
4357
+ /**
4358
+ * Session ID for multi-turn dialogue. Must be included in subsequent requests to continue the conversation.
4359
+ */
4360
+ sessionId?: string;
4361
+ /**
4362
+ * Which slot is waiting for user input
4363
+ */
4364
+ waitingFor?: string;
4365
+ /**
4366
+ * Created transaction info (for created action)
4367
+ */
4368
+ transaction?: NlpTransactionInfoDto;
4369
+ /**
4370
+ * Parsed data for confirmation (when action is "confirm"). Contains extracted fields that user should verify before transaction creation.
4371
+ */
4372
+ parsedData?: NlpParsedDataDto;
4373
+ /**
4374
+ * Duplicate detection data (when action is "confirm_duplicate"). Contains information about potential duplicate transaction for user confirmation.
4375
+ */
4376
+ duplicateData?: NlpDuplicateConfirmationDataDto;
4377
+ /**
4378
+ * Rule match data (when action is "confirm_rule"). Contains information about medium-confidence rule match for user confirmation.
4379
+ */
4380
+ ruleData?: NlpRuleConfirmationDataDto;
4381
+ /**
4382
+ * Account validation data (when action is "confirm_account"). Contains information about invalid account for user correction.
4383
+ */
4384
+ accountData?: NlpAccountConfirmationDataDto;
4385
+ /**
4386
+ * Payee confirmation data (when action is "confirm_payee"). Contains information about medium/low confidence payee match for user confirmation.
4387
+ */
4388
+ payeeData?: NlpPayeeConfirmationDataDto;
4389
+ /**
4390
+ * Overall confidence score (0-1)
4391
+ */
4392
+ confidence?: number;
4393
+ /**
4394
+ * Confidence threshold for automatic creation (default: 0.75). When confidence < threshold, action will be "confirm" requiring user verification.
4395
+ */
4396
+ confidenceThreshold?: number;
4397
+ /**
4398
+ * Recurring transaction match info (when action is "created"). Contains match details when transaction matches a pending expected transaction.
4399
+ */
4400
+ recurringMatch?: RecurringMatchInfoDto;
4401
+ /**
4402
+ * Recurring rule creation suggestion (when action is "created"). Contains suggestion to create a recurring rule based on detected patterns. Only present when no existing rule matched and similar historical transactions were found.
4403
+ */
4404
+ recurringSuggestion?: RecurringSuggestionDto;
4405
+ /**
4406
+ * Suggested accounts for this transaction. Contains recommended source and destination accounts based on the detected intent and rules.
4407
+ */
4408
+ suggestedAccounts?: NlpSuggestedAccountsDto;
4409
+ /**
4410
+ * Default accounts for the user/region. These are fallback accounts used when no specific suggestion is available.
4411
+ */
4412
+ defaultAccounts?: NlpDefaultAccountsDto;
4413
+ };
4414
+
4415
+ /**
4416
+ * Response status
4417
+ */
4418
+ export type status4 = 'success' | 'pending' | 'error';
4419
+
4420
+ /**
4421
+ * Action taken or requested
4422
+ */
4423
+ export type action2 =
4424
+ | 'created'
4425
+ | 'ask'
4426
+ | 'confirm'
4427
+ | 'confirm_duplicate'
4428
+ | 'confirm_rule'
4429
+ | 'confirm_account'
4430
+ | 'confirm_payee'
4431
+ | 'cancel';
4432
+
4433
+ /**
4434
+ * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4435
+ */
4436
+ export type intent = 'expense' | 'asset' | 'income' | 'liability' | 'equity';
4437
+
4438
+ /**
4439
+ * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4440
+ */
4441
+ export type assetSubType = 'transfer' | 'banking' | 'investment';
4442
+
4443
+ /**
4444
+ * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
4445
+ */
4446
+ export type liabilitySubType = 'borrow' | 'repay';
4447
+
4448
+ /**
4449
+ * Equity sub-type (only present when intent is "equity"). opening: account opening balance (Equity → Assets), adjustment: balance correction.
4450
+ */
4451
+ export type equitySubType = 'opening' | 'adjustment';
4452
+
4453
+ export type PlatformListItemDto = {
4454
+ /**
4455
+ * Global platform ID
4456
+ */
4457
+ id: string;
4458
+ /**
4459
+ * Platform name
4460
+ */
4461
+ name: string;
4462
+ /**
4463
+ * Platform URL
4464
+ */
4465
+ url: string;
4466
+ /**
4467
+ * Platform type
4468
+ */
4469
+ type:
3401
4470
  | 'BANK'
3402
4471
  | 'BROKERAGE'
3403
4472
  | 'CRYPTO_EXCHANGE'
@@ -3406,94 +4475,176 @@ export type UpdatePlatformDto = {
3406
4475
  | 'INSURANCE'
3407
4476
  | 'OTHER';
3408
4477
  /**
3409
- * Platform logo URL
4478
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
3410
4479
  */
3411
- logoUrl?: string;
4480
+ canonical: string;
3412
4481
  /**
3413
- * Whether the platform is active
4482
+ * Suggested path segment — canonical with first char uppercased (ACC_COMP_NAME_RE)
3414
4483
  */
3415
- isActive?: boolean;
4484
+ suggestedSegment: string;
4485
+ /**
4486
+ * Logo URL
4487
+ */
4488
+ logoUrl: string | null;
4489
+ /**
4490
+ * Whether user has accounts using this platform
4491
+ */
4492
+ isBound: boolean;
3416
4493
  };
3417
4494
 
3418
- export type ProviderSyncConfigDto = {
4495
+ /**
4496
+ * Platform type
4497
+ */
4498
+ export type type3 =
4499
+ | 'BANK'
4500
+ | 'BROKERAGE'
4501
+ | 'CRYPTO_EXCHANGE'
4502
+ | 'PAYMENT'
4503
+ | 'INVESTMENT'
4504
+ | 'INSURANCE'
4505
+ | 'OTHER';
4506
+
4507
+ export type PlatformMatchResultDto = {
3419
4508
  /**
3420
- * Source account for the first posting
4509
+ * Global platform ID
3421
4510
  */
3422
- sourceAccount: string;
4511
+ id: string;
3423
4512
  /**
3424
- * Default currency for transactions
4513
+ * Platform name (e.g., "ICBC")
3425
4514
  */
3426
- defaultCurrency: string;
4515
+ name: string;
3427
4516
  /**
3428
- * Default expense account for the second posting
4517
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
3429
4518
  */
3430
- defaultExpenseAccount: string;
4519
+ canonical: string;
3431
4520
  /**
3432
- * Default income account for the second posting
4521
+ * Platform type
3433
4522
  */
3434
- defaultIncomeAccount: string;
4523
+ type:
4524
+ | 'BANK'
4525
+ | 'BROKERAGE'
4526
+ | 'CRYPTO_EXCHANGE'
4527
+ | 'PAYMENT'
4528
+ | 'INVESTMENT'
4529
+ | 'INSURANCE'
4530
+ | 'OTHER';
3435
4531
  /**
3436
- * Filter pending transactions
4532
+ * Suggested path segment — canonical, already in ACCOUNT_RE format
3437
4533
  */
3438
- filterPending?: boolean;
4534
+ suggestedSegment: string;
4535
+ /**
4536
+ * Logo URL
4537
+ */
4538
+ logoUrl: string | null;
4539
+ /**
4540
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4541
+ */
4542
+ matchType: 'exact' | 'prefix' | 'substring';
3439
4543
  };
3440
4544
 
3441
- export type ProviderSyncDto = {
4545
+ /**
4546
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4547
+ */
4548
+ export type matchType = 'exact' | 'prefix' | 'substring';
4549
+
4550
+ export type PlatformMatchResponseDto = {
3442
4551
  /**
3443
- * Provider name (already in URL path, optional here for reference)
4552
+ * Ranked matches, best tier first (at most 10 rows)
3444
4553
  */
3445
- provider?: string;
4554
+ platforms: Array<PlatformMatchResultDto>;
3446
4555
  /**
3447
- * Unique sync identifier for idempotency
4556
+ * Overall match quality — top row's tier, or 'none' when no hits
3448
4557
  */
3449
- syncId?: string;
4558
+ matchType: 'none' | 'exact' | 'prefix' | 'substring';
3450
4559
  /**
3451
- * Provider sync configuration
4560
+ * Total matches before LIMIT (truncation transparency)
3452
4561
  */
3453
- config: ProviderSyncConfigDto;
4562
+ total: number;
3454
4563
  /**
3455
- * Raw transactions from provider
4564
+ * true when total > platforms.length (more matches exist)
3456
4565
  */
3457
- transactions: unknown[];
4566
+ hasMore: boolean;
3458
4567
  };
3459
4568
 
3460
- export type SupportedProvidersResponseDto = {
4569
+ /**
4570
+ * Overall match quality — top row's tier, or 'none' when no hits
4571
+ */
4572
+ export type matchType2 = 'none' | 'exact' | 'prefix' | 'substring';
4573
+
4574
+ export type CreatePlatformDto = {
3461
4575
  /**
3462
- * List of supported provider names
4576
+ * Platform name
3463
4577
  */
3464
- providers: Array<string>;
3465
- };
3466
-
3467
- export type ParserTelemetryReportDto = unknown;
3468
-
3469
- export type UncoveredFormatMissDto = unknown;
3470
-
3471
- export type ProcessNlpDto = {
4578
+ name: string;
3472
4579
  /**
3473
- * Natural language text describing a transaction (Chinese)
4580
+ * Platform canonical identifier (lowercase, kebab-case)
3474
4581
  */
3475
- message: string;
4582
+ canonical: string;
3476
4583
  /**
3477
- * Session ID for multi-turn conversation (auto-generated if not provided)
4584
+ * Platform aliases (multi-language names for lookup)
3478
4585
  */
3479
- sessionId?: string;
4586
+ aliases: Array<string>;
3480
4587
  /**
3481
- * Parsed data from previous NLP response for session recovery. Send back the parsedData received in confirm_payee/confirm responses.
4588
+ * Platform URL
3482
4589
  */
3483
- parsedData?: {
3484
- [key: string]: unknown;
3485
- };
4590
+ url: string;
4591
+ /**
4592
+ * Platform type
4593
+ */
4594
+ type:
4595
+ | 'BANK'
4596
+ | 'BROKERAGE'
4597
+ | 'CRYPTO_EXCHANGE'
4598
+ | 'PAYMENT'
4599
+ | 'INVESTMENT'
4600
+ | 'INSURANCE'
4601
+ | 'OTHER';
4602
+ /**
4603
+ * Platform logo URL
4604
+ */
4605
+ logoUrl?: string;
4606
+ /**
4607
+ * Whether the platform is active
4608
+ */
4609
+ isActive?: boolean;
3486
4610
  };
3487
4611
 
3488
- export type BalanceByCurrencyDto = {
4612
+ export type UpdatePlatformDto = {
4613
+ /**
4614
+ * Platform name
4615
+ */
4616
+ name?: string;
4617
+ /**
4618
+ * Platform canonical identifier (lowercase, kebab-case)
4619
+ */
4620
+ canonical?: string;
4621
+ /**
4622
+ * Platform aliases (multi-language names for lookup)
4623
+ */
4624
+ aliases?: Array<string>;
4625
+ /**
4626
+ * Platform URL
4627
+ */
4628
+ url?: string;
4629
+ /**
4630
+ * Platform type
4631
+ */
4632
+ type?:
4633
+ | 'BANK'
4634
+ | 'BROKERAGE'
4635
+ | 'CRYPTO_EXCHANGE'
4636
+ | 'PAYMENT'
4637
+ | 'INVESTMENT'
4638
+ | 'INSURANCE'
4639
+ | 'OTHER';
3489
4640
  /**
3490
- * ISO 4217 currency code
4641
+ * Platform logo URL
3491
4642
  */
3492
- currency: string;
4643
+ logoUrl?: string;
3493
4644
  /**
3494
- * Balance amount
4645
+ * Whether the platform is active
3495
4646
  */
3496
- balance: string;
4647
+ isActive?: boolean;
3497
4648
  };
3498
4649
 
3499
4650
  export type NetWorthByCurrencyDto = {
@@ -3536,21 +4687,6 @@ export type ConvertedNetWorthDto = {
3536
4687
  };
3537
4688
  };
3538
4689
 
3539
- export type ExchangeRateWarningDto = {
3540
- /**
3541
- * Warning type
3542
- */
3543
- type: string;
3544
- /**
3545
- * Currency without exchange rate
3546
- */
3547
- currency: string;
3548
- /**
3549
- * Total amount affected
3550
- */
3551
- totalAmount: string;
3552
- };
3553
-
3554
4690
  export type NetWorthResponseDto = {
3555
4691
  /**
3556
4692
  * Total net worth (assets - liabilities, converted to base currency)
@@ -3615,6 +4751,10 @@ export type AccountItemDto = {
3615
4751
  * Currency code
3616
4752
  */
3617
4753
  currency: string;
4754
+ /**
4755
+ * FX-converted balance in base currency; omitted when not convertible
4756
+ */
4757
+ convertedBalance?: string;
3618
4758
  };
3619
4759
 
3620
4760
  export type PlatformGroupDto = {
@@ -3631,9 +4771,40 @@ export type PlatformGroupDto = {
3631
4771
  */
3632
4772
  accounts: Array<AccountItemDto>;
3633
4773
  /**
3634
- * Total balance across all accounts in platform
4774
+ * FX-converted total balance in base currency
3635
4775
  */
3636
4776
  totalBalance: string;
4777
+ /**
4778
+ * Raw (unconverted) balances grouped by currency
4779
+ */
4780
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4781
+ /**
4782
+ * Converted balance in base currency (omitted when no currency is convertible)
4783
+ */
4784
+ convertedBalance?: string;
4785
+ /**
4786
+ * Share of the grand converted total (0-100); 0 when grand total is 0
4787
+ */
4788
+ sharePct: number;
4789
+ };
4790
+
4791
+ export type AccountExchangeRateWarningDto = {
4792
+ /**
4793
+ * Warning type
4794
+ */
4795
+ type: string;
4796
+ /**
4797
+ * Currency without exchange rate
4798
+ */
4799
+ currency: string;
4800
+ /**
4801
+ * Affected account paths
4802
+ */
4803
+ accounts: Array<string>;
4804
+ /**
4805
+ * Total amount in this currency
4806
+ */
4807
+ totalAmount: string;
3637
4808
  };
3638
4809
 
3639
4810
  export type AccountsSummaryDto = {
@@ -3645,6 +4816,14 @@ export type AccountsSummaryDto = {
3645
4816
  * Total number of platforms
3646
4817
  */
3647
4818
  totalPlatforms: number;
4819
+ /**
4820
+ * Base currency for conversion
4821
+ */
4822
+ baseCurrency: string;
4823
+ /**
4824
+ * Per-account exchange rate warnings
4825
+ */
4826
+ warnings?: Array<AccountExchangeRateWarningDto>;
3648
4827
  };
3649
4828
 
3650
4829
  export type AccountsResponseDto = {
@@ -3679,6 +4858,10 @@ export type AccountItemWithAssetClassDto = {
3679
4858
  * Currency code
3680
4859
  */
3681
4860
  currency: string;
4861
+ /**
4862
+ * FX-converted balance in base currency; omitted when not convertible
4863
+ */
4864
+ convertedBalance?: string;
3682
4865
  /**
3683
4866
  * Asset class
3684
4867
  */
@@ -3704,7 +4887,7 @@ export type AccountItemWithAssetClassDto = {
3704
4887
  /**
3705
4888
  * ADR-0105 classification provenance (holding level always; account level only on FALLBACK)
3706
4889
  */
3707
- export type source =
4890
+ export type source2 =
3708
4891
  | 'USER_META'
3709
4892
  | 'FIAT_CURRENCY'
3710
4893
  | 'OPENBB_MAPPING'
@@ -3760,25 +4943,6 @@ export type assetClass =
3760
4943
  | 'REAL_ESTATE'
3761
4944
  | 'INDEX';
3762
4945
 
3763
- export type AccountExchangeRateWarningDto = {
3764
- /**
3765
- * Warning type
3766
- */
3767
- type: string;
3768
- /**
3769
- * Currency without exchange rate
3770
- */
3771
- currency: string;
3772
- /**
3773
- * Affected account paths
3774
- */
3775
- accounts: Array<string>;
3776
- /**
3777
- * Total amount in this currency
3778
- */
3779
- totalAmount: string;
3780
- };
3781
-
3782
4946
  export type AssetClassSummaryDto = {
3783
4947
  /**
3784
4948
  * Total number of accounts
@@ -3944,6 +5108,63 @@ export type CashFlowResponseDto = {
3944
5108
  warnings?: Array<ExchangeRateWarningDto>;
3945
5109
  };
3946
5110
 
5111
+ export type CategoryGroupDto = {
5112
+ /**
5113
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
5114
+ */
5115
+ category: string;
5116
+ /**
5117
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
5118
+ */
5119
+ totalExpense: string;
5120
+ /**
5121
+ * Share of grand total (0-100); 0 when grand total is 0
5122
+ */
5123
+ sharePct: number;
5124
+ /**
5125
+ * Raw (unconverted) expense per currency
5126
+ */
5127
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
5128
+ /**
5129
+ * Converted total in base currency (omitted when FX missing for all currencies in this category)
5130
+ */
5131
+ convertedBalance?: string;
5132
+ };
5133
+
5134
+ export type ExpensesByCategorySummaryDto = {
5135
+ /**
5136
+ * Total across all categories, converted (convertible categories only); expense totals when flow=expense, income totals when flow=income
5137
+ */
5138
+ totalExpense: string;
5139
+ /**
5140
+ * Number of categories
5141
+ */
5142
+ categoryCount: number;
5143
+ };
5144
+
5145
+ export type ExpensesByCategoryResponseDto = {
5146
+ /**
5147
+ * Period requested
5148
+ */
5149
+ period: string;
5150
+ /**
5151
+ * Base currency for converted values
5152
+ */
5153
+ baseCurrency: string;
5154
+ /**
5155
+ * Expense groups by functional category, sorted by converted total desc
5156
+ */
5157
+ groups: Array<CategoryGroupDto>;
5158
+ /**
5159
+ * Summary statistics
5160
+ */
5161
+ summary: ExpensesByCategorySummaryDto;
5162
+ /**
5163
+ * Exchange rate warnings (e.g. missing rate for a currency)
5164
+ */
5165
+ warnings?: Array<ExchangeRateWarningDto>;
5166
+ };
5167
+
3947
5168
  export type MonetaryDto = {
3948
5169
  /**
3949
5170
  * Amount (Decimal string)
@@ -3983,7 +5204,7 @@ export type CurrentPriceDto = {
3983
5204
  /**
3984
5205
  * Price source
3985
5206
  */
3986
- export type source2 = 'USER_OVERRIDE' | 'OPENBB_EQUITY' | 'OPENBB_CURRENCY';
5207
+ export type source3 = 'USER_OVERRIDE' | 'OPENBB_EQUITY' | 'OPENBB_CURRENCY';
3987
5208
 
3988
5209
  export type FxRateDto = {
3989
5210
  from: string;
@@ -4139,185 +5360,160 @@ export type HoldingPnlResponseDto = {
4139
5360
  */
4140
5361
  export type method = 'average' | 'FIFO';
4141
5362
 
4142
- export type CreateBeanPriceDto = {
5363
+ export type CurrencyBalanceDto = {
4143
5364
  /**
4144
- * Currency being priced (e.g., USD, AAPL, BTC)
5365
+ * ISO 4217 currency code
4145
5366
  */
4146
5367
  currency: string;
4147
5368
  /**
4148
- * Quote currency (pricing currency, e.g., CNY, EUR)
5369
+ * Balance amount
4149
5370
  */
4150
- quoteCurrency: string;
5371
+ balance: string;
5372
+ };
5373
+
5374
+ export type TimeSeriesPointDto = {
4151
5375
  /**
4152
- * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
5376
+ * Date in YYYY-MM-DD format
4153
5377
  */
4154
- amount: number;
5378
+ date: string;
4155
5379
  /**
4156
- * Price date (ISO 8601 format)
5380
+ * Value at this date (in base currency)
4157
5381
  */
4158
- date: string;
5382
+ value: string;
4159
5383
  /**
4160
- * Metadata (validated by Zod schema, max field lengths enforced)
5384
+ * Change from previous point
4161
5385
  */
4162
- metadata?: {
5386
+ change?: {
4163
5387
  [key: string]: unknown;
4164
5388
  };
4165
- };
4166
-
4167
- export type PriceResponseDto = {
4168
- /**
4169
- * Unique identifier
4170
- */
4171
- id: string;
4172
- /**
4173
- * User ID (owner of the price)
4174
- */
4175
- userId: string;
4176
5389
  /**
4177
- * Currency being priced (e.g., USD, AAPL, BTC)
5390
+ * Total assets at this date (in base currency)
4178
5391
  */
4179
- currency: string;
5392
+ assets?: string;
4180
5393
  /**
4181
- * Quote currency (pricing currency, e.g., USD, CNY)
5394
+ * Total liabilities at this date (in base currency)
4182
5395
  */
4183
- quoteCurrency: string;
5396
+ liabilities?: string;
4184
5397
  /**
4185
- * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
5398
+ * Multi-currency breakdown for this point
4186
5399
  */
4187
- amount: number;
5400
+ byCurrency?: Array<CurrencyBalanceDto>;
5401
+ };
5402
+
5403
+ export type TrendSummaryDto = {
4188
5404
  /**
4189
- * Price date (ISO 8601 format). Represents the date this price was valid.
5405
+ * Value at start of period
4190
5406
  */
4191
- date: string;
5407
+ startValue: string;
4192
5408
  /**
4193
- * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
5409
+ * Value at end of period
4194
5410
  */
4195
- meta: {
4196
- [key: string]: unknown;
4197
- };
5411
+ endValue: string;
4198
5412
  /**
4199
- * Creation timestamp
5413
+ * Total change over period
4200
5414
  */
4201
- createdAt: string;
5415
+ totalChange: string;
4202
5416
  /**
4203
- * Last update timestamp
5417
+ * Total change percentage
4204
5418
  */
4205
- updatedAt: string;
5419
+ totalChangePercentage: string;
4206
5420
  };
4207
5421
 
4208
- export type PriceListResponseDto = {
5422
+ export type MultiCurrencyPointDto = {
4209
5423
  /**
4210
- * List of prices
5424
+ * Date in YYYY-MM-DD format
4211
5425
  */
4212
- items: Array<PriceResponseDto>;
5426
+ date: string;
4213
5427
  /**
4214
- * Total number of prices
5428
+ * Balances by currency
4215
5429
  */
4216
- total: number;
5430
+ byCurrency: Array<CurrencyBalanceDto>;
4217
5431
  };
4218
5432
 
4219
- export type UpdateBeanPriceDto = {
4220
- /**
4221
- * Currency being priced
4222
- */
4223
- currency?: string;
5433
+ export type PortfolioTrendsResponseDto = {
4224
5434
  /**
4225
- * Quote currency (pricing currency)
5435
+ * Time series data points
4226
5436
  */
4227
- quoteCurrency?: string;
5437
+ series: Array<TimeSeriesPointDto>;
4228
5438
  /**
4229
- * Price amount (MUST be >= 0 per Beancount spec)
5439
+ * Period summary
4230
5440
  */
4231
- amount?: number;
5441
+ summary: TrendSummaryDto;
4232
5442
  /**
4233
- * Price date (ISO 8601 format)
5443
+ * Period requested
4234
5444
  */
4235
- date?: string;
5445
+ period: string;
4236
5446
  /**
4237
- * Metadata
5447
+ * Data granularity
4238
5448
  */
4239
- metadata?: {
4240
- [key: string]: unknown;
4241
- };
4242
- };
4243
-
4244
- export type CurrencyBalanceDto = {
5449
+ granularity: string;
4245
5450
  /**
4246
- * ISO 4217 currency code
5451
+ * Base currency for converted values
4247
5452
  */
4248
5453
  currency: string;
4249
5454
  /**
4250
- * Balance amount
4251
- */
4252
- balance: string;
4253
- };
4254
-
4255
- export type TimeSeriesPointDto = {
4256
- /**
4257
- * Date in YYYY-MM-DD format
4258
- */
4259
- date: string;
4260
- /**
4261
- * Value at this date (in base currency)
4262
- */
4263
- value: string;
4264
- /**
4265
- * Change from previous point
5455
+ * Multi-currency time series (each point has currency breakdown)
4266
5456
  */
4267
- change?: {
4268
- [key: string]: unknown;
4269
- };
5457
+ byCurrency?: Array<MultiCurrencyPointDto>;
4270
5458
  /**
4271
- * Multi-currency breakdown for this point
5459
+ * Exchange rate warnings
4272
5460
  */
4273
- byCurrency?: Array<CurrencyBalanceDto>;
5461
+ warnings?: Array<ExchangeRateWarningDto>;
4274
5462
  };
4275
5463
 
4276
- export type TrendSummaryDto = {
5464
+ export type CashFlowPointDto = {
4277
5465
  /**
4278
- * Value at start of period
5466
+ * Month key (YYYY-MM)
4279
5467
  */
4280
- startValue: string;
5468
+ month: string;
4281
5469
  /**
4282
- * Value at end of period
5470
+ * Income in base currency (absolute, converted)
4283
5471
  */
4284
- endValue: string;
5472
+ income: string;
4285
5473
  /**
4286
- * Total change over period
5474
+ * Expense in base currency (absolute, converted)
4287
5475
  */
4288
- totalChange: string;
5476
+ expense: string;
4289
5477
  /**
4290
- * Total change percentage
5478
+ * netSavings = income − expense (savings positive)
4291
5479
  */
4292
- totalChangePercentage: string;
5480
+ netSavings: string;
4293
5481
  };
4294
5482
 
4295
- export type MultiCurrencyPointDto = {
5483
+ export type CashFlowTrendSummaryDto = {
4296
5484
  /**
4297
- * Date in YYYY-MM-DD format
5485
+ * Total income across the period
4298
5486
  */
4299
- date: string;
5487
+ totalIncome: string;
4300
5488
  /**
4301
- * Balances by currency
5489
+ * Total expense across the period
4302
5490
  */
4303
- byCurrency: Array<CurrencyBalanceDto>;
5491
+ totalExpense: string;
5492
+ /**
5493
+ * income − expense across the period
5494
+ */
5495
+ totalNetSavings: string;
5496
+ /**
5497
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
5498
+ */
5499
+ averageMonthlyNetSavings: string;
4304
5500
  };
4305
5501
 
4306
- export type PortfolioTrendsResponseDto = {
5502
+ export type CashFlowTrendsResponseDto = {
4307
5503
  /**
4308
- * Time series data points
5504
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
4309
5505
  */
4310
- series: Array<TimeSeriesPointDto>;
5506
+ series: Array<CashFlowPointDto>;
4311
5507
  /**
4312
- * Period summary
5508
+ * Period totals
4313
5509
  */
4314
- summary: TrendSummaryDto;
5510
+ summary: CashFlowTrendSummaryDto;
4315
5511
  /**
4316
5512
  * Period requested
4317
5513
  */
4318
5514
  period: string;
4319
5515
  /**
4320
- * Data granularity
5516
+ * Data granularity (v1 returns month buckets)
4321
5517
  */
4322
5518
  granularity: string;
4323
5519
  /**
@@ -4325,11 +5521,7 @@ export type PortfolioTrendsResponseDto = {
4325
5521
  */
4326
5522
  currency: string;
4327
5523
  /**
4328
- * Multi-currency time series (each point has currency breakdown)
4329
- */
4330
- byCurrency?: Array<MultiCurrencyPointDto>;
4331
- /**
4332
- * Exchange rate warnings
5524
+ * Exchange rate warnings (e.g. missing rate for a currency)
4333
5525
  */
4334
5526
  warnings?: Array<ExchangeRateWarningDto>;
4335
5527
  };
@@ -4349,6 +5541,13 @@ export type AnonymousLoginDto = {
4349
5541
  accessToken: string;
4350
5542
  };
4351
5543
 
5544
+ export type AnonymousLoginResponseDto = {
5545
+ /**
5546
+ * JWT auth token
5547
+ */
5548
+ authToken: string;
5549
+ };
5550
+
4352
5551
  export type AccountControllerCreateData = {
4353
5552
  /**
4354
5553
  * Region code for tenant context
@@ -4357,7 +5556,7 @@ export type AccountControllerCreateData = {
4357
5556
  requestBody: CreateAccountDto;
4358
5557
  };
4359
5558
 
4360
- export type AccountControllerCreateResponse = unknown;
5559
+ export type AccountControllerCreateResponse = AccountResponseDto;
4361
5560
 
4362
5561
  export type AccountControllerFindAllData = {
4363
5562
  /**
@@ -4377,7 +5576,7 @@ export type AccountControllerFindAllData = {
4377
5576
  */
4378
5577
  region: 'cn' | 'us' | 'de' | 'gb';
4379
5578
  /**
4380
- * Search term for path or i18nKey
5579
+ * Search term for account path
4381
5580
  */
4382
5581
  search?: string;
4383
5582
  /**
@@ -4406,6 +5605,9 @@ export type AccountControllerFindOneData = {
4406
5605
  export type AccountControllerFindOneResponse = AccountResponseDto;
4407
5606
 
4408
5607
  export type AccountControllerUpdateData = {
5608
+ /**
5609
+ * Account UUID
5610
+ */
4409
5611
  id: string;
4410
5612
  /**
4411
5613
  * Region code for tenant context
@@ -4414,9 +5616,12 @@ export type AccountControllerUpdateData = {
4414
5616
  requestBody: UpdateAccountDto;
4415
5617
  };
4416
5618
 
4417
- export type AccountControllerUpdateResponse = unknown;
5619
+ export type AccountControllerUpdateResponse = AccountResponseDto;
4418
5620
 
4419
5621
  export type AccountControllerDeleteData = {
5622
+ /**
5623
+ * Account UUID
5624
+ */
4420
5625
  id: string;
4421
5626
  /**
4422
5627
  * Region code for tenant context
@@ -4424,9 +5629,12 @@ export type AccountControllerDeleteData = {
4424
5629
  region: 'cn' | 'us' | 'de' | 'gb';
4425
5630
  };
4426
5631
 
4427
- export type AccountControllerDeleteResponse = unknown;
5632
+ export type AccountControllerDeleteResponse = void;
4428
5633
 
4429
5634
  export type AccountControllerCloseData = {
5635
+ /**
5636
+ * Account UUID
5637
+ */
4430
5638
  id: string;
4431
5639
  /**
4432
5640
  * Region code for tenant context
@@ -4435,9 +5643,12 @@ export type AccountControllerCloseData = {
4435
5643
  requestBody: CloseAccountDto;
4436
5644
  };
4437
5645
 
4438
- export type AccountControllerCloseResponse = unknown;
5646
+ export type AccountControllerCloseResponse = AccountResponseDto;
4439
5647
 
4440
5648
  export type AccountControllerReopenData = {
5649
+ /**
5650
+ * Account UUID
5651
+ */
4441
5652
  id: string;
4442
5653
  /**
4443
5654
  * Region code for tenant context
@@ -4446,7 +5657,22 @@ export type AccountControllerReopenData = {
4446
5657
  requestBody: ReopenAccountDto;
4447
5658
  };
4448
5659
 
4449
- export type AccountControllerReopenResponse = unknown;
5660
+ export type AccountControllerReopenResponse = AccountResponseDto;
5661
+
5662
+ export type AccountControllerAddOpeningBalanceData = {
5663
+ /**
5664
+ * Account UUID
5665
+ */
5666
+ id: string;
5667
+ /**
5668
+ * Region code for tenant context
5669
+ */
5670
+ region: 'cn' | 'us' | 'de' | 'gb';
5671
+ requestBody: CreateOpeningBalanceDto;
5672
+ };
5673
+
5674
+ export type AccountControllerAddOpeningBalanceResponse =
5675
+ OpeningBalanceResultDto;
4450
5676
 
4451
5677
  export type AccountStandardsControllerGetTemplatesData = {
4452
5678
  /**
@@ -4508,6 +5734,10 @@ export type TransactionControllerListData = {
4508
5734
  * Filter by account ID (transactions with postings to this account)
4509
5735
  */
4510
5736
  accountId?: string;
5737
+ /**
5738
+ * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
5739
+ */
5740
+ category?: string;
4511
5741
  /**
4512
5742
  * Filter by start date (inclusive), format: YYYY-MM-DD
4513
5743
  */
@@ -4632,7 +5862,7 @@ export type TransactionControllerDeleteResponse = void;
4632
5862
 
4633
5863
  export type BalanceControllerGetBalanceData = {
4634
5864
  /**
4635
- * Account name (e.g., "Assets:Bank:Checking")
5865
+ * Account name (e.g., "Assets:Checking")
4636
5866
  */
4637
5867
  account: string;
4638
5868
  /**
@@ -5034,6 +6264,103 @@ export type CommodityControllerBulkCreateData = {
5034
6264
 
5035
6265
  export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
5036
6266
 
6267
+ export type PriceControllerCreateData = {
6268
+ /**
6269
+ * Region code for tenant context
6270
+ */
6271
+ region: 'cn' | 'us' | 'de' | 'gb';
6272
+ requestBody: CreateBeanPriceDto;
6273
+ };
6274
+
6275
+ export type PriceControllerCreateResponse = PriceResponseDto;
6276
+
6277
+ export type PriceControllerFindAllData = {
6278
+ /**
6279
+ * Filter by currency (e.g., BTC, AAPL, USD)
6280
+ */
6281
+ currency?: string;
6282
+ /**
6283
+ * Filter prices from this date (ISO 8601 format)
6284
+ */
6285
+ dateFrom?: string;
6286
+ /**
6287
+ * Filter prices to this date (ISO 8601 format)
6288
+ */
6289
+ dateTo?: string;
6290
+ /**
6291
+ * Number of items per page (default: 20, max: 100)
6292
+ */
6293
+ limit?: number;
6294
+ /**
6295
+ * Page number for pagination (default: 1)
6296
+ */
6297
+ page?: number;
6298
+ /**
6299
+ * Filter by quote currency (pricing currency, e.g., USD, CNY)
6300
+ */
6301
+ quoteCurrency?: string;
6302
+ /**
6303
+ * Region code for tenant context
6304
+ */
6305
+ region: 'cn' | 'us' | 'de' | 'gb';
6306
+ /**
6307
+ * Search term for currency or quoteCurrency (case-insensitive partial match)
6308
+ */
6309
+ search?: string;
6310
+ };
6311
+
6312
+ export type PriceControllerFindAllResponse = PriceListResponseDto;
6313
+
6314
+ export type PriceControllerFindOneData = {
6315
+ /**
6316
+ * Price ID
6317
+ */
6318
+ id: string;
6319
+ /**
6320
+ * Region code for tenant context
6321
+ */
6322
+ region: 'cn' | 'us' | 'de' | 'gb';
6323
+ };
6324
+
6325
+ export type PriceControllerFindOneResponse = PriceResponseDto;
6326
+
6327
+ export type PriceControllerUpdateData = {
6328
+ /**
6329
+ * Price ID
6330
+ */
6331
+ id: string;
6332
+ /**
6333
+ * Region code for tenant context
6334
+ */
6335
+ region: 'cn' | 'us' | 'de' | 'gb';
6336
+ requestBody: UpdateBeanPriceDto;
6337
+ };
6338
+
6339
+ export type PriceControllerUpdateResponse = PriceResponseDto;
6340
+
6341
+ export type PriceControllerDeleteData = {
6342
+ /**
6343
+ * Price ID
6344
+ */
6345
+ id: string;
6346
+ /**
6347
+ * Region code for tenant context
6348
+ */
6349
+ region: 'cn' | 'us' | 'de' | 'gb';
6350
+ };
6351
+
6352
+ export type PriceControllerDeleteResponse = void;
6353
+
6354
+ export type PriceControllerBulkCreateData = {
6355
+ /**
6356
+ * Region code for tenant context
6357
+ */
6358
+ region: 'cn' | 'us' | 'de' | 'gb';
6359
+ requestBody: Array<string>;
6360
+ };
6361
+
6362
+ export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
6363
+
5037
6364
  export type RecurringRuleControllerCreateData = {
5038
6365
  /**
5039
6366
  * Region code for tenant context
@@ -5428,7 +6755,7 @@ export type UserControllerSignupUserData = {
5428
6755
  requestBody: SignupDto;
5429
6756
  };
5430
6757
 
5431
- export type UserControllerSignupUserResponse = unknown;
6758
+ export type UserControllerSignupUserResponse = SignupResponseDto;
5432
6759
 
5433
6760
  export type UserControllerDeleteUserData = {
5434
6761
  /**
@@ -5499,6 +6826,159 @@ export type PropertyControllerDeleteData = {
5499
6826
 
5500
6827
  export type PropertyControllerDeleteResponse = void;
5501
6828
 
6829
+ export type EventControllerCreateData = {
6830
+ /**
6831
+ * Region code for tenant context (decorative for life events)
6832
+ */
6833
+ region: 'cn' | 'us' | 'de' | 'gb';
6834
+ requestBody: CreateBeanEventDto;
6835
+ };
6836
+
6837
+ export type EventControllerCreateResponse = EventResponseDto;
6838
+
6839
+ export type EventControllerFindAllData = {
6840
+ /**
6841
+ * Filter life events from this date (ISO 8601 format)
6842
+ */
6843
+ from?: string;
6844
+ /**
6845
+ * Number of items per page (default: 20, max: 100)
6846
+ */
6847
+ limit?: number;
6848
+ /**
6849
+ * Page number for pagination (default: 1)
6850
+ */
6851
+ page?: number;
6852
+ /**
6853
+ * Search term for description (case-insensitive partial match)
6854
+ */
6855
+ q?: string;
6856
+ /**
6857
+ * Region code for tenant context (decorative for life events)
6858
+ */
6859
+ region: 'cn' | 'us' | 'de' | 'gb';
6860
+ /**
6861
+ * Filter life events to this date (ISO 8601 format)
6862
+ */
6863
+ to?: string;
6864
+ /**
6865
+ * Filter by life event type (exact match)
6866
+ */
6867
+ type?: string;
6868
+ };
6869
+
6870
+ export type EventControllerFindAllResponse = EventListResponseDto;
6871
+
6872
+ export type EventControllerFindOneData = {
6873
+ /**
6874
+ * Life event ID
6875
+ */
6876
+ id: string;
6877
+ /**
6878
+ * Region code for tenant context (decorative for life events)
6879
+ */
6880
+ region: 'cn' | 'us' | 'de' | 'gb';
6881
+ };
6882
+
6883
+ export type EventControllerFindOneResponse = EventResponseDto;
6884
+
6885
+ export type EventControllerUpdateData = {
6886
+ /**
6887
+ * Life event ID
6888
+ */
6889
+ id: string;
6890
+ /**
6891
+ * Region code for tenant context (decorative for life events)
6892
+ */
6893
+ region: 'cn' | 'us' | 'de' | 'gb';
6894
+ requestBody: UpdateBeanEventDto;
6895
+ };
6896
+
6897
+ export type EventControllerUpdateResponse = EventResponseDto;
6898
+
6899
+ export type EventControllerDeleteData = {
6900
+ /**
6901
+ * Life event ID
6902
+ */
6903
+ id: string;
6904
+ /**
6905
+ * Region code for tenant context (decorative for life events)
6906
+ */
6907
+ region: 'cn' | 'us' | 'de' | 'gb';
6908
+ };
6909
+
6910
+ export type EventControllerDeleteResponse = void;
6911
+
6912
+ export type EventControllerGetSliceData = {
6913
+ accountPattern: string;
6914
+ granularity: string;
6915
+ /**
6916
+ * Life event ID
6917
+ */
6918
+ id: string;
6919
+ /**
6920
+ * Region code for tenant context (decorative for life events)
6921
+ */
6922
+ region: 'cn' | 'us' | 'de' | 'gb';
6923
+ };
6924
+
6925
+ export type EventControllerGetSliceResponse = unknown;
6926
+
6927
+ export type OnboardingControllerBootstrapData = {
6928
+ /**
6929
+ * Region code for tenant context
6930
+ */
6931
+ region: 'cn' | 'us' | 'de' | 'gb';
6932
+ requestBody: OnboardingDto;
6933
+ };
6934
+
6935
+ export type OnboardingControllerBootstrapResponse = unknown;
6936
+
6937
+ export type ReconciliationControllerComputeData = {
6938
+ /**
6939
+ * Region code for tenant context (decorative for reconciliation)
6940
+ */
6941
+ region: 'cn' | 'us' | 'de' | 'gb';
6942
+ requestBody: ComputeReconciliationDto;
6943
+ };
6944
+
6945
+ export type ReconciliationControllerComputeResponse =
6946
+ ReconciliationComputeResultDto;
6947
+
6948
+ export type ReconciliationControllerAssertData = {
6949
+ /**
6950
+ * Region code for tenant context (decorative for reconciliation)
6951
+ */
6952
+ region: 'cn' | 'us' | 'de' | 'gb';
6953
+ requestBody: AssertReconciliationDto;
6954
+ };
6955
+
6956
+ export type ReconciliationControllerAssertResponse = ReconciliationRecordDto;
6957
+
6958
+ export type ReconciliationControllerPadData = {
6959
+ /**
6960
+ * Region code for tenant context (decorative for reconciliation)
6961
+ */
6962
+ region: 'cn' | 'us' | 'de' | 'gb';
6963
+ requestBody: PadReconciliationDto;
6964
+ };
6965
+
6966
+ export type ReconciliationControllerPadResponse = PadResultDto;
6967
+
6968
+ export type ReconciliationControllerHistoryData = {
6969
+ /**
6970
+ * BeanAccount id
6971
+ */
6972
+ accountId: string;
6973
+ /**
6974
+ * Region code for tenant context (decorative for reconciliation)
6975
+ */
6976
+ region: 'cn' | 'us' | 'de' | 'gb';
6977
+ };
6978
+
6979
+ export type ReconciliationControllerHistoryResponse =
6980
+ Array<ReconciliationRecordDto>;
6981
+
5502
6982
  export type ExportControllerExportBeancountResponse = unknown;
5503
6983
 
5504
6984
  export type FileImportControllerImportFileData = {
@@ -5528,13 +7008,25 @@ export type FileImportControllerIdentifyFileData = {
5528
7008
  export type FileImportControllerIdentifyFileResponse = IdentifyResultDto;
5529
7009
 
5530
7010
  export type FileImportControllerImportBeancountData = {
7011
+ /**
7012
+ * Beancount file to import
7013
+ */
7014
+ formData: FileImportDto;
5531
7015
  /**
5532
7016
  * Region code for tenant context
5533
7017
  */
5534
7018
  region: 'cn' | 'us' | 'de' | 'gb';
5535
7019
  };
5536
7020
 
5537
- export type FileImportControllerImportBeancountResponse = unknown;
7021
+ export type FileImportControllerImportBeancountResponse = {
7022
+ imported?: number;
7023
+ skipped?: number;
7024
+ failed?: number;
7025
+ accountsCreated?: number;
7026
+ errors?: Array<{
7027
+ [key: string]: unknown;
7028
+ }>;
7029
+ };
5538
7030
 
5539
7031
  export type ImporterConfigControllerGetConfigData = {
5540
7032
  /**
@@ -5579,81 +7071,93 @@ export type ImporterConfigControllerResetConfigData = {
5579
7071
 
5580
7072
  export type ImporterConfigControllerResetConfigResponse = ImporterConfigDto;
5581
7073
 
5582
- export type PlatformControllerFindAllResponse = unknown;
5583
-
5584
- export type PlatformControllerCreateData = {
5585
- requestBody: CreatePlatformDto;
5586
- };
5587
-
5588
- export type PlatformControllerCreateResponse = unknown;
5589
-
5590
- export type PlatformControllerGetPlatformListResponse = unknown;
5591
-
5592
- export type PlatformControllerMatchPlatformsData = {
7074
+ export type ProviderSyncControllerSyncData = {
5593
7075
  /**
5594
- * Search query — Chinese name, English name, or abbreviation
7076
+ * Provider name
5595
7077
  */
5596
- q: string;
7078
+ providerName:
7079
+ | 'plaid'
7080
+ | 'teller'
7081
+ | 'truelayer'
7082
+ | 'gocardless'
7083
+ | 'simplefin'
7084
+ | 'yodlee'
7085
+ | 'beancount-direct'
7086
+ | 'parsed-bill';
5597
7087
  /**
5598
- * Region code for category override lookup
7088
+ * Region code for tenant context
5599
7089
  */
5600
- region?: string;
7090
+ region: 'cn' | 'us' | 'de' | 'gb';
7091
+ requestBody: ProviderSyncDto;
5601
7092
  };
5602
7093
 
5603
- export type PlatformControllerMatchPlatformsResponse = unknown;
7094
+ export type ProviderSyncControllerSyncResponse = ProviderSyncResponseDto;
5604
7095
 
5605
- export type PlatformControllerUpdateData = {
7096
+ export type ProviderSyncControllerGetSupportedProvidersData = {
5606
7097
  /**
5607
- * Platform ID
7098
+ * Region code for tenant context
5608
7099
  */
5609
- id: string;
5610
- requestBody: UpdatePlatformDto;
7100
+ region: 'cn' | 'us' | 'de' | 'gb';
5611
7101
  };
5612
7102
 
5613
- export type PlatformControllerUpdateResponse = unknown;
7103
+ export type ProviderSyncControllerGetSupportedProvidersResponse =
7104
+ SupportedProvidersResponseDto;
5614
7105
 
5615
- export type PlatformControllerDeleteData = {
7106
+ export type ProviderSyncControllerIsProviderSupportedData = {
5616
7107
  /**
5617
- * Platform ID
7108
+ * Provider name to check
5618
7109
  */
5619
- id: string;
7110
+ providerName: string;
7111
+ /**
7112
+ * Region code for tenant context
7113
+ */
7114
+ region: 'cn' | 'us' | 'de' | 'gb';
5620
7115
  };
5621
7116
 
5622
- export type PlatformControllerDeleteResponse = void;
7117
+ export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
5623
7118
 
5624
- export type ProviderSyncControllerSyncData = {
5625
- providerName: string;
7119
+ export type ExternalAccountLinkControllerCreateData = {
5626
7120
  /**
5627
7121
  * Region code for tenant context
5628
7122
  */
5629
7123
  region: 'cn' | 'us' | 'de' | 'gb';
5630
- requestBody: ProviderSyncDto;
7124
+ requestBody: CreateExternalAccountLinkDto;
5631
7125
  };
5632
7126
 
5633
- export type ProviderSyncControllerSyncResponse = unknown;
7127
+ export type ExternalAccountLinkControllerCreateResponse =
7128
+ ExternalAccountLinkResponseDto;
5634
7129
 
5635
- export type ProviderSyncControllerGetSupportedProvidersData = {
7130
+ export type ExternalAccountLinkControllerFindAllData = {
7131
+ provider: string;
5636
7132
  /**
5637
7133
  * Region code for tenant context
5638
7134
  */
5639
7135
  region: 'cn' | 'us' | 'de' | 'gb';
5640
7136
  };
5641
7137
 
5642
- export type ProviderSyncControllerGetSupportedProvidersResponse =
5643
- SupportedProvidersResponseDto;
7138
+ export type ExternalAccountLinkControllerFindAllResponse =
7139
+ ExternalAccountLinkListResponseDto;
5644
7140
 
5645
- export type ProviderSyncControllerIsProviderSupportedData = {
7141
+ export type ExternalAccountLinkControllerFindOneData = {
7142
+ id: string;
5646
7143
  /**
5647
- * Provider name to check
7144
+ * Region code for tenant context
5648
7145
  */
5649
- providerName: string;
7146
+ region: 'cn' | 'us' | 'de' | 'gb';
7147
+ };
7148
+
7149
+ export type ExternalAccountLinkControllerFindOneResponse =
7150
+ ExternalAccountLinkResponseDto;
7151
+
7152
+ export type ExternalAccountLinkControllerRemoveData = {
7153
+ id: string;
5650
7154
  /**
5651
7155
  * Region code for tenant context
5652
7156
  */
5653
7157
  region: 'cn' | 'us' | 'de' | 'gb';
5654
7158
  };
5655
7159
 
5656
- export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
7160
+ export type ExternalAccountLinkControllerRemoveResponse = void;
5657
7161
 
5658
7162
  export type TelemetryControllerReportTelemetryData = {
5659
7163
  /**
@@ -5693,10 +7197,13 @@ export type NlpControllerProcessNaturalLanguageData = {
5693
7197
  * Region code for tenant context
5694
7198
  */
5695
7199
  region: 'cn' | 'us' | 'de' | 'gb';
7200
+ /**
7201
+ * Natural language transaction input with optional session ID
7202
+ */
5696
7203
  requestBody: ProcessNlpDto;
5697
7204
  };
5698
7205
 
5699
- export type NlpControllerProcessNaturalLanguageResponse = unknown;
7206
+ export type NlpControllerProcessNaturalLanguageResponse = NlpResponseDto;
5700
7207
 
5701
7208
  export type NlpControllerClearSessionData = {
5702
7209
  /**
@@ -5724,6 +7231,49 @@ export type NlpControllerGetSessionData = {
5724
7231
 
5725
7232
  export type NlpControllerGetSessionResponse = unknown;
5726
7233
 
7234
+ export type PlatformControllerFindAllResponse = unknown;
7235
+
7236
+ export type PlatformControllerCreateData = {
7237
+ requestBody: CreatePlatformDto;
7238
+ };
7239
+
7240
+ export type PlatformControllerCreateResponse = unknown;
7241
+
7242
+ export type PlatformControllerGetPlatformListResponse =
7243
+ Array<PlatformListItemDto>;
7244
+
7245
+ export type PlatformControllerMatchPlatformsData = {
7246
+ /**
7247
+ * Search query — Chinese name, English name, or abbreviation
7248
+ */
7249
+ q: string;
7250
+ /**
7251
+ * Region code for category override lookup
7252
+ */
7253
+ region?: string;
7254
+ };
7255
+
7256
+ export type PlatformControllerMatchPlatformsResponse = PlatformMatchResponseDto;
7257
+
7258
+ export type PlatformControllerUpdateData = {
7259
+ /**
7260
+ * Platform ID
7261
+ */
7262
+ id: string;
7263
+ requestBody: UpdatePlatformDto;
7264
+ };
7265
+
7266
+ export type PlatformControllerUpdateResponse = unknown;
7267
+
7268
+ export type PlatformControllerDeleteData = {
7269
+ /**
7270
+ * Platform ID
7271
+ */
7272
+ id: string;
7273
+ };
7274
+
7275
+ export type PlatformControllerDeleteResponse = void;
7276
+
5727
7277
  export type DashboardControllerGetNetWorthData = {
5728
7278
  /**
5729
7279
  * Date for balance calculation (ISO 8601 format)
@@ -5778,127 +7328,70 @@ export type DashboardControllerGetCashFlowData = {
5778
7328
 
5779
7329
  export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
5780
7330
 
5781
- export type HoldingPnlControllerGetHoldingPnlData = {
5782
- /**
5783
- * Scope to a single account
5784
- */
5785
- accountId?: string;
5786
- /**
5787
- * As-of date (ISO 8601), defaults to today
5788
- */
5789
- asOf?: string;
5790
- /**
5791
- * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
5792
- */
5793
- method?: 'FIFO' | 'average';
5794
- /**
5795
- * Region code for tenant context
5796
- */
5797
- region: 'cn' | 'us' | 'de' | 'gb';
5798
- };
5799
-
5800
- export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
5801
-
5802
- export type PriceControllerCreateData = {
5803
- /**
5804
- * Region code for tenant context
5805
- */
5806
- region: 'cn' | 'us' | 'de' | 'gb';
5807
- requestBody: CreateBeanPriceDto;
5808
- };
5809
-
5810
- export type PriceControllerCreateResponse = PriceResponseDto;
5811
-
5812
- export type PriceControllerFindAllData = {
5813
- /**
5814
- * Filter by currency (e.g., BTC, AAPL, USD)
5815
- */
5816
- currency?: string;
5817
- /**
5818
- * Filter prices from this date (ISO 8601 format)
5819
- */
5820
- dateFrom?: string;
7331
+ export type DashboardControllerGetExpensesData = {
5821
7332
  /**
5822
- * Filter prices to this date (ISO 8601 format)
5823
- */
5824
- dateTo?: string;
5825
- /**
5826
- * Number of items per page (default: 20, max: 100)
7333
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
5827
7334
  */
5828
- limit?: number;
7335
+ flow?: 'expense' | 'income';
5829
7336
  /**
5830
- * Page number for pagination (default: 1)
7337
+ * Grouping strategy
5831
7338
  */
5832
- page?: number;
7339
+ groupBy?: 'category';
5833
7340
  /**
5834
- * Filter by quote currency (pricing currency, e.g., USD, CNY)
7341
+ * Time window (1m = current calendar month)
5835
7342
  */
5836
- quoteCurrency?: string;
7343
+ period?: '1m' | '3m' | '6m' | '1y';
5837
7344
  /**
5838
7345
  * Region code for tenant context
5839
7346
  */
5840
7347
  region: 'cn' | 'us' | 'de' | 'gb';
5841
- /**
5842
- * Search term for currency or quoteCurrency (case-insensitive partial match)
5843
- */
5844
- search?: string;
5845
7348
  };
5846
7349
 
5847
- export type PriceControllerFindAllResponse = PriceListResponseDto;
7350
+ export type DashboardControllerGetExpensesResponse =
7351
+ ExpensesByCategoryResponseDto;
5848
7352
 
5849
- export type PriceControllerFindOneData = {
7353
+ export type HoldingPnlControllerGetHoldingPnlData = {
5850
7354
  /**
5851
- * Price ID
7355
+ * Scope to a single account
5852
7356
  */
5853
- id: string;
7357
+ accountId?: string;
5854
7358
  /**
5855
- * Region code for tenant context
7359
+ * As-of date (ISO 8601), defaults to today
5856
7360
  */
5857
- region: 'cn' | 'us' | 'de' | 'gb';
5858
- };
5859
-
5860
- export type PriceControllerFindOneResponse = PriceResponseDto;
5861
-
5862
- export type PriceControllerUpdateData = {
7361
+ asOf?: string;
5863
7362
  /**
5864
- * Price ID
7363
+ * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
5865
7364
  */
5866
- id: string;
7365
+ method?: 'FIFO' | 'average';
5867
7366
  /**
5868
7367
  * Region code for tenant context
5869
7368
  */
5870
7369
  region: 'cn' | 'us' | 'de' | 'gb';
5871
- requestBody: UpdateBeanPriceDto;
5872
7370
  };
5873
7371
 
5874
- export type PriceControllerUpdateResponse = PriceResponseDto;
7372
+ export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
5875
7373
 
5876
- export type PriceControllerDeleteData = {
7374
+ export type ReportingControllerGetPortfolioTrendsData = {
5877
7375
  /**
5878
- * Price ID
7376
+ * Data granularity
5879
7377
  */
5880
- id: string;
7378
+ granularity?: 'day' | 'week' | 'month';
5881
7379
  /**
5882
- * Region code for tenant context
7380
+ * Time period
5883
7381
  */
5884
- region: 'cn' | 'us' | 'de' | 'gb';
5885
- };
5886
-
5887
- export type PriceControllerDeleteResponse = void;
5888
-
5889
- export type PriceControllerBulkCreateData = {
7382
+ period?: '1m' | '3m' | '6m' | '1y';
5890
7383
  /**
5891
7384
  * Region code for tenant context
5892
7385
  */
5893
7386
  region: 'cn' | 'us' | 'de' | 'gb';
5894
- requestBody: Array<string>;
5895
7387
  };
5896
7388
 
5897
- export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
7389
+ export type ReportingControllerGetPortfolioTrendsResponse =
7390
+ PortfolioTrendsResponseDto;
5898
7391
 
5899
- export type ReportingControllerGetPortfolioTrendsData = {
7392
+ export type ReportingControllerGetCashFlowTrendsData = {
5900
7393
  /**
5901
- * Data granularity
7394
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
5902
7395
  */
5903
7396
  granularity?: 'day' | 'week' | 'month';
5904
7397
  /**
@@ -5911,8 +7404,8 @@ export type ReportingControllerGetPortfolioTrendsData = {
5911
7404
  region: 'cn' | 'us' | 'de' | 'gb';
5912
7405
  };
5913
7406
 
5914
- export type ReportingControllerGetPortfolioTrendsResponse =
5915
- PortfolioTrendsResponseDto;
7407
+ export type ReportingControllerGetCashFlowTrendsResponse =
7408
+ CashFlowTrendsResponseDto;
5916
7409
 
5917
7410
  export type ReportingControllerGenerateSnapshotData = {
5918
7411
  /**
@@ -5945,7 +7438,7 @@ export type AuthControllerAccessTokenLoginData = {
5945
7438
  requestBody: AnonymousLoginDto;
5946
7439
  };
5947
7440
 
5948
- export type AuthControllerAccessTokenLoginResponse = unknown;
7441
+ export type AuthControllerAccessTokenLoginResponse = AnonymousLoginResponseDto;
5949
7442
 
5950
7443
  export type CacheControllerFlushCacheResponse = unknown;
5951
7444
 
@@ -5990,7 +7483,14 @@ export type $OpenApiTs = {
5990
7483
  post: {
5991
7484
  req: AccountControllerCreateData;
5992
7485
  res: {
5993
- 201: unknown;
7486
+ /**
7487
+ * Account created successfully
7488
+ */
7489
+ 201: AccountResponseDto;
7490
+ /**
7491
+ * Account already exists
7492
+ */
7493
+ 409: unknown;
5994
7494
  };
5995
7495
  };
5996
7496
  get: {
@@ -6010,39 +7510,98 @@ export type $OpenApiTs = {
6010
7510
  /**
6011
7511
  * Account retrieved successfully
6012
7512
  */
6013
- 200: AccountResponseDto;
7513
+ 200: AccountResponseDto;
7514
+ /**
7515
+ * Account not found
7516
+ */
7517
+ 404: unknown;
7518
+ };
7519
+ };
7520
+ put: {
7521
+ req: AccountControllerUpdateData;
7522
+ res: {
7523
+ /**
7524
+ * Account updated successfully
7525
+ */
7526
+ 200: AccountResponseDto;
7527
+ /**
7528
+ * Account not found
7529
+ */
7530
+ 404: unknown;
7531
+ };
7532
+ };
7533
+ delete: {
7534
+ req: AccountControllerDeleteData;
7535
+ res: {
7536
+ /**
7537
+ * Account deleted successfully
7538
+ */
7539
+ 204: void;
7540
+ /**
7541
+ * Account not found
7542
+ */
7543
+ 404: unknown;
7544
+ /**
7545
+ * Account has transactions and cannot be deleted
7546
+ */
7547
+ 409: unknown;
7548
+ };
7549
+ };
7550
+ };
7551
+ '/api/v1/{region}/bean/accounts/{id}/close': {
7552
+ post: {
7553
+ req: AccountControllerCloseData;
7554
+ res: {
7555
+ /**
7556
+ * Account closed successfully
7557
+ */
7558
+ 200: AccountResponseDto;
7559
+ /**
7560
+ * Account is already closed
7561
+ */
7562
+ 400: unknown;
6014
7563
  /**
6015
7564
  * Account not found
6016
7565
  */
6017
7566
  404: unknown;
6018
7567
  };
6019
7568
  };
6020
- put: {
6021
- req: AccountControllerUpdateData;
6022
- res: {
6023
- 200: unknown;
6024
- };
6025
- };
6026
- delete: {
6027
- req: AccountControllerDeleteData;
6028
- res: {
6029
- 200: unknown;
6030
- };
6031
- };
6032
7569
  };
6033
- '/api/v1/{region}/bean/accounts/{id}/close': {
7570
+ '/api/v1/{region}/bean/accounts/{id}/reopen': {
6034
7571
  post: {
6035
- req: AccountControllerCloseData;
7572
+ req: AccountControllerReopenData;
6036
7573
  res: {
6037
- 201: unknown;
7574
+ /**
7575
+ * Account reopened successfully
7576
+ */
7577
+ 200: AccountResponseDto;
7578
+ /**
7579
+ * Account is not closed
7580
+ */
7581
+ 400: unknown;
7582
+ /**
7583
+ * Account not found
7584
+ */
7585
+ 404: unknown;
6038
7586
  };
6039
7587
  };
6040
7588
  };
6041
- '/api/v1/{region}/bean/accounts/{id}/reopen': {
7589
+ '/api/v1/{region}/bean/accounts/{id}/opening-balance': {
6042
7590
  post: {
6043
- req: AccountControllerReopenData;
7591
+ req: AccountControllerAddOpeningBalanceData;
6044
7592
  res: {
6045
- 201: unknown;
7593
+ /**
7594
+ * Opening-balance transaction created
7595
+ */
7596
+ 201: OpeningBalanceResultDto;
7597
+ /**
7598
+ * Account not found
7599
+ */
7600
+ 404: unknown;
7601
+ /**
7602
+ * An opening balance already exists for this account
7603
+ */
7604
+ 409: unknown;
6046
7605
  };
6047
7606
  };
6048
7607
  };
@@ -6654,6 +8213,90 @@ export type $OpenApiTs = {
6654
8213
  };
6655
8214
  };
6656
8215
  };
8216
+ '/api/v1/{region}/bean/prices': {
8217
+ post: {
8218
+ req: PriceControllerCreateData;
8219
+ res: {
8220
+ /**
8221
+ * Price created successfully
8222
+ */
8223
+ 201: PriceResponseDto;
8224
+ /**
8225
+ * Currency or quoteCurrency commodity not found
8226
+ */
8227
+ 404: unknown;
8228
+ /**
8229
+ * Price already exists for this currency pair and date
8230
+ */
8231
+ 409: unknown;
8232
+ };
8233
+ };
8234
+ get: {
8235
+ req: PriceControllerFindAllData;
8236
+ res: {
8237
+ /**
8238
+ * Prices retrieved successfully
8239
+ */
8240
+ 200: PriceListResponseDto;
8241
+ };
8242
+ };
8243
+ };
8244
+ '/api/v1/{region}/bean/prices/{id}': {
8245
+ get: {
8246
+ req: PriceControllerFindOneData;
8247
+ res: {
8248
+ /**
8249
+ * Price retrieved successfully
8250
+ */
8251
+ 200: PriceResponseDto;
8252
+ /**
8253
+ * Price not found
8254
+ */
8255
+ 404: unknown;
8256
+ };
8257
+ };
8258
+ put: {
8259
+ req: PriceControllerUpdateData;
8260
+ res: {
8261
+ /**
8262
+ * Price updated successfully
8263
+ */
8264
+ 200: PriceResponseDto;
8265
+ /**
8266
+ * Price not found
8267
+ */
8268
+ 404: unknown;
8269
+ /**
8270
+ * Updated price conflicts with existing price
8271
+ */
8272
+ 409: unknown;
8273
+ };
8274
+ };
8275
+ delete: {
8276
+ req: PriceControllerDeleteData;
8277
+ res: {
8278
+ /**
8279
+ * Price deleted successfully
8280
+ */
8281
+ 204: void;
8282
+ /**
8283
+ * Price not found
8284
+ */
8285
+ 404: unknown;
8286
+ };
8287
+ };
8288
+ };
8289
+ '/api/v1/{region}/bean/prices/bulk': {
8290
+ post: {
8291
+ req: PriceControllerBulkCreateData;
8292
+ res: {
8293
+ /**
8294
+ * Prices created successfully
8295
+ */
8296
+ 201: Array<PriceResponseDto>;
8297
+ };
8298
+ };
8299
+ };
6657
8300
  '/api/v1/{region}/bean/recurring-rules': {
6658
8301
  post: {
6659
8302
  req: RecurringRuleControllerCreateData;
@@ -7141,7 +8784,7 @@ export type $OpenApiTs = {
7141
8784
  /**
7142
8785
  * User created successfully
7143
8786
  */
7144
- 201: unknown;
8787
+ 201: SignupResponseDto;
7145
8788
  /**
7146
8789
  * Invalid Turnstile token (when Turnstile is enabled)
7147
8790
  */
@@ -7298,6 +8941,181 @@ export type $OpenApiTs = {
7298
8941
  };
7299
8942
  };
7300
8943
  };
8944
+ '/api/v1/{region}/bean/events': {
8945
+ post: {
8946
+ req: EventControllerCreateData;
8947
+ res: {
8948
+ /**
8949
+ * Life event created successfully
8950
+ */
8951
+ 201: EventResponseDto;
8952
+ /**
8953
+ * Life event already exists for this (userId, type, date) combination
8954
+ */
8955
+ 409: unknown;
8956
+ };
8957
+ };
8958
+ get: {
8959
+ req: EventControllerFindAllData;
8960
+ res: {
8961
+ /**
8962
+ * Life events retrieved successfully
8963
+ */
8964
+ 200: EventListResponseDto;
8965
+ };
8966
+ };
8967
+ };
8968
+ '/api/v1/{region}/bean/events/{id}': {
8969
+ get: {
8970
+ req: EventControllerFindOneData;
8971
+ res: {
8972
+ /**
8973
+ * Life event retrieved successfully
8974
+ */
8975
+ 200: EventResponseDto;
8976
+ /**
8977
+ * Life event not found
8978
+ */
8979
+ 404: unknown;
8980
+ };
8981
+ };
8982
+ put: {
8983
+ req: EventControllerUpdateData;
8984
+ res: {
8985
+ /**
8986
+ * Life event updated successfully
8987
+ */
8988
+ 200: EventResponseDto;
8989
+ /**
8990
+ * If-Match header is not a valid ISO 8601 date
8991
+ */
8992
+ 400: unknown;
8993
+ /**
8994
+ * Life event not found
8995
+ */
8996
+ 404: unknown;
8997
+ /**
8998
+ * Updated event conflicts with an existing (userId, type, date) combination
8999
+ */
9000
+ 409: unknown;
9001
+ /**
9002
+ * If-Match precondition failed (updatedAt mismatch)
9003
+ */
9004
+ 412: unknown;
9005
+ };
9006
+ };
9007
+ delete: {
9008
+ req: EventControllerDeleteData;
9009
+ res: {
9010
+ /**
9011
+ * Life event deleted successfully
9012
+ */
9013
+ 204: void;
9014
+ /**
9015
+ * Life event not found
9016
+ */
9017
+ 404: unknown;
9018
+ };
9019
+ };
9020
+ };
9021
+ '/api/v1/{region}/bean/events/{id}/slice': {
9022
+ get: {
9023
+ req: EventControllerGetSliceData;
9024
+ res: {
9025
+ /**
9026
+ * Time-series sliced by the life event range
9027
+ */
9028
+ 200: unknown;
9029
+ /**
9030
+ * accountPattern query param is empty
9031
+ */
9032
+ 400: unknown;
9033
+ /**
9034
+ * Life event not found
9035
+ */
9036
+ 404: unknown;
9037
+ };
9038
+ };
9039
+ };
9040
+ '/api/v1/{region}/bean/onboarding': {
9041
+ post: {
9042
+ req: OnboardingControllerBootstrapData;
9043
+ res: {
9044
+ /**
9045
+ * Onboarding bootstrap result.
9046
+ */
9047
+ 201: unknown;
9048
+ /**
9049
+ * Invalid region/account path/duplicate paths.
9050
+ */
9051
+ 422: unknown;
9052
+ };
9053
+ };
9054
+ };
9055
+ '/api/v1/{region}/bean/reconciliations': {
9056
+ post: {
9057
+ req: ReconciliationControllerComputeData;
9058
+ res: {
9059
+ /**
9060
+ * Reconciliation preview
9061
+ */
9062
+ 200: ReconciliationComputeResultDto;
9063
+ /**
9064
+ * Account not found
9065
+ */
9066
+ 404: unknown;
9067
+ };
9068
+ };
9069
+ };
9070
+ '/api/v1/{region}/bean/reconciliations/assert': {
9071
+ post: {
9072
+ req: ReconciliationControllerAssertData;
9073
+ res: {
9074
+ /**
9075
+ * Balance assertion recorded
9076
+ */
9077
+ 201: ReconciliationRecordDto;
9078
+ /**
9079
+ * Account not found
9080
+ */
9081
+ 404: unknown;
9082
+ };
9083
+ };
9084
+ };
9085
+ '/api/v1/{region}/bean/reconciliations/pad': {
9086
+ post: {
9087
+ req: ReconciliationControllerPadData;
9088
+ res: {
9089
+ /**
9090
+ * Pad adjusting entry generated
9091
+ */
9092
+ 201: PadResultDto;
9093
+ /**
9094
+ * Book already within tolerance — no pad needed
9095
+ */
9096
+ 400: unknown;
9097
+ /**
9098
+ * Account not found
9099
+ */
9100
+ 404: unknown;
9101
+ };
9102
+ };
9103
+ };
9104
+ '/api/v1/{region}/bean/accounts/{accountId}/reconciliations': {
9105
+ get: {
9106
+ req: ReconciliationControllerHistoryData;
9107
+ res: {
9108
+ /**
9109
+ * Reconciliation history
9110
+ */
9111
+ 200: Array<ReconciliationRecordDto>;
9112
+ /**
9113
+ * Account not found
9114
+ */
9115
+ 404: unknown;
9116
+ };
9117
+ };
9118
+ };
7301
9119
  '/api/v1/{region}/bean/export/beancount': {
7302
9120
  get: {
7303
9121
  res: {
@@ -7378,7 +9196,22 @@ export type $OpenApiTs = {
7378
9196
  post: {
7379
9197
  req: FileImportControllerImportBeancountData;
7380
9198
  res: {
7381
- 201: unknown;
9199
+ /**
9200
+ * Beancount file imported successfully
9201
+ */
9202
+ 200: {
9203
+ imported?: number;
9204
+ skipped?: number;
9205
+ failed?: number;
9206
+ accountsCreated?: number;
9207
+ errors?: Array<{
9208
+ [key: string]: unknown;
9209
+ }>;
9210
+ };
9211
+ /**
9212
+ * Bad request - invalid file or no file uploaded
9213
+ */
9214
+ 400: ApiProblemResponseDto;
7382
9215
  };
7383
9216
  };
7384
9217
  };
@@ -7433,113 +9266,104 @@ export type $OpenApiTs = {
7433
9266
  };
7434
9267
  };
7435
9268
  };
7436
- '/api/v1/bean/platforms': {
7437
- get: {
9269
+ '/api/v1/{region}/bean/import/provider/{providerName}/sync': {
9270
+ post: {
9271
+ req: ProviderSyncControllerSyncData;
7438
9272
  res: {
7439
9273
  /**
7440
- * List of platforms with binding and account counts
9274
+ * Sync completed successfully
7441
9275
  */
7442
- 200: unknown;
7443
- };
7444
- };
7445
- post: {
7446
- req: PlatformControllerCreateData;
7447
- res: {
9276
+ 200: ProviderSyncResponseDto;
7448
9277
  /**
7449
- * Platform created successfully
9278
+ * Invalid request data
7450
9279
  */
7451
- 201: unknown;
9280
+ 400: unknown;
7452
9281
  /**
7453
- * Platform already exists
9282
+ * Missing or invalid authentication
7454
9283
  */
7455
- 409: unknown;
7456
- };
7457
- };
7458
- };
7459
- '/api/v1/bean/platforms/list': {
7460
- get: {
7461
- res: {
9284
+ 401: unknown;
7462
9285
  /**
7463
- * List of platforms with user binding status
9286
+ * Provider not supported
7464
9287
  */
7465
- 200: unknown;
9288
+ 404: unknown;
7466
9289
  };
7467
9290
  };
7468
9291
  };
7469
- '/api/v1/bean/platforms/match': {
9292
+ '/api/v1/{region}/bean/import/provider/supported': {
7470
9293
  get: {
7471
- req: PlatformControllerMatchPlatformsData;
9294
+ req: ProviderSyncControllerGetSupportedProvidersData;
7472
9295
  res: {
7473
9296
  /**
7474
- * List of matching platforms with suggested segment names
9297
+ * List of supported providers
7475
9298
  */
7476
- 200: unknown;
9299
+ 200: SupportedProvidersResponseDto;
9300
+ /**
9301
+ * Missing or invalid authentication
9302
+ */
9303
+ 401: unknown;
7477
9304
  };
7478
9305
  };
7479
9306
  };
7480
- '/api/v1/bean/platforms/{id}': {
7481
- put: {
7482
- req: PlatformControllerUpdateData;
9307
+ '/api/v1/{region}/bean/import/provider/{providerName}/supported': {
9308
+ get: {
9309
+ req: ProviderSyncControllerIsProviderSupportedData;
7483
9310
  res: {
7484
9311
  /**
7485
- * Platform updated successfully
9312
+ * Provider support status
7486
9313
  */
7487
9314
  200: unknown;
7488
9315
  /**
7489
- * Platform not found
9316
+ * Missing or invalid authentication
7490
9317
  */
7491
- 404: unknown;
9318
+ 401: unknown;
7492
9319
  };
7493
9320
  };
7494
- delete: {
7495
- req: PlatformControllerDeleteData;
9321
+ };
9322
+ '/api/v1/{region}/bean/external-account-links': {
9323
+ post: {
9324
+ req: ExternalAccountLinkControllerCreateData;
7496
9325
  res: {
7497
9326
  /**
7498
- * Platform deleted successfully
9327
+ * Link created.
7499
9328
  */
7500
- 204: void;
9329
+ 201: ExternalAccountLinkResponseDto;
7501
9330
  /**
7502
- * Platform not found
9331
+ * beanAccountId not owned, or an active link already exists.
7503
9332
  */
7504
- 404: unknown;
9333
+ 422: unknown;
7505
9334
  };
7506
9335
  };
7507
- };
7508
- '/api/v1/{region}/bean/import/provider/{providerName}/sync': {
7509
- post: {
7510
- req: ProviderSyncControllerSyncData;
9336
+ get: {
9337
+ req: ExternalAccountLinkControllerFindAllData;
7511
9338
  res: {
7512
- 201: unknown;
9339
+ /**
9340
+ * Links retrieved.
9341
+ */
9342
+ 200: ExternalAccountLinkListResponseDto;
7513
9343
  };
7514
9344
  };
7515
9345
  };
7516
- '/api/v1/{region}/bean/import/provider/supported': {
9346
+ '/api/v1/{region}/bean/external-account-links/{id}': {
7517
9347
  get: {
7518
- req: ProviderSyncControllerGetSupportedProvidersData;
9348
+ req: ExternalAccountLinkControllerFindOneData;
7519
9349
  res: {
7520
9350
  /**
7521
- * List of supported providers
9351
+ * Link retrieved.
7522
9352
  */
7523
- 200: SupportedProvidersResponseDto;
9353
+ 200: ExternalAccountLinkResponseDto;
7524
9354
  /**
7525
- * Missing or invalid authentication
9355
+ * Link not found or not owned by the user.
7526
9356
  */
7527
- 401: unknown;
9357
+ 422: unknown;
7528
9358
  };
7529
9359
  };
7530
- };
7531
- '/api/v1/{region}/bean/import/provider/{providerName}/supported': {
7532
- get: {
7533
- req: ProviderSyncControllerIsProviderSupportedData;
9360
+ delete: {
9361
+ req: ExternalAccountLinkControllerRemoveData;
7534
9362
  res: {
7535
9363
  /**
7536
- * Provider support status
7537
- */
7538
- 200: unknown;
7539
- /**
7540
- * Missing or invalid authentication
9364
+ * Link soft-deleted; historical transactions are unaffected.
7541
9365
  */
7542
- 401: unknown;
9366
+ 204: void;
7543
9367
  };
7544
9368
  };
7545
9369
  };
@@ -7588,7 +9412,18 @@ export type $OpenApiTs = {
7588
9412
  post: {
7589
9413
  req: NlpControllerProcessNaturalLanguageData;
7590
9414
  res: {
7591
- 201: unknown;
9415
+ /**
9416
+ * NLP processing result - either created transaction or asking for more info
9417
+ */
9418
+ 200: NlpResponseDto;
9419
+ /**
9420
+ * Invalid input
9421
+ */
9422
+ 400: unknown;
9423
+ /**
9424
+ * Unauthorized
9425
+ */
9426
+ 401: unknown;
7592
9427
  };
7593
9428
  };
7594
9429
  };
@@ -7620,6 +9455,78 @@ export type $OpenApiTs = {
7620
9455
  };
7621
9456
  };
7622
9457
  };
9458
+ '/api/v1/bean/platforms': {
9459
+ get: {
9460
+ res: {
9461
+ /**
9462
+ * List of platforms with binding and account counts
9463
+ */
9464
+ 200: unknown;
9465
+ };
9466
+ };
9467
+ post: {
9468
+ req: PlatformControllerCreateData;
9469
+ res: {
9470
+ /**
9471
+ * Platform created successfully
9472
+ */
9473
+ 201: unknown;
9474
+ /**
9475
+ * Platform already exists
9476
+ */
9477
+ 409: unknown;
9478
+ };
9479
+ };
9480
+ };
9481
+ '/api/v1/bean/platforms/list': {
9482
+ get: {
9483
+ res: {
9484
+ /**
9485
+ * List of platforms with user binding status
9486
+ */
9487
+ 200: Array<PlatformListItemDto>;
9488
+ };
9489
+ };
9490
+ };
9491
+ '/api/v1/bean/platforms/match': {
9492
+ get: {
9493
+ req: PlatformControllerMatchPlatformsData;
9494
+ res: {
9495
+ /**
9496
+ * Matching platforms with overall match type and truncation flag
9497
+ */
9498
+ 200: PlatformMatchResponseDto;
9499
+ };
9500
+ };
9501
+ };
9502
+ '/api/v1/bean/platforms/{id}': {
9503
+ put: {
9504
+ req: PlatformControllerUpdateData;
9505
+ res: {
9506
+ /**
9507
+ * Platform updated successfully
9508
+ */
9509
+ 200: unknown;
9510
+ /**
9511
+ * Platform not found
9512
+ */
9513
+ 404: unknown;
9514
+ };
9515
+ };
9516
+ delete: {
9517
+ req: PlatformControllerDeleteData;
9518
+ res: {
9519
+ /**
9520
+ * Platform deleted successfully
9521
+ */
9522
+ 204: void;
9523
+ /**
9524
+ * Platform not found
9525
+ */
9526
+ 404: unknown;
9527
+ };
9528
+ };
9529
+ };
7623
9530
  '/api/v1/{region}/dashboard/net-worth': {
7624
9531
  get: {
7625
9532
  req: DashboardControllerGetNetWorthData;
@@ -7672,16 +9579,16 @@ export type $OpenApiTs = {
7672
9579
  };
7673
9580
  };
7674
9581
  };
7675
- '/api/v1/{region}/investment/holdings/pnl': {
9582
+ '/api/v1/{region}/dashboard/expenses': {
7676
9583
  get: {
7677
- req: HoldingPnlControllerGetHoldingPnlData;
9584
+ req: DashboardControllerGetExpensesData;
7678
9585
  res: {
7679
9586
  /**
7680
- * Holding P&L retrieved successfully
9587
+ * Expenses retrieved successfully
7681
9588
  */
7682
- 200: HoldingPnlResponseDto;
9589
+ 200: ExpensesByCategoryResponseDto;
7683
9590
  /**
7684
- * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
9591
+ * Invalid groupBy or period
7685
9592
  */
7686
9593
  400: unknown;
7687
9594
  /**
@@ -7691,98 +9598,48 @@ export type $OpenApiTs = {
7691
9598
  };
7692
9599
  };
7693
9600
  };
7694
- '/api/v1/{region}/bean/prices': {
7695
- post: {
7696
- req: PriceControllerCreateData;
9601
+ '/api/v1/{region}/investment/holdings/pnl': {
9602
+ get: {
9603
+ req: HoldingPnlControllerGetHoldingPnlData;
7697
9604
  res: {
7698
9605
  /**
7699
- * Price created successfully
7700
- */
7701
- 201: PriceResponseDto;
7702
- /**
7703
- * Currency or quoteCurrency commodity not found
9606
+ * Holding P&L retrieved successfully
7704
9607
  */
7705
- 404: unknown;
9608
+ 200: HoldingPnlResponseDto;
7706
9609
  /**
7707
- * Price already exists for this currency pair and date
9610
+ * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
7708
9611
  */
7709
- 409: unknown;
7710
- };
7711
- };
7712
- get: {
7713
- req: PriceControllerFindAllData;
7714
- res: {
9612
+ 400: unknown;
7715
9613
  /**
7716
- * Prices retrieved successfully
9614
+ * User not authenticated
7717
9615
  */
7718
- 200: PriceListResponseDto;
9616
+ 401: unknown;
7719
9617
  };
7720
9618
  };
7721
9619
  };
7722
- '/api/v1/{region}/bean/prices/{id}': {
9620
+ '/api/v1/{region}/reporting/portfolio/trends': {
7723
9621
  get: {
7724
- req: PriceControllerFindOneData;
7725
- res: {
7726
- /**
7727
- * Price retrieved successfully
7728
- */
7729
- 200: PriceResponseDto;
7730
- /**
7731
- * Price not found
7732
- */
7733
- 404: unknown;
7734
- };
7735
- };
7736
- put: {
7737
- req: PriceControllerUpdateData;
7738
- res: {
7739
- /**
7740
- * Price updated successfully
7741
- */
7742
- 200: PriceResponseDto;
7743
- /**
7744
- * Price not found
7745
- */
7746
- 404: unknown;
7747
- /**
7748
- * Updated price conflicts with existing price
7749
- */
7750
- 409: unknown;
7751
- };
7752
- };
7753
- delete: {
7754
- req: PriceControllerDeleteData;
9622
+ req: ReportingControllerGetPortfolioTrendsData;
7755
9623
  res: {
7756
9624
  /**
7757
- * Price deleted successfully
7758
- */
7759
- 204: void;
7760
- /**
7761
- * Price not found
9625
+ * Trends retrieved successfully
7762
9626
  */
7763
- 404: unknown;
7764
- };
7765
- };
7766
- };
7767
- '/api/v1/{region}/bean/prices/bulk': {
7768
- post: {
7769
- req: PriceControllerBulkCreateData;
7770
- res: {
9627
+ 200: PortfolioTrendsResponseDto;
7771
9628
  /**
7772
- * Prices created successfully
9629
+ * User not authenticated
7773
9630
  */
7774
- 201: Array<PriceResponseDto>;
9631
+ 401: unknown;
7775
9632
  };
7776
9633
  };
7777
9634
  };
7778
- '/api/v1/{region}/reporting/portfolio/trends': {
9635
+ '/api/v1/{region}/reporting/cash-flow/trends': {
7779
9636
  get: {
7780
- req: ReportingControllerGetPortfolioTrendsData;
9637
+ req: ReportingControllerGetCashFlowTrendsData;
7781
9638
  res: {
7782
9639
  /**
7783
- * Trends retrieved successfully
9640
+ * Cash-flow trends retrieved successfully
7784
9641
  */
7785
- 200: PortfolioTrendsResponseDto;
9642
+ 200: CashFlowTrendsResponseDto;
7786
9643
  /**
7787
9644
  * User not authenticated
7788
9645
  */
@@ -7853,7 +9710,7 @@ export type $OpenApiTs = {
7853
9710
  /**
7854
9711
  * Login successful
7855
9712
  */
7856
- 200: unknown;
9713
+ 200: AnonymousLoginResponseDto;
7857
9714
  /**
7858
9715
  * Invalid access token
7859
9716
  */