@firela/api-types 0.0.0-canary.8c68ebbe → 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
@@ -3119,78 +3284,232 @@ export type UpdateBeanEventDto = {
3119
3284
  };
3120
3285
  };
3121
3286
 
3122
- export type FileImportDto = {
3287
+ export type OnboardingAccountDto = {
3123
3288
  /**
3124
- * Bill file to import (CSV, PDF, OFX, etc.)
3289
+ * Account path (Assets/Liabilities only; format validated by the account service)
3125
3290
  */
3126
- file: Blob | File;
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;
3127
3304
  };
3128
3305
 
3129
- export type ImportErrorDto = {
3306
+ export type OnboardingDto = {
3130
3307
  /**
3131
- * Index of failed transaction in the file
3308
+ * Asset/Liability accounts to register with opening balances
3132
3309
  */
3133
- index: number;
3310
+ accounts?: Array<OnboardingAccountDto>;
3134
3311
  /**
3135
- * Error message
3312
+ * Skip asset registration; only bootstrap the core account set
3136
3313
  */
3137
- error: string;
3314
+ skipAssetRegistration?: boolean;
3138
3315
  };
3139
3316
 
3140
- export type ReviewItemPreviewDto = {
3317
+ export type ActualBalanceDto = {
3141
3318
  /**
3142
- * Index in the import batch (for tracking)
3319
+ * Actual balance amount as a decimal string (preserves precision for tolerance inference).
3143
3320
  */
3144
- index: number;
3321
+ amount: string;
3145
3322
  /**
3146
- * Transaction date (ISO format)
3323
+ * Currency code (ISO 4217 or commodity ticker).
3147
3324
  */
3148
- date: string;
3325
+ ccy: string;
3326
+ };
3327
+
3328
+ export type ComputeReconciliationDto = {
3149
3329
  /**
3150
- * Transaction amount (absolute value)
3330
+ * BeanAccount id to reconcile.
3151
3331
  */
3152
- amount?: number;
3332
+ accountId: string;
3153
3333
  /**
3154
- * Currency code
3334
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3155
3335
  */
3156
- currency?: string;
3336
+ asOfDate: string;
3157
3337
  /**
3158
- * Transaction narration/description
3338
+ * Actual balance from the external statement.
3159
3339
  */
3160
- narration: string;
3340
+ actualBalance: ActualBalanceDto;
3341
+ };
3342
+
3343
+ export type ReconciliationComputeResultDto = {
3344
+ accountId: string;
3345
+ asOfDate: string;
3161
3346
  /**
3162
- * Payee name
3347
+ * System-computed book balance (decimal string).
3163
3348
  */
3164
- payee?: string;
3349
+ bookBalance: string;
3165
3350
  /**
3166
- * Inferred category from rule matching
3351
+ * User-entered actual balance (decimal string).
3167
3352
  */
3168
- category?: string;
3353
+ actualBalance: string;
3354
+ currency: string;
3169
3355
  /**
3170
- * Confidence score for the match (0-1)
3356
+ * Diff = book − actual (decimal string).
3171
3357
  */
3172
- confidence?: number;
3358
+ diff: string;
3173
3359
  /**
3174
- * Type of branch requiring review
3360
+ * Applied tolerance (decimal string).
3175
3361
  */
3176
- branchType?:
3177
- | 'DUPLICATE'
3178
- | 'PAYEE_MATCH'
3179
- | 'RULE_MATCH'
3180
- | 'ACCOUNT_VALIDATION'
3181
- | 'PIPELINE_ERROR';
3362
+ tolerance: string;
3182
3363
  /**
3183
- * Human-readable reasons for requiring review
3364
+ * true when |diff| ≤ tolerance.
3184
3365
  */
3185
- reasons?: Array<string>;
3366
+ withinTolerance: boolean;
3367
+ /**
3368
+ * Suggested next action: assert when within tolerance, pad otherwise.
3369
+ */
3370
+ suggestedAction: 'assert' | 'pad';
3186
3371
  };
3187
3372
 
3188
3373
  /**
3189
- * Type of branch requiring review
3374
+ * Suggested next action: assert when within tolerance, pad otherwise.
3190
3375
  */
3191
- export type branchType =
3192
- | 'DUPLICATE'
3193
- | 'PAYEE_MATCH'
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>;
3505
+ };
3506
+
3507
+ /**
3508
+ * Type of branch requiring review
3509
+ */
3510
+ export type branchType =
3511
+ | 'DUPLICATE'
3512
+ | 'PAYEE_MATCH'
3194
3513
  | 'RULE_MATCH'
3195
3514
  | 'ACCOUNT_VALIDATION'
3196
3515
  | 'PIPELINE_ERROR';
@@ -3417,94 +3736,6 @@ export type UpdateImporterConfigDto = {
3417
3736
  data?: UpdateConfigDataDto;
3418
3737
  };
3419
3738
 
3420
- export type CreatePlatformDto = {
3421
- /**
3422
- * Platform name
3423
- */
3424
- name: string;
3425
- /**
3426
- * Platform canonical identifier (lowercase, kebab-case)
3427
- */
3428
- canonical: string;
3429
- /**
3430
- * Platform aliases (multi-language names for lookup)
3431
- */
3432
- aliases: Array<string>;
3433
- /**
3434
- * Platform URL
3435
- */
3436
- url: string;
3437
- /**
3438
- * Platform type
3439
- */
3440
- type:
3441
- | 'BANK'
3442
- | 'BROKERAGE'
3443
- | 'CRYPTO_EXCHANGE'
3444
- | 'PAYMENT'
3445
- | 'INVESTMENT'
3446
- | 'INSURANCE'
3447
- | 'OTHER';
3448
- /**
3449
- * Platform logo URL
3450
- */
3451
- logoUrl?: string;
3452
- /**
3453
- * Whether the platform is active
3454
- */
3455
- isActive?: boolean;
3456
- };
3457
-
3458
- /**
3459
- * Platform type
3460
- */
3461
- export type type3 =
3462
- | 'BANK'
3463
- | 'BROKERAGE'
3464
- | 'CRYPTO_EXCHANGE'
3465
- | 'PAYMENT'
3466
- | 'INVESTMENT'
3467
- | 'INSURANCE'
3468
- | 'OTHER';
3469
-
3470
- export type UpdatePlatformDto = {
3471
- /**
3472
- * Platform name
3473
- */
3474
- name?: string;
3475
- /**
3476
- * Platform canonical identifier (lowercase, kebab-case)
3477
- */
3478
- canonical?: string;
3479
- /**
3480
- * Platform aliases (multi-language names for lookup)
3481
- */
3482
- aliases?: Array<string>;
3483
- /**
3484
- * Platform URL
3485
- */
3486
- url?: string;
3487
- /**
3488
- * Platform type
3489
- */
3490
- type?:
3491
- | 'BANK'
3492
- | 'BROKERAGE'
3493
- | 'CRYPTO_EXCHANGE'
3494
- | 'PAYMENT'
3495
- | 'INVESTMENT'
3496
- | 'INSURANCE'
3497
- | 'OTHER';
3498
- /**
3499
- * Platform logo URL
3500
- */
3501
- logoUrl?: string;
3502
- /**
3503
- * Whether the platform is active
3504
- */
3505
- isActive?: boolean;
3506
- };
3507
-
3508
3739
  export type ProviderSyncConfigDto = {
3509
3740
  /**
3510
3741
  * Source account for the first posting
@@ -3526,6 +3757,10 @@ export type ProviderSyncConfigDto = {
3526
3757
  * Filter pending transactions
3527
3758
  */
3528
3759
  filterPending?: boolean;
3760
+ /**
3761
+ * External account ID for per-batch providers (e.g. GoCardless). Overrides sourceAccount when an ExternalAccountLink mapping exists.
3762
+ */
3763
+ externalAccountId?: string;
3529
3764
  };
3530
3765
 
3531
3766
  export type ProviderSyncDto = {
@@ -3581,6 +3816,61 @@ export type SupportedProvidersResponseDto = {
3581
3816
  providers: Array<string>;
3582
3817
  };
3583
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
+
3584
3874
  export type ParserTelemetryReportDto = unknown;
3585
3875
 
3586
3876
  export type UncoveredFormatMissDto = unknown;
@@ -4160,28 +4450,214 @@ export type liabilitySubType = 'borrow' | 'repay';
4160
4450
  */
4161
4451
  export type equitySubType = 'opening' | 'adjustment';
4162
4452
 
4163
- export type BalanceByCurrencyDto = {
4164
- /**
4165
- * ISO 4217 currency code
4166
- */
4167
- currency: string;
4453
+ export type PlatformListItemDto = {
4168
4454
  /**
4169
- * Balance amount
4455
+ * Global platform ID
4170
4456
  */
4171
- balance: string;
4172
- };
4173
-
4174
- export type NetWorthByCurrencyDto = {
4457
+ id: string;
4175
4458
  /**
4176
- * Net worth by currency
4459
+ * Platform name
4177
4460
  */
4178
- netWorth: Array<BalanceByCurrencyDto>;
4461
+ name: string;
4179
4462
  /**
4180
- * Assets by currency
4463
+ * Platform URL
4181
4464
  */
4182
- assets: Array<BalanceByCurrencyDto>;
4465
+ url: string;
4183
4466
  /**
4184
- * Liabilities by currency
4467
+ * Platform type
4468
+ */
4469
+ type:
4470
+ | 'BANK'
4471
+ | 'BROKERAGE'
4472
+ | 'CRYPTO_EXCHANGE'
4473
+ | 'PAYMENT'
4474
+ | 'INVESTMENT'
4475
+ | 'INSURANCE'
4476
+ | 'OTHER';
4477
+ /**
4478
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
4479
+ */
4480
+ canonical: string;
4481
+ /**
4482
+ * Suggested path segment — canonical with first char uppercased (ACC_COMP_NAME_RE)
4483
+ */
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;
4493
+ };
4494
+
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 = {
4508
+ /**
4509
+ * Global platform ID
4510
+ */
4511
+ id: string;
4512
+ /**
4513
+ * Platform name (e.g., "ICBC")
4514
+ */
4515
+ name: string;
4516
+ /**
4517
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
4518
+ */
4519
+ canonical: string;
4520
+ /**
4521
+ * Platform type
4522
+ */
4523
+ type:
4524
+ | 'BANK'
4525
+ | 'BROKERAGE'
4526
+ | 'CRYPTO_EXCHANGE'
4527
+ | 'PAYMENT'
4528
+ | 'INVESTMENT'
4529
+ | 'INSURANCE'
4530
+ | 'OTHER';
4531
+ /**
4532
+ * Suggested path segment — canonical, already in ACCOUNT_RE format
4533
+ */
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';
4543
+ };
4544
+
4545
+ /**
4546
+ * How this row matched: 'exact' > 'prefix' > 'substring'
4547
+ */
4548
+ export type matchType = 'exact' | 'prefix' | 'substring';
4549
+
4550
+ export type PlatformMatchResponseDto = {
4551
+ /**
4552
+ * Ranked matches, best tier first (at most 10 rows)
4553
+ */
4554
+ platforms: Array<PlatformMatchResultDto>;
4555
+ /**
4556
+ * Overall match quality — top row's tier, or 'none' when no hits
4557
+ */
4558
+ matchType: 'none' | 'exact' | 'prefix' | 'substring';
4559
+ /**
4560
+ * Total matches before LIMIT (truncation transparency)
4561
+ */
4562
+ total: number;
4563
+ /**
4564
+ * true when total > platforms.length (more matches exist)
4565
+ */
4566
+ hasMore: boolean;
4567
+ };
4568
+
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 = {
4575
+ /**
4576
+ * Platform name
4577
+ */
4578
+ name: string;
4579
+ /**
4580
+ * Platform canonical identifier (lowercase, kebab-case)
4581
+ */
4582
+ canonical: string;
4583
+ /**
4584
+ * Platform aliases (multi-language names for lookup)
4585
+ */
4586
+ aliases: Array<string>;
4587
+ /**
4588
+ * Platform URL
4589
+ */
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;
4610
+ };
4611
+
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';
4640
+ /**
4641
+ * Platform logo URL
4642
+ */
4643
+ logoUrl?: string;
4644
+ /**
4645
+ * Whether the platform is active
4646
+ */
4647
+ isActive?: boolean;
4648
+ };
4649
+
4650
+ export type NetWorthByCurrencyDto = {
4651
+ /**
4652
+ * Net worth by currency
4653
+ */
4654
+ netWorth: Array<BalanceByCurrencyDto>;
4655
+ /**
4656
+ * Assets by currency
4657
+ */
4658
+ assets: Array<BalanceByCurrencyDto>;
4659
+ /**
4660
+ * Liabilities by currency
4185
4661
  */
4186
4662
  liabilities: Array<BalanceByCurrencyDto>;
4187
4663
  };
@@ -4211,21 +4687,6 @@ export type ConvertedNetWorthDto = {
4211
4687
  };
4212
4688
  };
4213
4689
 
4214
- export type ExchangeRateWarningDto = {
4215
- /**
4216
- * Warning type
4217
- */
4218
- type: string;
4219
- /**
4220
- * Currency without exchange rate
4221
- */
4222
- currency: string;
4223
- /**
4224
- * Total amount affected
4225
- */
4226
- totalAmount: string;
4227
- };
4228
-
4229
4690
  export type NetWorthResponseDto = {
4230
4691
  /**
4231
4692
  * Total net worth (assets - liabilities, converted to base currency)
@@ -4290,6 +4751,10 @@ export type AccountItemDto = {
4290
4751
  * Currency code
4291
4752
  */
4292
4753
  currency: string;
4754
+ /**
4755
+ * FX-converted balance in base currency; omitted when not convertible
4756
+ */
4757
+ convertedBalance?: string;
4293
4758
  };
4294
4759
 
4295
4760
  export type PlatformGroupDto = {
@@ -4306,9 +4771,40 @@ export type PlatformGroupDto = {
4306
4771
  */
4307
4772
  accounts: Array<AccountItemDto>;
4308
4773
  /**
4309
- * Total balance across all accounts in platform
4774
+ * FX-converted total balance in base currency
4310
4775
  */
4311
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;
4312
4808
  };
4313
4809
 
4314
4810
  export type AccountsSummaryDto = {
@@ -4320,6 +4816,14 @@ export type AccountsSummaryDto = {
4320
4816
  * Total number of platforms
4321
4817
  */
4322
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>;
4323
4827
  };
4324
4828
 
4325
4829
  export type AccountsResponseDto = {
@@ -4354,6 +4858,10 @@ export type AccountItemWithAssetClassDto = {
4354
4858
  * Currency code
4355
4859
  */
4356
4860
  currency: string;
4861
+ /**
4862
+ * FX-converted balance in base currency; omitted when not convertible
4863
+ */
4864
+ convertedBalance?: string;
4357
4865
  /**
4358
4866
  * Asset class
4359
4867
  */
@@ -4435,25 +4943,6 @@ export type assetClass =
4435
4943
  | 'REAL_ESTATE'
4436
4944
  | 'INDEX';
4437
4945
 
4438
- export type AccountExchangeRateWarningDto = {
4439
- /**
4440
- * Warning type
4441
- */
4442
- type: string;
4443
- /**
4444
- * Currency without exchange rate
4445
- */
4446
- currency: string;
4447
- /**
4448
- * Affected account paths
4449
- */
4450
- accounts: Array<string>;
4451
- /**
4452
- * Total amount in this currency
4453
- */
4454
- totalAmount: string;
4455
- };
4456
-
4457
4946
  export type AssetClassSummaryDto = {
4458
4947
  /**
4459
4948
  * Total number of accounts
@@ -4619,28 +5108,85 @@ export type CashFlowResponseDto = {
4619
5108
  warnings?: Array<ExchangeRateWarningDto>;
4620
5109
  };
4621
5110
 
4622
- export type MonetaryDto = {
5111
+ export type CategoryGroupDto = {
4623
5112
  /**
4624
- * Amount (Decimal string)
5113
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
4625
5114
  */
4626
- amount: string;
5115
+ category: string;
4627
5116
  /**
4628
- * ISO 4217 currency
5117
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
4629
5118
  */
4630
- currency: string;
5119
+ totalExpense: string;
4631
5120
  /**
4632
- * Converted to user base currency (Decimal string)
5121
+ * Share of grand total (0-100); 0 when grand total is 0
4633
5122
  */
4634
- baseCcyEquivalent?: {
4635
- [key: string]: unknown;
4636
- } | null;
4637
- };
4638
-
4639
- export type CurrentPriceDto = {
5123
+ sharePct: number;
4640
5124
  /**
4641
- * Price amount (Decimal string)
5125
+ * Raw (unconverted) expense per currency
4642
5126
  */
4643
- amount: string;
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
+
5168
+ export type MonetaryDto = {
5169
+ /**
5170
+ * Amount (Decimal string)
5171
+ */
5172
+ amount: string;
5173
+ /**
5174
+ * ISO 4217 currency
5175
+ */
5176
+ currency: string;
5177
+ /**
5178
+ * Converted to user base currency (Decimal string)
5179
+ */
5180
+ baseCcyEquivalent?: {
5181
+ [key: string]: unknown;
5182
+ } | null;
5183
+ };
5184
+
5185
+ export type CurrentPriceDto = {
5186
+ /**
5187
+ * Price amount (Decimal string)
5188
+ */
5189
+ amount: string;
4644
5190
  /**
4645
5191
  * Price currency (ISO 4217)
4646
5192
  */
@@ -4814,108 +5360,6 @@ export type HoldingPnlResponseDto = {
4814
5360
  */
4815
5361
  export type method = 'average' | 'FIFO';
4816
5362
 
4817
- export type CreateBeanPriceDto = {
4818
- /**
4819
- * Currency being priced (e.g., USD, AAPL, BTC)
4820
- */
4821
- currency: string;
4822
- /**
4823
- * Quote currency (pricing currency, e.g., CNY, EUR)
4824
- */
4825
- quoteCurrency: string;
4826
- /**
4827
- * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
4828
- */
4829
- amount: number;
4830
- /**
4831
- * Price date (ISO 8601 format)
4832
- */
4833
- date: string;
4834
- /**
4835
- * Metadata (validated by Zod schema, max field lengths enforced)
4836
- */
4837
- metadata?: {
4838
- [key: string]: unknown;
4839
- };
4840
- };
4841
-
4842
- export type PriceResponseDto = {
4843
- /**
4844
- * Unique identifier
4845
- */
4846
- id: string;
4847
- /**
4848
- * User ID (owner of the price)
4849
- */
4850
- userId: string;
4851
- /**
4852
- * Currency being priced (e.g., USD, AAPL, BTC)
4853
- */
4854
- currency: string;
4855
- /**
4856
- * Quote currency (pricing currency, e.g., USD, CNY)
4857
- */
4858
- quoteCurrency: string;
4859
- /**
4860
- * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
4861
- */
4862
- amount: number;
4863
- /**
4864
- * Price date (ISO 8601 format). Represents the date this price was valid.
4865
- */
4866
- date: string;
4867
- /**
4868
- * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
4869
- */
4870
- meta: {
4871
- [key: string]: unknown;
4872
- };
4873
- /**
4874
- * Creation timestamp
4875
- */
4876
- createdAt: string;
4877
- /**
4878
- * Last update timestamp
4879
- */
4880
- updatedAt: string;
4881
- };
4882
-
4883
- export type PriceListResponseDto = {
4884
- /**
4885
- * List of prices
4886
- */
4887
- items: Array<PriceResponseDto>;
4888
- /**
4889
- * Total number of prices
4890
- */
4891
- total: number;
4892
- };
4893
-
4894
- export type UpdateBeanPriceDto = {
4895
- /**
4896
- * Currency being priced
4897
- */
4898
- currency?: string;
4899
- /**
4900
- * Quote currency (pricing currency)
4901
- */
4902
- quoteCurrency?: string;
4903
- /**
4904
- * Price amount (MUST be >= 0 per Beancount spec)
4905
- */
4906
- amount?: number;
4907
- /**
4908
- * Price date (ISO 8601 format)
4909
- */
4910
- date?: string;
4911
- /**
4912
- * Metadata
4913
- */
4914
- metadata?: {
4915
- [key: string]: unknown;
4916
- };
4917
- };
4918
-
4919
5363
  export type CurrencyBalanceDto = {
4920
5364
  /**
4921
5365
  * ISO 4217 currency code
@@ -4942,6 +5386,14 @@ export type TimeSeriesPointDto = {
4942
5386
  change?: {
4943
5387
  [key: string]: unknown;
4944
5388
  };
5389
+ /**
5390
+ * Total assets at this date (in base currency)
5391
+ */
5392
+ assets?: string;
5393
+ /**
5394
+ * Total liabilities at this date (in base currency)
5395
+ */
5396
+ liabilities?: string;
4945
5397
  /**
4946
5398
  * Multi-currency breakdown for this point
4947
5399
  */
@@ -5009,6 +5461,71 @@ export type PortfolioTrendsResponseDto = {
5009
5461
  warnings?: Array<ExchangeRateWarningDto>;
5010
5462
  };
5011
5463
 
5464
+ export type CashFlowPointDto = {
5465
+ /**
5466
+ * Month key (YYYY-MM)
5467
+ */
5468
+ month: string;
5469
+ /**
5470
+ * Income in base currency (absolute, converted)
5471
+ */
5472
+ income: string;
5473
+ /**
5474
+ * Expense in base currency (absolute, converted)
5475
+ */
5476
+ expense: string;
5477
+ /**
5478
+ * netSavings = income − expense (savings positive)
5479
+ */
5480
+ netSavings: string;
5481
+ };
5482
+
5483
+ export type CashFlowTrendSummaryDto = {
5484
+ /**
5485
+ * Total income across the period
5486
+ */
5487
+ totalIncome: string;
5488
+ /**
5489
+ * Total expense across the period
5490
+ */
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;
5500
+ };
5501
+
5502
+ export type CashFlowTrendsResponseDto = {
5503
+ /**
5504
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
5505
+ */
5506
+ series: Array<CashFlowPointDto>;
5507
+ /**
5508
+ * Period totals
5509
+ */
5510
+ summary: CashFlowTrendSummaryDto;
5511
+ /**
5512
+ * Period requested
5513
+ */
5514
+ period: string;
5515
+ /**
5516
+ * Data granularity (v1 returns month buckets)
5517
+ */
5518
+ granularity: string;
5519
+ /**
5520
+ * Base currency for converted values
5521
+ */
5522
+ currency: string;
5523
+ /**
5524
+ * Exchange rate warnings (e.g. missing rate for a currency)
5525
+ */
5526
+ warnings?: Array<ExchangeRateWarningDto>;
5527
+ };
5528
+
5012
5529
  export type GenerateSnapshotBody = unknown;
5013
5530
 
5014
5531
  export type GenerateSnapshotResponse = unknown;
@@ -5024,6 +5541,13 @@ export type AnonymousLoginDto = {
5024
5541
  accessToken: string;
5025
5542
  };
5026
5543
 
5544
+ export type AnonymousLoginResponseDto = {
5545
+ /**
5546
+ * JWT auth token
5547
+ */
5548
+ authToken: string;
5549
+ };
5550
+
5027
5551
  export type AccountControllerCreateData = {
5028
5552
  /**
5029
5553
  * Region code for tenant context
@@ -5052,7 +5576,7 @@ export type AccountControllerFindAllData = {
5052
5576
  */
5053
5577
  region: 'cn' | 'us' | 'de' | 'gb';
5054
5578
  /**
5055
- * Search term for path or i18nKey
5579
+ * Search term for account path
5056
5580
  */
5057
5581
  search?: string;
5058
5582
  /**
@@ -5135,6 +5659,21 @@ export type AccountControllerReopenData = {
5135
5659
 
5136
5660
  export type AccountControllerReopenResponse = AccountResponseDto;
5137
5661
 
5662
+ export type AccountControllerAddOpeningBalanceData = {
5663
+ /**
5664
+ * Account UUID
5665
+ */
5666
+ id: string;
5667
+ /**
5668
+ * Region code for tenant context
5669
+ */
5670
+ region: 'cn' | 'us' | 'de' | 'gb';
5671
+ requestBody: CreateOpeningBalanceDto;
5672
+ };
5673
+
5674
+ export type AccountControllerAddOpeningBalanceResponse =
5675
+ OpeningBalanceResultDto;
5676
+
5138
5677
  export type AccountStandardsControllerGetTemplatesData = {
5139
5678
  /**
5140
5679
  * Region code (cn, us, de)
@@ -5195,6 +5734,10 @@ export type TransactionControllerListData = {
5195
5734
  * Filter by account ID (transactions with postings to this account)
5196
5735
  */
5197
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;
5198
5741
  /**
5199
5742
  * Filter by start date (inclusive), format: YYYY-MM-DD
5200
5743
  */
@@ -5319,7 +5862,7 @@ export type TransactionControllerDeleteResponse = void;
5319
5862
 
5320
5863
  export type BalanceControllerGetBalanceData = {
5321
5864
  /**
5322
- * Account name (e.g., "Assets:Bank:Checking")
5865
+ * Account name (e.g., "Assets:Checking")
5323
5866
  */
5324
5867
  account: string;
5325
5868
  /**
@@ -5721,46 +6264,143 @@ export type CommodityControllerBulkCreateData = {
5721
6264
 
5722
6265
  export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
5723
6266
 
5724
- export type RecurringRuleControllerCreateData = {
6267
+ export type PriceControllerCreateData = {
5725
6268
  /**
5726
6269
  * Region code for tenant context
5727
6270
  */
5728
6271
  region: 'cn' | 'us' | 'de' | 'gb';
5729
- requestBody: CreateRecurringRuleDto;
6272
+ requestBody: CreateBeanPriceDto;
5730
6273
  };
5731
6274
 
5732
- export type RecurringRuleControllerCreateResponse = RecurringRuleResponseDto;
6275
+ export type PriceControllerCreateResponse = PriceResponseDto;
5733
6276
 
5734
- export type RecurringRuleControllerFindAllData = {
6277
+ export type PriceControllerFindAllData = {
5735
6278
  /**
5736
- * Filter by frequency (WEEKLY, MONTHLY, etc.)
6279
+ * Filter by currency (e.g., BTC, AAPL, USD)
5737
6280
  */
5738
- frequency?: string;
6281
+ currency?: string;
5739
6282
  /**
5740
- * Filter by autoCreate enabled
6283
+ * Filter prices from this date (ISO 8601 format)
5741
6284
  */
5742
- hasAutoCreate?: boolean;
6285
+ dateFrom?: string;
5743
6286
  /**
5744
- * Filter by active status
6287
+ * Filter prices to this date (ISO 8601 format)
5745
6288
  */
5746
- isActive?: boolean;
6289
+ dateTo?: string;
5747
6290
  /**
5748
- * Region code for tenant context
6291
+ * Number of items per page (default: 20, max: 100)
5749
6292
  */
5750
- region: 'cn' | 'us' | 'de' | 'gb';
5751
- };
5752
-
5753
- export type RecurringRuleControllerFindAllResponse =
5754
- Array<RecurringRuleResponseDto>;
5755
-
5756
- export type RecurringRuleControllerCreateFromTransactionData = {
6293
+ limit?: number;
5757
6294
  /**
5758
- * Region code for tenant context
6295
+ * Page number for pagination (default: 1)
5759
6296
  */
5760
- region: 'cn' | 'us' | 'de' | 'gb';
5761
- requestBody: CreateRuleFromTransactionDto;
6297
+ page?: number;
5762
6298
  /**
5763
- * Source transaction ID
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
+
6364
+ export type RecurringRuleControllerCreateData = {
6365
+ /**
6366
+ * Region code for tenant context
6367
+ */
6368
+ region: 'cn' | 'us' | 'de' | 'gb';
6369
+ requestBody: CreateRecurringRuleDto;
6370
+ };
6371
+
6372
+ export type RecurringRuleControllerCreateResponse = RecurringRuleResponseDto;
6373
+
6374
+ export type RecurringRuleControllerFindAllData = {
6375
+ /**
6376
+ * Filter by frequency (WEEKLY, MONTHLY, etc.)
6377
+ */
6378
+ frequency?: string;
6379
+ /**
6380
+ * Filter by autoCreate enabled
6381
+ */
6382
+ hasAutoCreate?: boolean;
6383
+ /**
6384
+ * Filter by active status
6385
+ */
6386
+ isActive?: boolean;
6387
+ /**
6388
+ * Region code for tenant context
6389
+ */
6390
+ region: 'cn' | 'us' | 'de' | 'gb';
6391
+ };
6392
+
6393
+ export type RecurringRuleControllerFindAllResponse =
6394
+ Array<RecurringRuleResponseDto>;
6395
+
6396
+ export type RecurringRuleControllerCreateFromTransactionData = {
6397
+ /**
6398
+ * Region code for tenant context
6399
+ */
6400
+ region: 'cn' | 'us' | 'de' | 'gb';
6401
+ requestBody: CreateRuleFromTransactionDto;
6402
+ /**
6403
+ * Source transaction ID
5764
6404
  */
5765
6405
  transactionId: string;
5766
6406
  };
@@ -6115,7 +6755,7 @@ export type UserControllerSignupUserData = {
6115
6755
  requestBody: SignupDto;
6116
6756
  };
6117
6757
 
6118
- export type UserControllerSignupUserResponse = unknown;
6758
+ export type UserControllerSignupUserResponse = SignupResponseDto;
6119
6759
 
6120
6760
  export type UserControllerDeleteUserData = {
6121
6761
  /**
@@ -6269,6 +6909,76 @@ export type EventControllerDeleteData = {
6269
6909
 
6270
6910
  export type EventControllerDeleteResponse = void;
6271
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
+
6272
6982
  export type ExportControllerExportBeancountResponse = unknown;
6273
6983
 
6274
6984
  export type FileImportControllerImportFileData = {
@@ -6361,48 +7071,6 @@ export type ImporterConfigControllerResetConfigData = {
6361
7071
 
6362
7072
  export type ImporterConfigControllerResetConfigResponse = ImporterConfigDto;
6363
7073
 
6364
- export type PlatformControllerFindAllResponse = unknown;
6365
-
6366
- export type PlatformControllerCreateData = {
6367
- requestBody: CreatePlatformDto;
6368
- };
6369
-
6370
- export type PlatformControllerCreateResponse = unknown;
6371
-
6372
- export type PlatformControllerGetPlatformListResponse = unknown;
6373
-
6374
- export type PlatformControllerMatchPlatformsData = {
6375
- /**
6376
- * Search query — Chinese name, English name, or abbreviation
6377
- */
6378
- q: string;
6379
- /**
6380
- * Region code for category override lookup
6381
- */
6382
- region?: string;
6383
- };
6384
-
6385
- export type PlatformControllerMatchPlatformsResponse = unknown;
6386
-
6387
- export type PlatformControllerUpdateData = {
6388
- /**
6389
- * Platform ID
6390
- */
6391
- id: string;
6392
- requestBody: UpdatePlatformDto;
6393
- };
6394
-
6395
- export type PlatformControllerUpdateResponse = unknown;
6396
-
6397
- export type PlatformControllerDeleteData = {
6398
- /**
6399
- * Platform ID
6400
- */
6401
- id: string;
6402
- };
6403
-
6404
- export type PlatformControllerDeleteResponse = void;
6405
-
6406
7074
  export type ProviderSyncControllerSyncData = {
6407
7075
  /**
6408
7076
  * Provider name
@@ -6448,6 +7116,49 @@ export type ProviderSyncControllerIsProviderSupportedData = {
6448
7116
 
6449
7117
  export type ProviderSyncControllerIsProviderSupportedResponse = unknown;
6450
7118
 
7119
+ export type ExternalAccountLinkControllerCreateData = {
7120
+ /**
7121
+ * Region code for tenant context
7122
+ */
7123
+ region: 'cn' | 'us' | 'de' | 'gb';
7124
+ requestBody: CreateExternalAccountLinkDto;
7125
+ };
7126
+
7127
+ export type ExternalAccountLinkControllerCreateResponse =
7128
+ ExternalAccountLinkResponseDto;
7129
+
7130
+ export type ExternalAccountLinkControllerFindAllData = {
7131
+ provider: string;
7132
+ /**
7133
+ * Region code for tenant context
7134
+ */
7135
+ region: 'cn' | 'us' | 'de' | 'gb';
7136
+ };
7137
+
7138
+ export type ExternalAccountLinkControllerFindAllResponse =
7139
+ ExternalAccountLinkListResponseDto;
7140
+
7141
+ export type ExternalAccountLinkControllerFindOneData = {
7142
+ id: string;
7143
+ /**
7144
+ * Region code for tenant context
7145
+ */
7146
+ region: 'cn' | 'us' | 'de' | 'gb';
7147
+ };
7148
+
7149
+ export type ExternalAccountLinkControllerFindOneResponse =
7150
+ ExternalAccountLinkResponseDto;
7151
+
7152
+ export type ExternalAccountLinkControllerRemoveData = {
7153
+ id: string;
7154
+ /**
7155
+ * Region code for tenant context
7156
+ */
7157
+ region: 'cn' | 'us' | 'de' | 'gb';
7158
+ };
7159
+
7160
+ export type ExternalAccountLinkControllerRemoveResponse = void;
7161
+
6451
7162
  export type TelemetryControllerReportTelemetryData = {
6452
7163
  /**
6453
7164
  * Region code for tenant context
@@ -6520,181 +7231,167 @@ export type NlpControllerGetSessionData = {
6520
7231
 
6521
7232
  export type NlpControllerGetSessionResponse = unknown;
6522
7233
 
6523
- export type DashboardControllerGetNetWorthData = {
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 = {
6524
7246
  /**
6525
- * Date for balance calculation (ISO 8601 format)
7247
+ * Search query — Chinese name, English name, or abbreviation
6526
7248
  */
6527
- date?: string;
7249
+ q: string;
6528
7250
  /**
6529
- * Region code for tenant context
7251
+ * Region code for category override lookup
6530
7252
  */
6531
- region: 'cn' | 'us' | 'de' | 'gb';
7253
+ region?: string;
6532
7254
  };
6533
7255
 
6534
- export type DashboardControllerGetNetWorthResponse = NetWorthResponseDto;
7256
+ export type PlatformControllerMatchPlatformsResponse = PlatformMatchResponseDto;
6535
7257
 
6536
- export type DashboardControllerGetAccountsData = {
7258
+ export type PlatformControllerUpdateData = {
6537
7259
  /**
6538
- * Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
7260
+ * Platform ID
6539
7261
  */
6540
- accountId?: string;
7262
+ id: string;
7263
+ requestBody: UpdatePlatformDto;
7264
+ };
7265
+
7266
+ export type PlatformControllerUpdateResponse = unknown;
7267
+
7268
+ export type PlatformControllerDeleteData = {
6541
7269
  /**
6542
- * Date for balance calculation (ISO 8601 format)
7270
+ * Platform ID
6543
7271
  */
6544
- date?: string;
6545
- /**
6546
- * Grouping strategy
6547
- */
6548
- groupBy?:
6549
- | 'platform'
6550
- | 'assetClass'
6551
- | 'holdingAssetClass'
6552
- | 'holdingAssetClassByAccount';
6553
- /**
6554
- * Region code for tenant context
6555
- */
6556
- region: 'cn' | 'us' | 'de' | 'gb';
7272
+ id: string;
6557
7273
  };
6558
7274
 
6559
- export type DashboardControllerGetAccountsResponse =
6560
- | AccountsResponseDto
6561
- | AssetClassAccountsResponseDto
6562
- | HoldingAssetClassCrossAccountResponseDto;
7275
+ export type PlatformControllerDeleteResponse = void;
6563
7276
 
6564
- export type DashboardControllerGetCashFlowData = {
7277
+ export type DashboardControllerGetNetWorthData = {
6565
7278
  /**
6566
- * Period in YYYY-MM format
7279
+ * Date for balance calculation (ISO 8601 format)
6567
7280
  */
6568
- period: string;
7281
+ date?: string;
6569
7282
  /**
6570
7283
  * Region code for tenant context
6571
7284
  */
6572
7285
  region: 'cn' | 'us' | 'de' | 'gb';
6573
7286
  };
6574
7287
 
6575
- export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
7288
+ export type DashboardControllerGetNetWorthResponse = NetWorthResponseDto;
6576
7289
 
6577
- export type HoldingPnlControllerGetHoldingPnlData = {
7290
+ export type DashboardControllerGetAccountsData = {
6578
7291
  /**
6579
- * Scope to a single account
7292
+ * Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
6580
7293
  */
6581
7294
  accountId?: string;
6582
7295
  /**
6583
- * As-of date (ISO 8601), defaults to today
7296
+ * Date for balance calculation (ISO 8601 format)
6584
7297
  */
6585
- asOf?: string;
7298
+ date?: string;
6586
7299
  /**
6587
- * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
7300
+ * Grouping strategy
6588
7301
  */
6589
- method?: 'FIFO' | 'average';
7302
+ groupBy?:
7303
+ | 'platform'
7304
+ | 'assetClass'
7305
+ | 'holdingAssetClass'
7306
+ | 'holdingAssetClassByAccount';
6590
7307
  /**
6591
7308
  * Region code for tenant context
6592
7309
  */
6593
7310
  region: 'cn' | 'us' | 'de' | 'gb';
6594
7311
  };
6595
7312
 
6596
- export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
7313
+ export type DashboardControllerGetAccountsResponse =
7314
+ | AccountsResponseDto
7315
+ | AssetClassAccountsResponseDto
7316
+ | HoldingAssetClassCrossAccountResponseDto;
6597
7317
 
6598
- export type PriceControllerCreateData = {
7318
+ export type DashboardControllerGetCashFlowData = {
7319
+ /**
7320
+ * Period in YYYY-MM format
7321
+ */
7322
+ period: string;
6599
7323
  /**
6600
7324
  * Region code for tenant context
6601
7325
  */
6602
7326
  region: 'cn' | 'us' | 'de' | 'gb';
6603
- requestBody: CreateBeanPriceDto;
6604
7327
  };
6605
7328
 
6606
- export type PriceControllerCreateResponse = PriceResponseDto;
7329
+ export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
6607
7330
 
6608
- export type PriceControllerFindAllData = {
6609
- /**
6610
- * Filter by currency (e.g., BTC, AAPL, USD)
6611
- */
6612
- currency?: string;
6613
- /**
6614
- * Filter prices from this date (ISO 8601 format)
6615
- */
6616
- dateFrom?: string;
7331
+ export type DashboardControllerGetExpensesData = {
6617
7332
  /**
6618
- * Filter prices to this date (ISO 8601 format)
6619
- */
6620
- dateTo?: string;
6621
- /**
6622
- * Number of items per page (default: 20, max: 100)
7333
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
6623
7334
  */
6624
- limit?: number;
7335
+ flow?: 'expense' | 'income';
6625
7336
  /**
6626
- * Page number for pagination (default: 1)
7337
+ * Grouping strategy
6627
7338
  */
6628
- page?: number;
7339
+ groupBy?: 'category';
6629
7340
  /**
6630
- * Filter by quote currency (pricing currency, e.g., USD, CNY)
7341
+ * Time window (1m = current calendar month)
6631
7342
  */
6632
- quoteCurrency?: string;
7343
+ period?: '1m' | '3m' | '6m' | '1y';
6633
7344
  /**
6634
7345
  * Region code for tenant context
6635
7346
  */
6636
7347
  region: 'cn' | 'us' | 'de' | 'gb';
6637
- /**
6638
- * Search term for currency or quoteCurrency (case-insensitive partial match)
6639
- */
6640
- search?: string;
6641
7348
  };
6642
7349
 
6643
- export type PriceControllerFindAllResponse = PriceListResponseDto;
7350
+ export type DashboardControllerGetExpensesResponse =
7351
+ ExpensesByCategoryResponseDto;
6644
7352
 
6645
- export type PriceControllerFindOneData = {
7353
+ export type HoldingPnlControllerGetHoldingPnlData = {
6646
7354
  /**
6647
- * Price ID
7355
+ * Scope to a single account
6648
7356
  */
6649
- id: string;
7357
+ accountId?: string;
6650
7358
  /**
6651
- * Region code for tenant context
7359
+ * As-of date (ISO 8601), defaults to today
6652
7360
  */
6653
- region: 'cn' | 'us' | 'de' | 'gb';
6654
- };
6655
-
6656
- export type PriceControllerFindOneResponse = PriceResponseDto;
6657
-
6658
- export type PriceControllerUpdateData = {
7361
+ asOf?: string;
6659
7362
  /**
6660
- * Price ID
7363
+ * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
6661
7364
  */
6662
- id: string;
7365
+ method?: 'FIFO' | 'average';
6663
7366
  /**
6664
7367
  * Region code for tenant context
6665
7368
  */
6666
7369
  region: 'cn' | 'us' | 'de' | 'gb';
6667
- requestBody: UpdateBeanPriceDto;
6668
7370
  };
6669
7371
 
6670
- export type PriceControllerUpdateResponse = PriceResponseDto;
7372
+ export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
6671
7373
 
6672
- export type PriceControllerDeleteData = {
7374
+ export type ReportingControllerGetPortfolioTrendsData = {
6673
7375
  /**
6674
- * Price ID
7376
+ * Data granularity
6675
7377
  */
6676
- id: string;
7378
+ granularity?: 'day' | 'week' | 'month';
6677
7379
  /**
6678
- * Region code for tenant context
7380
+ * Time period
6679
7381
  */
6680
- region: 'cn' | 'us' | 'de' | 'gb';
6681
- };
6682
-
6683
- export type PriceControllerDeleteResponse = void;
6684
-
6685
- export type PriceControllerBulkCreateData = {
7382
+ period?: '1m' | '3m' | '6m' | '1y';
6686
7383
  /**
6687
7384
  * Region code for tenant context
6688
7385
  */
6689
7386
  region: 'cn' | 'us' | 'de' | 'gb';
6690
- requestBody: Array<string>;
6691
7387
  };
6692
7388
 
6693
- export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
7389
+ export type ReportingControllerGetPortfolioTrendsResponse =
7390
+ PortfolioTrendsResponseDto;
6694
7391
 
6695
- export type ReportingControllerGetPortfolioTrendsData = {
7392
+ export type ReportingControllerGetCashFlowTrendsData = {
6696
7393
  /**
6697
- * Data granularity
7394
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6698
7395
  */
6699
7396
  granularity?: 'day' | 'week' | 'month';
6700
7397
  /**
@@ -6707,8 +7404,8 @@ export type ReportingControllerGetPortfolioTrendsData = {
6707
7404
  region: 'cn' | 'us' | 'de' | 'gb';
6708
7405
  };
6709
7406
 
6710
- export type ReportingControllerGetPortfolioTrendsResponse =
6711
- PortfolioTrendsResponseDto;
7407
+ export type ReportingControllerGetCashFlowTrendsResponse =
7408
+ CashFlowTrendsResponseDto;
6712
7409
 
6713
7410
  export type ReportingControllerGenerateSnapshotData = {
6714
7411
  /**
@@ -6741,7 +7438,7 @@ export type AuthControllerAccessTokenLoginData = {
6741
7438
  requestBody: AnonymousLoginDto;
6742
7439
  };
6743
7440
 
6744
- export type AuthControllerAccessTokenLoginResponse = unknown;
7441
+ export type AuthControllerAccessTokenLoginResponse = AnonymousLoginResponseDto;
6745
7442
 
6746
7443
  export type CacheControllerFlushCacheResponse = unknown;
6747
7444
 
@@ -6889,6 +7586,25 @@ export type $OpenApiTs = {
6889
7586
  };
6890
7587
  };
6891
7588
  };
7589
+ '/api/v1/{region}/bean/accounts/{id}/opening-balance': {
7590
+ post: {
7591
+ req: AccountControllerAddOpeningBalanceData;
7592
+ res: {
7593
+ /**
7594
+ * Opening-balance transaction created
7595
+ */
7596
+ 201: OpeningBalanceResultDto;
7597
+ /**
7598
+ * Account not found
7599
+ */
7600
+ 404: unknown;
7601
+ /**
7602
+ * An opening balance already exists for this account
7603
+ */
7604
+ 409: unknown;
7605
+ };
7606
+ };
7607
+ };
6892
7608
  '/api/v1/{region}/bean/account-standards': {
6893
7609
  get: {
6894
7610
  req: AccountStandardsControllerGetTemplatesData;
@@ -7497,6 +8213,90 @@ export type $OpenApiTs = {
7497
8213
  };
7498
8214
  };
7499
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
+ };
7500
8300
  '/api/v1/{region}/bean/recurring-rules': {
7501
8301
  post: {
7502
8302
  req: RecurringRuleControllerCreateData;
@@ -7984,7 +8784,7 @@ export type $OpenApiTs = {
7984
8784
  /**
7985
8785
  * User created successfully
7986
8786
  */
7987
- 201: unknown;
8787
+ 201: SignupResponseDto;
7988
8788
  /**
7989
8789
  * Invalid Turnstile token (when Turnstile is enabled)
7990
8790
  */
@@ -8218,36 +9018,134 @@ export type $OpenApiTs = {
8218
9018
  };
8219
9019
  };
8220
9020
  };
8221
- '/api/v1/{region}/bean/export/beancount': {
9021
+ '/api/v1/{region}/bean/events/{id}/slice': {
8222
9022
  get: {
9023
+ req: EventControllerGetSliceData;
8223
9024
  res: {
9025
+ /**
9026
+ * Time-series sliced by the life event range
9027
+ */
8224
9028
  200: unknown;
9029
+ /**
9030
+ * accountPattern query param is empty
9031
+ */
9032
+ 400: unknown;
9033
+ /**
9034
+ * Life event not found
9035
+ */
9036
+ 404: unknown;
8225
9037
  };
8226
9038
  };
8227
9039
  };
8228
- '/api/v1/{region}/bean/import/file': {
9040
+ '/api/v1/{region}/bean/onboarding': {
8229
9041
  post: {
8230
- req: FileImportControllerImportFileData;
9042
+ req: OnboardingControllerBootstrapData;
8231
9043
  res: {
8232
9044
  /**
8233
- * File imported successfully
9045
+ * Onboarding bootstrap result.
8234
9046
  */
8235
- 200: ImportResultDto;
9047
+ 201: unknown;
8236
9048
  /**
8237
- * Bad request - file-format-unsupported or file-import-failed
9049
+ * Invalid region/account path/duplicate paths.
8238
9050
  */
8239
- 400: {
8240
- type?: string;
8241
- title?: string;
8242
- status?: number;
8243
- detail?: string;
8244
- filename?: string;
8245
- fileSize?: number;
8246
- };
9051
+ 422: unknown;
9052
+ };
9053
+ };
9054
+ };
9055
+ '/api/v1/{region}/bean/reconciliations': {
9056
+ post: {
9057
+ req: ReconciliationControllerComputeData;
9058
+ res: {
8247
9059
  /**
8248
- * Payload too large - file exceeds 50MB limit
9060
+ * Reconciliation preview
8249
9061
  */
8250
- 413: {
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
+ };
9119
+ '/api/v1/{region}/bean/export/beancount': {
9120
+ get: {
9121
+ res: {
9122
+ 200: unknown;
9123
+ };
9124
+ };
9125
+ };
9126
+ '/api/v1/{region}/bean/import/file': {
9127
+ post: {
9128
+ req: FileImportControllerImportFileData;
9129
+ res: {
9130
+ /**
9131
+ * File imported successfully
9132
+ */
9133
+ 200: ImportResultDto;
9134
+ /**
9135
+ * Bad request - file-format-unsupported or file-import-failed
9136
+ */
9137
+ 400: {
9138
+ type?: string;
9139
+ title?: string;
9140
+ status?: number;
9141
+ detail?: string;
9142
+ filename?: string;
9143
+ fileSize?: number;
9144
+ };
9145
+ /**
9146
+ * Payload too large - file exceeds 50MB limit
9147
+ */
9148
+ 413: {
8251
9149
  type?: string;
8252
9150
  title?: string;
8253
9151
  status?: number;
@@ -8368,128 +9266,104 @@ export type $OpenApiTs = {
8368
9266
  };
8369
9267
  };
8370
9268
  };
8371
- '/api/v1/bean/platforms': {
8372
- get: {
9269
+ '/api/v1/{region}/bean/import/provider/{providerName}/sync': {
9270
+ post: {
9271
+ req: ProviderSyncControllerSyncData;
8373
9272
  res: {
8374
9273
  /**
8375
- * List of platforms with binding and account counts
9274
+ * Sync completed successfully
8376
9275
  */
8377
- 200: unknown;
8378
- };
8379
- };
8380
- post: {
8381
- req: PlatformControllerCreateData;
8382
- res: {
9276
+ 200: ProviderSyncResponseDto;
8383
9277
  /**
8384
- * Platform created successfully
9278
+ * Invalid request data
8385
9279
  */
8386
- 201: unknown;
9280
+ 400: unknown;
8387
9281
  /**
8388
- * Platform already exists
9282
+ * Missing or invalid authentication
8389
9283
  */
8390
- 409: unknown;
8391
- };
8392
- };
8393
- };
8394
- '/api/v1/bean/platforms/list': {
8395
- get: {
8396
- res: {
9284
+ 401: unknown;
8397
9285
  /**
8398
- * List of platforms with user binding status
9286
+ * Provider not supported
8399
9287
  */
8400
- 200: unknown;
9288
+ 404: unknown;
8401
9289
  };
8402
9290
  };
8403
9291
  };
8404
- '/api/v1/bean/platforms/match': {
9292
+ '/api/v1/{region}/bean/import/provider/supported': {
8405
9293
  get: {
8406
- req: PlatformControllerMatchPlatformsData;
9294
+ req: ProviderSyncControllerGetSupportedProvidersData;
8407
9295
  res: {
8408
9296
  /**
8409
- * List of matching platforms with suggested segment names
9297
+ * List of supported providers
8410
9298
  */
8411
- 200: unknown;
9299
+ 200: SupportedProvidersResponseDto;
9300
+ /**
9301
+ * Missing or invalid authentication
9302
+ */
9303
+ 401: unknown;
8412
9304
  };
8413
9305
  };
8414
9306
  };
8415
- '/api/v1/bean/platforms/{id}': {
8416
- put: {
8417
- req: PlatformControllerUpdateData;
9307
+ '/api/v1/{region}/bean/import/provider/{providerName}/supported': {
9308
+ get: {
9309
+ req: ProviderSyncControllerIsProviderSupportedData;
8418
9310
  res: {
8419
9311
  /**
8420
- * Platform updated successfully
9312
+ * Provider support status
8421
9313
  */
8422
9314
  200: unknown;
8423
9315
  /**
8424
- * Platform not found
9316
+ * Missing or invalid authentication
8425
9317
  */
8426
- 404: unknown;
9318
+ 401: unknown;
8427
9319
  };
8428
9320
  };
8429
- delete: {
8430
- req: PlatformControllerDeleteData;
9321
+ };
9322
+ '/api/v1/{region}/bean/external-account-links': {
9323
+ post: {
9324
+ req: ExternalAccountLinkControllerCreateData;
8431
9325
  res: {
8432
9326
  /**
8433
- * Platform deleted successfully
9327
+ * Link created.
8434
9328
  */
8435
- 204: void;
9329
+ 201: ExternalAccountLinkResponseDto;
8436
9330
  /**
8437
- * Platform not found
9331
+ * beanAccountId not owned, or an active link already exists.
8438
9332
  */
8439
- 404: unknown;
9333
+ 422: unknown;
8440
9334
  };
8441
9335
  };
8442
- };
8443
- '/api/v1/{region}/bean/import/provider/{providerName}/sync': {
8444
- post: {
8445
- req: ProviderSyncControllerSyncData;
9336
+ get: {
9337
+ req: ExternalAccountLinkControllerFindAllData;
8446
9338
  res: {
8447
9339
  /**
8448
- * Sync completed successfully
8449
- */
8450
- 200: ProviderSyncResponseDto;
8451
- /**
8452
- * Invalid request data
9340
+ * Links retrieved.
8453
9341
  */
8454
- 400: unknown;
8455
- /**
8456
- * Missing or invalid authentication
8457
- */
8458
- 401: unknown;
8459
- /**
8460
- * Provider not supported
8461
- */
8462
- 404: unknown;
9342
+ 200: ExternalAccountLinkListResponseDto;
8463
9343
  };
8464
9344
  };
8465
9345
  };
8466
- '/api/v1/{region}/bean/import/provider/supported': {
9346
+ '/api/v1/{region}/bean/external-account-links/{id}': {
8467
9347
  get: {
8468
- req: ProviderSyncControllerGetSupportedProvidersData;
9348
+ req: ExternalAccountLinkControllerFindOneData;
8469
9349
  res: {
8470
9350
  /**
8471
- * List of supported providers
9351
+ * Link retrieved.
8472
9352
  */
8473
- 200: SupportedProvidersResponseDto;
9353
+ 200: ExternalAccountLinkResponseDto;
8474
9354
  /**
8475
- * Missing or invalid authentication
9355
+ * Link not found or not owned by the user.
8476
9356
  */
8477
- 401: unknown;
9357
+ 422: unknown;
8478
9358
  };
8479
9359
  };
8480
- };
8481
- '/api/v1/{region}/bean/import/provider/{providerName}/supported': {
8482
- get: {
8483
- req: ProviderSyncControllerIsProviderSupportedData;
9360
+ delete: {
9361
+ req: ExternalAccountLinkControllerRemoveData;
8484
9362
  res: {
8485
9363
  /**
8486
- * Provider support status
8487
- */
8488
- 200: unknown;
8489
- /**
8490
- * Missing or invalid authentication
9364
+ * Link soft-deleted; historical transactions are unaffected.
8491
9365
  */
8492
- 401: unknown;
9366
+ 204: void;
8493
9367
  };
8494
9368
  };
8495
9369
  };
@@ -8581,6 +9455,78 @@ export type $OpenApiTs = {
8581
9455
  };
8582
9456
  };
8583
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
+ };
8584
9530
  '/api/v1/{region}/dashboard/net-worth': {
8585
9531
  get: {
8586
9532
  req: DashboardControllerGetNetWorthData;
@@ -8633,16 +9579,16 @@ export type $OpenApiTs = {
8633
9579
  };
8634
9580
  };
8635
9581
  };
8636
- '/api/v1/{region}/investment/holdings/pnl': {
9582
+ '/api/v1/{region}/dashboard/expenses': {
8637
9583
  get: {
8638
- req: HoldingPnlControllerGetHoldingPnlData;
9584
+ req: DashboardControllerGetExpensesData;
8639
9585
  res: {
8640
9586
  /**
8641
- * Holding P&L retrieved successfully
9587
+ * Expenses retrieved successfully
8642
9588
  */
8643
- 200: HoldingPnlResponseDto;
9589
+ 200: ExpensesByCategoryResponseDto;
8644
9590
  /**
8645
- * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
9591
+ * Invalid groupBy or period
8646
9592
  */
8647
9593
  400: unknown;
8648
9594
  /**
@@ -8652,98 +9598,48 @@ export type $OpenApiTs = {
8652
9598
  };
8653
9599
  };
8654
9600
  };
8655
- '/api/v1/{region}/bean/prices': {
8656
- post: {
8657
- req: PriceControllerCreateData;
9601
+ '/api/v1/{region}/investment/holdings/pnl': {
9602
+ get: {
9603
+ req: HoldingPnlControllerGetHoldingPnlData;
8658
9604
  res: {
8659
9605
  /**
8660
- * Price created successfully
8661
- */
8662
- 201: PriceResponseDto;
8663
- /**
8664
- * Currency or quoteCurrency commodity not found
9606
+ * Holding P&L retrieved successfully
8665
9607
  */
8666
- 404: unknown;
9608
+ 200: HoldingPnlResponseDto;
8667
9609
  /**
8668
- * Price already exists for this currency pair and date
9610
+ * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
8669
9611
  */
8670
- 409: unknown;
8671
- };
8672
- };
8673
- get: {
8674
- req: PriceControllerFindAllData;
8675
- res: {
9612
+ 400: unknown;
8676
9613
  /**
8677
- * Prices retrieved successfully
9614
+ * User not authenticated
8678
9615
  */
8679
- 200: PriceListResponseDto;
9616
+ 401: unknown;
8680
9617
  };
8681
9618
  };
8682
9619
  };
8683
- '/api/v1/{region}/bean/prices/{id}': {
9620
+ '/api/v1/{region}/reporting/portfolio/trends': {
8684
9621
  get: {
8685
- req: PriceControllerFindOneData;
8686
- res: {
8687
- /**
8688
- * Price retrieved successfully
8689
- */
8690
- 200: PriceResponseDto;
8691
- /**
8692
- * Price not found
8693
- */
8694
- 404: unknown;
8695
- };
8696
- };
8697
- put: {
8698
- req: PriceControllerUpdateData;
8699
- res: {
8700
- /**
8701
- * Price updated successfully
8702
- */
8703
- 200: PriceResponseDto;
8704
- /**
8705
- * Price not found
8706
- */
8707
- 404: unknown;
8708
- /**
8709
- * Updated price conflicts with existing price
8710
- */
8711
- 409: unknown;
8712
- };
8713
- };
8714
- delete: {
8715
- req: PriceControllerDeleteData;
9622
+ req: ReportingControllerGetPortfolioTrendsData;
8716
9623
  res: {
8717
9624
  /**
8718
- * Price deleted successfully
8719
- */
8720
- 204: void;
8721
- /**
8722
- * Price not found
9625
+ * Trends retrieved successfully
8723
9626
  */
8724
- 404: unknown;
8725
- };
8726
- };
8727
- };
8728
- '/api/v1/{region}/bean/prices/bulk': {
8729
- post: {
8730
- req: PriceControllerBulkCreateData;
8731
- res: {
9627
+ 200: PortfolioTrendsResponseDto;
8732
9628
  /**
8733
- * Prices created successfully
9629
+ * User not authenticated
8734
9630
  */
8735
- 201: Array<PriceResponseDto>;
9631
+ 401: unknown;
8736
9632
  };
8737
9633
  };
8738
9634
  };
8739
- '/api/v1/{region}/reporting/portfolio/trends': {
9635
+ '/api/v1/{region}/reporting/cash-flow/trends': {
8740
9636
  get: {
8741
- req: ReportingControllerGetPortfolioTrendsData;
9637
+ req: ReportingControllerGetCashFlowTrendsData;
8742
9638
  res: {
8743
9639
  /**
8744
- * Trends retrieved successfully
9640
+ * Cash-flow trends retrieved successfully
8745
9641
  */
8746
- 200: PortfolioTrendsResponseDto;
9642
+ 200: CashFlowTrendsResponseDto;
8747
9643
  /**
8748
9644
  * User not authenticated
8749
9645
  */
@@ -8814,7 +9710,7 @@ export type $OpenApiTs = {
8814
9710
  /**
8815
9711
  * Login successful
8816
9712
  */
8817
- 200: unknown;
9713
+ 200: AnonymousLoginResponseDto;
8818
9714
  /**
8819
9715
  * Invalid access token
8820
9716
  */