@firela/api-types 0.0.0-canary.614ff760 → 0.0.0-canary.6a42fd0e

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.
@@ -316,6 +316,53 @@ export type RegionsMetadataResponseDto = {
316
316
  regions: Array<RegionInfoDto>;
317
317
  };
318
318
 
319
+ export type CostSpecDto = {
320
+ /**
321
+ * Cost specification mode (mirrors engine CostSpec)
322
+ */
323
+ mode: 'per-unit' | 'total' | 'date' | 'label' | 'auto';
324
+ /**
325
+ * Per-unit cost (required when mode is "per-unit")
326
+ */
327
+ numberPerUnit?: string;
328
+ /**
329
+ * Total cost for all units (required when mode is "total")
330
+ */
331
+ totalNumber?: string;
332
+ /**
333
+ * Cost currency (required in all modes)
334
+ */
335
+ currency: string;
336
+ /**
337
+ * Lot acquisition date, ISO 8601 (required when mode is "date")
338
+ */
339
+ date?: string;
340
+ /**
341
+ * Lot label (required when mode is "label"; optional tag in buy modes)
342
+ */
343
+ label?: string;
344
+ /**
345
+ * Merge lots for AVERAGE booking (mode: auto)
346
+ */
347
+ merge?: boolean;
348
+ };
349
+
350
+ /**
351
+ * Cost specification mode (mirrors engine CostSpec)
352
+ */
353
+ export type mode = 'per-unit' | 'total' | 'date' | 'label' | 'auto';
354
+
355
+ export type AmountDto = {
356
+ /**
357
+ * Amount as decimal string (max 15 integer + 15 decimal digits)
358
+ */
359
+ number: string;
360
+ /**
361
+ * Currency/commodity code
362
+ */
363
+ currency: string;
364
+ };
365
+
319
366
  export type CreatePostingDto = {
320
367
  /**
321
368
  * Account name in Beancount format (must start with uppercase, colon-separated)
@@ -335,6 +382,14 @@ export type CreatePostingDto = {
335
382
  meta?: {
336
383
  [key: string]: unknown;
337
384
  };
385
+ /**
386
+ * Cost basis (Beancount `{...}`). Maps to engine costSpec. Required for commodity holdings so they carry a monetary weight that can balance.
387
+ */
388
+ cost?: CostSpecDto;
389
+ /**
390
+ * Price annotation (Beancount `@...`). Maps to engine price. Used for valuation; cost takes priority for balance weight.
391
+ */
392
+ price?: AmountDto;
338
393
  };
339
394
 
340
395
  export type CreateTransactionDto = {
@@ -387,6 +442,25 @@ export type CreateTransactionDto = {
387
442
  */
388
443
  export type flag = '*' | '!';
389
444
 
445
+ export type CostDetailDto = {
446
+ /**
447
+ * Per-unit cost basis (mirrors engine Cost.number)
448
+ */
449
+ number?: string;
450
+ /**
451
+ * Cost currency
452
+ */
453
+ currency?: string;
454
+ /**
455
+ * Lot acquisition date (ISO yyyy-mm-dd)
456
+ */
457
+ date?: string;
458
+ /**
459
+ * Lot label
460
+ */
461
+ label?: string;
462
+ };
463
+
390
464
  export type PostingResponseDto = {
391
465
  /**
392
466
  * Account name
@@ -400,6 +474,10 @@ export type PostingResponseDto = {
400
474
  * Currency
401
475
  */
402
476
  currency?: string;
477
+ /**
478
+ * Booking-resolved cost (mirrors engine Cost). Undefined when the posting has no cost basis.
479
+ */
480
+ cost?: CostDetailDto;
403
481
  };
404
482
 
405
483
  export type RecurringSuggestionDto = {
@@ -620,9 +698,9 @@ export type PostingDetailDto = {
620
698
  */
621
699
  accountId: string;
622
700
  /**
623
- * Account name
701
+ * Fully-qualified Beancount account path
624
702
  */
625
- accountName: string;
703
+ account: string;
626
704
  /**
627
705
  * Amount as decimal string. Typed optional but always present in responses: interpolation fills any MISSING posting before it is persisted or returned.
628
706
  */
@@ -643,6 +721,10 @@ export type PostingDetailDto = {
643
721
  * Cost date
644
722
  */
645
723
  costDate?: string;
724
+ /**
725
+ * Booking-resolved cost (mirrors engine Cost). Undefined when the posting has no cost basis.
726
+ */
727
+ cost?: CostDetailDto;
646
728
  /**
647
729
  * Price amount
648
730
  */
@@ -766,6 +848,51 @@ export type flag2 =
766
848
  */
767
849
  export type status2 = 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
768
850
 
851
+ export type BalanceByCurrencyDto = {
852
+ /**
853
+ * ISO 4217 currency code
854
+ */
855
+ currency: string;
856
+ /**
857
+ * Balance amount
858
+ */
859
+ balance: string;
860
+ };
861
+
862
+ export type ExchangeRateWarningDto = {
863
+ /**
864
+ * Warning type
865
+ */
866
+ type: string;
867
+ /**
868
+ * Currency without exchange rate
869
+ */
870
+ currency: string;
871
+ /**
872
+ * Total amount affected
873
+ */
874
+ totalAmount: string;
875
+ };
876
+
877
+ export type TransactionListSummaryDto = {
878
+ /**
879
+ * 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.
880
+ */
881
+ totalAmount: string;
882
+ /**
883
+ * Base currency (ISO 4217)
884
+ */
885
+ currency: string;
886
+ /**
887
+ * Raw (unconverted) balance per currency
888
+ */
889
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
890
+ /**
891
+ * Currencies missing an FX rate (omitted when empty)
892
+ */
893
+ warnings?: Array<ExchangeRateWarningDto>;
894
+ };
895
+
769
896
  export type TransactionListResponseDto = {
770
897
  /**
771
898
  * List of transactions
@@ -783,6 +910,10 @@ export type TransactionListResponseDto = {
783
910
  * Number of items skipped
784
911
  */
785
912
  offset: number;
913
+ /**
914
+ * 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.
915
+ */
916
+ summary?: TransactionListSummaryDto;
786
917
  };
787
918
 
788
919
  export type TagSuggestionDto = {
@@ -1242,17 +1373,17 @@ export type ResolveResultDto = {
1242
1373
  [key: string]: string;
1243
1374
  };
1244
1375
  /**
1245
- * Resolution ID for undo
1376
+ * Resolution ID for undo. Absent when the resolver rejected the decision (review stayed PENDING).
1246
1377
  */
1247
- resolutionId: string;
1378
+ resolutionId?: string;
1248
1379
  /**
1249
1380
  * Whether this decision can be undone
1250
1381
  */
1251
- canUndo: boolean;
1382
+ canUndo?: boolean;
1252
1383
  /**
1253
1384
  * Deadline for undo (24h from resolution)
1254
1385
  */
1255
- undoDeadline: string;
1386
+ undoDeadline?: string;
1256
1387
  /**
1257
1388
  * Rule ID if learning was triggered (ACCEPT_AND_LEARN actions). Use this to deep-link to the rule management page.
1258
1389
  */
@@ -1835,6 +1966,108 @@ export type UpdateCommodityDto = {
1835
1966
  };
1836
1967
  };
1837
1968
 
1969
+ export type CreateBeanPriceDto = {
1970
+ /**
1971
+ * Currency being priced (e.g., USD, AAPL, BTC)
1972
+ */
1973
+ currency: string;
1974
+ /**
1975
+ * Quote currency (pricing currency, e.g., CNY, EUR)
1976
+ */
1977
+ quoteCurrency: string;
1978
+ /**
1979
+ * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
1980
+ */
1981
+ amount: number;
1982
+ /**
1983
+ * Price date (ISO 8601 format)
1984
+ */
1985
+ date: string;
1986
+ /**
1987
+ * Metadata (validated by Zod schema, max field lengths enforced)
1988
+ */
1989
+ metadata?: {
1990
+ [key: string]: unknown;
1991
+ };
1992
+ };
1993
+
1994
+ export type PriceResponseDto = {
1995
+ /**
1996
+ * Unique identifier
1997
+ */
1998
+ id: string;
1999
+ /**
2000
+ * User ID (owner of the price)
2001
+ */
2002
+ userId: string;
2003
+ /**
2004
+ * Currency being priced (e.g., USD, AAPL, BTC)
2005
+ */
2006
+ currency: string;
2007
+ /**
2008
+ * Quote currency (pricing currency, e.g., USD, CNY)
2009
+ */
2010
+ quoteCurrency: string;
2011
+ /**
2012
+ * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
2013
+ */
2014
+ amount: number;
2015
+ /**
2016
+ * Price date (ISO 8601 format). Represents the date this price was valid.
2017
+ */
2018
+ date: string;
2019
+ /**
2020
+ * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
2021
+ */
2022
+ meta: {
2023
+ [key: string]: unknown;
2024
+ };
2025
+ /**
2026
+ * Creation timestamp
2027
+ */
2028
+ createdAt: string;
2029
+ /**
2030
+ * Last update timestamp
2031
+ */
2032
+ updatedAt: string;
2033
+ };
2034
+
2035
+ export type PriceListResponseDto = {
2036
+ /**
2037
+ * List of prices
2038
+ */
2039
+ items: Array<PriceResponseDto>;
2040
+ /**
2041
+ * Total number of prices
2042
+ */
2043
+ total: number;
2044
+ };
2045
+
2046
+ export type UpdateBeanPriceDto = {
2047
+ /**
2048
+ * Currency being priced
2049
+ */
2050
+ currency?: string;
2051
+ /**
2052
+ * Quote currency (pricing currency)
2053
+ */
2054
+ quoteCurrency?: string;
2055
+ /**
2056
+ * Price amount (MUST be >= 0 per Beancount spec)
2057
+ */
2058
+ amount?: number;
2059
+ /**
2060
+ * Price date (ISO 8601 format)
2061
+ */
2062
+ date?: string;
2063
+ /**
2064
+ * Metadata
2065
+ */
2066
+ metadata?: {
2067
+ [key: string]: unknown;
2068
+ };
2069
+ };
2070
+
1838
2071
  export type CreateRecurringRuleDto = {
1839
2072
  /**
1840
2073
  * Rule name (unique per user)
@@ -2947,103 +3180,317 @@ export type UpdatePropertyDto = {
2947
3180
  value: string;
2948
3181
  };
2949
3182
 
2950
- export type FileImportDto = {
3183
+ export type CreateBeanEventDto = {
2951
3184
  /**
2952
- * Bill file to import (CSV, PDF, OFX, etc.)
3185
+ * Life event date (ISO 8601)
2953
3186
  */
2954
- file: Blob | File;
2955
- };
2956
-
2957
- export type ImportErrorDto = {
3187
+ date: string;
2958
3188
  /**
2959
- * Index of failed transaction in the file
3189
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
2960
3190
  */
2961
- index: number;
3191
+ type: string;
2962
3192
  /**
2963
- * Error message
3193
+ * Life event description. Empty string is a VALID value (distinct from absence).
2964
3194
  */
2965
- error: string;
3195
+ description: string;
3196
+ /**
3197
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3198
+ */
3199
+ meta?: {
3200
+ [key: string]: unknown;
3201
+ };
2966
3202
  };
2967
3203
 
2968
- export type ReviewItemPreviewDto = {
3204
+ export type EventResponseDto = {
2969
3205
  /**
2970
- * Index in the import batch (for tracking)
3206
+ * Unique identifier
2971
3207
  */
2972
- index: number;
3208
+ id: string;
2973
3209
  /**
2974
- * Transaction date (ISO format)
3210
+ * User ID (owner of the life event)
2975
3211
  */
2976
- date: string;
3212
+ userId: string;
2977
3213
  /**
2978
- * Transaction amount (absolute value)
3214
+ * Life event date (ISO 8601 format)
2979
3215
  */
2980
- amount?: number;
3216
+ date: string;
2981
3217
  /**
2982
- * Currency code
3218
+ * Life event type (user-defined, e.g., "employer", "location")
2983
3219
  */
2984
- currency?: string;
3220
+ type: string;
2985
3221
  /**
2986
- * Transaction narration/description
3222
+ * Life event description. May be an empty string (a valid value distinct from absence).
2987
3223
  */
2988
- narration: string;
3224
+ description: string;
2989
3225
  /**
2990
- * Payee name
3226
+ * Product-side metadata (free-form JSON)
2991
3227
  */
2992
- payee?: string;
3228
+ meta: {
3229
+ [key: string]: unknown;
3230
+ };
2993
3231
  /**
2994
- * Inferred category from rule matching
3232
+ * Creation timestamp
2995
3233
  */
2996
- category?: string;
3234
+ createdAt: string;
2997
3235
  /**
2998
- * Confidence score for the match (0-1)
3236
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
2999
3237
  */
3000
- confidence?: number;
3238
+ updatedAt: string;
3239
+ };
3240
+
3241
+ export type EventListResponseDto = {
3001
3242
  /**
3002
- * Type of branch requiring review
3243
+ * List of life events
3003
3244
  */
3004
- branchType?:
3005
- | 'DUPLICATE'
3006
- | 'PAYEE_MATCH'
3007
- | 'RULE_MATCH'
3008
- | 'ACCOUNT_VALIDATION'
3009
- | 'PIPELINE_ERROR';
3245
+ items: Array<EventResponseDto>;
3010
3246
  /**
3011
- * Human-readable reasons for requiring review
3247
+ * Total number of life events matching the query
3012
3248
  */
3013
- reasons?: Array<string>;
3249
+ total: number;
3014
3250
  };
3015
3251
 
3016
- /**
3017
- * Type of branch requiring review
3018
- */
3019
- export type branchType =
3020
- | 'DUPLICATE'
3021
- | 'PAYEE_MATCH'
3022
- | 'RULE_MATCH'
3023
- | 'ACCOUNT_VALIDATION'
3024
- | 'PIPELINE_ERROR';
3025
-
3026
- export type ImportResultDto = {
3252
+ export type UpdateBeanEventDto = {
3027
3253
  /**
3028
- * Number of successfully imported transactions
3254
+ * Life event date (ISO 8601)
3029
3255
  */
3030
- imported: number;
3256
+ date?: string;
3031
3257
  /**
3032
- * Number of failed transactions
3258
+ * Life event type (user-defined)
3033
3259
  */
3034
- failed: number;
3260
+ type?: string;
3035
3261
  /**
3036
- * Number of skipped transactions (high confidence duplicates, auto-skipped)
3262
+ * Life event description. Empty string is a VALID value (distinct from absence).
3037
3263
  */
3038
- skipped: number;
3264
+ description?: string;
3039
3265
  /**
3040
- * Number of transactions pending review (medium confidence duplicates)
3266
+ * Product-side metadata (free-form JSON)
3041
3267
  */
3042
- pendingReview: number;
3268
+ meta?: {
3269
+ [key: string]: unknown;
3270
+ };
3271
+ };
3272
+
3273
+ export type ActualBalanceDto = {
3043
3274
  /**
3044
- * Array of error details for failed transactions
3275
+ * Actual balance amount as a decimal string (preserves precision for tolerance inference).
3045
3276
  */
3046
- errors: Array<ImportErrorDto>;
3277
+ amount: string;
3278
+ /**
3279
+ * Currency code (ISO 4217 or commodity ticker).
3280
+ */
3281
+ ccy: string;
3282
+ };
3283
+
3284
+ export type ComputeReconciliationDto = {
3285
+ /**
3286
+ * BeanAccount id to reconcile.
3287
+ */
3288
+ accountId: string;
3289
+ /**
3290
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3291
+ */
3292
+ asOfDate: string;
3293
+ /**
3294
+ * Actual balance from the external statement.
3295
+ */
3296
+ actualBalance: ActualBalanceDto;
3297
+ };
3298
+
3299
+ export type ReconciliationComputeResultDto = {
3300
+ accountId: string;
3301
+ asOfDate: string;
3302
+ /**
3303
+ * System-computed book balance (decimal string).
3304
+ */
3305
+ bookBalance: string;
3306
+ /**
3307
+ * User-entered actual balance (decimal string).
3308
+ */
3309
+ actualBalance: string;
3310
+ currency: string;
3311
+ /**
3312
+ * Diff = book − actual (decimal string).
3313
+ */
3314
+ diff: string;
3315
+ /**
3316
+ * Applied tolerance (decimal string).
3317
+ */
3318
+ tolerance: string;
3319
+ /**
3320
+ * true when |diff| ≤ tolerance.
3321
+ */
3322
+ withinTolerance: boolean;
3323
+ /**
3324
+ * Suggested next action: assert when within tolerance, pad otherwise.
3325
+ */
3326
+ suggestedAction: 'assert' | 'pad';
3327
+ };
3328
+
3329
+ /**
3330
+ * Suggested next action: assert when within tolerance, pad otherwise.
3331
+ */
3332
+ export type suggestedAction = 'assert' | 'pad';
3333
+
3334
+ export type AssertReconciliationDto = {
3335
+ /**
3336
+ * BeanAccount id to reconcile.
3337
+ */
3338
+ accountId: string;
3339
+ /**
3340
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3341
+ */
3342
+ asOfDate: string;
3343
+ /**
3344
+ * Actual balance from the external statement.
3345
+ */
3346
+ actualBalance: ActualBalanceDto;
3347
+ /**
3348
+ * Optional explicit tolerance override. Omit to infer from amount precision (Beancount default).
3349
+ */
3350
+ tolerance?: string;
3351
+ };
3352
+
3353
+ export type ReconciliationRecordDto = {
3354
+ id: string;
3355
+ accountId: string;
3356
+ date: string;
3357
+ /**
3358
+ * Asserted (actual) amount.
3359
+ */
3360
+ amount: string;
3361
+ currency: string;
3362
+ tolerance?: string;
3363
+ /**
3364
+ * book − actual.
3365
+ */
3366
+ diffAmount?: string;
3367
+ diffCurrency?: string;
3368
+ createdAt: string;
3369
+ };
3370
+
3371
+ export type PadReconciliationDto = {
3372
+ /**
3373
+ * BeanAccount id to reconcile.
3374
+ */
3375
+ accountId: string;
3376
+ /**
3377
+ * Assertion date (ISO 8601, e.g. "2026-07-24").
3378
+ */
3379
+ asOfDate: string;
3380
+ /**
3381
+ * Actual balance from the external statement.
3382
+ */
3383
+ actualBalance: ActualBalanceDto;
3384
+ /**
3385
+ * Pad source account. Defaults to Equity:Opening-Balances (official Beancount convention).
3386
+ */
3387
+ sourceAccount?: string;
3388
+ };
3389
+
3390
+ export type PadResultDto = {
3391
+ /**
3392
+ * Created pad adjusting transaction id.
3393
+ */
3394
+ transactionId: string;
3395
+ };
3396
+
3397
+ export type FileImportDto = {
3398
+ /**
3399
+ * Bill file to import (CSV, PDF, OFX, etc.)
3400
+ */
3401
+ file: Blob | File;
3402
+ };
3403
+
3404
+ export type ImportErrorDto = {
3405
+ /**
3406
+ * Index of failed transaction in the file
3407
+ */
3408
+ index: number;
3409
+ /**
3410
+ * Error message
3411
+ */
3412
+ error: string;
3413
+ };
3414
+
3415
+ export type ReviewItemPreviewDto = {
3416
+ /**
3417
+ * Index in the import batch (for tracking)
3418
+ */
3419
+ index: number;
3420
+ /**
3421
+ * Transaction date (ISO format)
3422
+ */
3423
+ date: string;
3424
+ /**
3425
+ * Transaction amount (absolute value)
3426
+ */
3427
+ amount?: number;
3428
+ /**
3429
+ * Currency code
3430
+ */
3431
+ currency?: string;
3432
+ /**
3433
+ * Transaction narration/description
3434
+ */
3435
+ narration: string;
3436
+ /**
3437
+ * Payee name
3438
+ */
3439
+ payee?: string;
3440
+ /**
3441
+ * Inferred category from rule matching
3442
+ */
3443
+ category?: string;
3444
+ /**
3445
+ * Confidence score for the match (0-1)
3446
+ */
3447
+ confidence?: number;
3448
+ /**
3449
+ * Type of branch requiring review
3450
+ */
3451
+ branchType?:
3452
+ | 'DUPLICATE'
3453
+ | 'PAYEE_MATCH'
3454
+ | 'RULE_MATCH'
3455
+ | 'ACCOUNT_VALIDATION'
3456
+ | 'PIPELINE_ERROR';
3457
+ /**
3458
+ * Human-readable reasons for requiring review
3459
+ */
3460
+ reasons?: Array<string>;
3461
+ };
3462
+
3463
+ /**
3464
+ * Type of branch requiring review
3465
+ */
3466
+ export type branchType =
3467
+ | 'DUPLICATE'
3468
+ | 'PAYEE_MATCH'
3469
+ | 'RULE_MATCH'
3470
+ | 'ACCOUNT_VALIDATION'
3471
+ | 'PIPELINE_ERROR';
3472
+
3473
+ export type ImportResultDto = {
3474
+ /**
3475
+ * Number of successfully imported transactions
3476
+ */
3477
+ imported: number;
3478
+ /**
3479
+ * Number of failed transactions
3480
+ */
3481
+ failed: number;
3482
+ /**
3483
+ * Number of skipped transactions (high confidence duplicates, auto-skipped)
3484
+ */
3485
+ skipped: number;
3486
+ /**
3487
+ * Number of transactions pending review (medium confidence duplicates)
3488
+ */
3489
+ pendingReview: number;
3490
+ /**
3491
+ * Array of error details for failed transactions
3492
+ */
3493
+ errors: Array<ImportErrorDto>;
3047
3494
  /**
3048
3495
  * Array of transactions pending review with preview data. Contains essential information for displaying in the import preview UI.
3049
3496
  */
@@ -3411,6 +3858,8 @@ export type SupportedProvidersResponseDto = {
3411
3858
 
3412
3859
  export type ParserTelemetryReportDto = unknown;
3413
3860
 
3861
+ export type UncoveredFormatMissDto = unknown;
3862
+
3414
3863
  export type ProcessNlpDto = {
3415
3864
  /**
3416
3865
  * Natural language text describing a transaction (Chinese)
@@ -3986,17 +4435,6 @@ export type liabilitySubType = 'borrow' | 'repay';
3986
4435
  */
3987
4436
  export type equitySubType = 'opening' | 'adjustment';
3988
4437
 
3989
- export type BalanceByCurrencyDto = {
3990
- /**
3991
- * ISO 4217 currency code
3992
- */
3993
- currency: string;
3994
- /**
3995
- * Balance amount
3996
- */
3997
- balance: string;
3998
- };
3999
-
4000
4438
  export type NetWorthByCurrencyDto = {
4001
4439
  /**
4002
4440
  * Net worth by currency
@@ -4037,21 +4475,6 @@ export type ConvertedNetWorthDto = {
4037
4475
  };
4038
4476
  };
4039
4477
 
4040
- export type ExchangeRateWarningDto = {
4041
- /**
4042
- * Warning type
4043
- */
4044
- type: string;
4045
- /**
4046
- * Currency without exchange rate
4047
- */
4048
- currency: string;
4049
- /**
4050
- * Total amount affected
4051
- */
4052
- totalAmount: string;
4053
- };
4054
-
4055
4478
  export type NetWorthResponseDto = {
4056
4479
  /**
4057
4480
  * Total net worth (assets - liabilities, converted to base currency)
@@ -4116,6 +4539,10 @@ export type AccountItemDto = {
4116
4539
  * Currency code
4117
4540
  */
4118
4541
  currency: string;
4542
+ /**
4543
+ * FX-converted balance in base currency; omitted when not convertible
4544
+ */
4545
+ convertedBalance?: string;
4119
4546
  };
4120
4547
 
4121
4548
  export type PlatformGroupDto = {
@@ -4132,9 +4559,40 @@ export type PlatformGroupDto = {
4132
4559
  */
4133
4560
  accounts: Array<AccountItemDto>;
4134
4561
  /**
4135
- * Total balance across all accounts in platform
4562
+ * FX-converted total balance in base currency
4136
4563
  */
4137
4564
  totalBalance: string;
4565
+ /**
4566
+ * Raw (unconverted) balances grouped by currency
4567
+ */
4568
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4569
+ /**
4570
+ * Converted balance in base currency (omitted when no currency is convertible)
4571
+ */
4572
+ convertedBalance?: string;
4573
+ /**
4574
+ * Share of the grand converted total (0-100); 0 when grand total is 0
4575
+ */
4576
+ sharePct: number;
4577
+ };
4578
+
4579
+ export type AccountExchangeRateWarningDto = {
4580
+ /**
4581
+ * Warning type
4582
+ */
4583
+ type: string;
4584
+ /**
4585
+ * Currency without exchange rate
4586
+ */
4587
+ currency: string;
4588
+ /**
4589
+ * Affected account paths
4590
+ */
4591
+ accounts: Array<string>;
4592
+ /**
4593
+ * Total amount in this currency
4594
+ */
4595
+ totalAmount: string;
4138
4596
  };
4139
4597
 
4140
4598
  export type AccountsSummaryDto = {
@@ -4146,6 +4604,14 @@ export type AccountsSummaryDto = {
4146
4604
  * Total number of platforms
4147
4605
  */
4148
4606
  totalPlatforms: number;
4607
+ /**
4608
+ * Base currency for conversion
4609
+ */
4610
+ baseCurrency: string;
4611
+ /**
4612
+ * Per-account exchange rate warnings
4613
+ */
4614
+ warnings?: Array<AccountExchangeRateWarningDto>;
4149
4615
  };
4150
4616
 
4151
4617
  export type AccountsResponseDto = {
@@ -4180,6 +4646,10 @@ export type AccountItemWithAssetClassDto = {
4180
4646
  * Currency code
4181
4647
  */
4182
4648
  currency: string;
4649
+ /**
4650
+ * FX-converted balance in base currency; omitted when not convertible
4651
+ */
4652
+ convertedBalance?: string;
4183
4653
  /**
4184
4654
  * Asset class
4185
4655
  */
@@ -4196,8 +4666,21 @@ export type AccountItemWithAssetClassDto = {
4196
4666
  * Risk level
4197
4667
  */
4198
4668
  riskLevel?: string;
4669
+ /**
4670
+ * ADR-0105 classification provenance (holding level always; account level only on FALLBACK)
4671
+ */
4672
+ source?: 'USER_META' | 'FIAT_CURRENCY' | 'OPENBB_MAPPING' | 'FALLBACK';
4199
4673
  };
4200
4674
 
4675
+ /**
4676
+ * ADR-0105 classification provenance (holding level always; account level only on FALLBACK)
4677
+ */
4678
+ export type source2 =
4679
+ | 'USER_META'
4680
+ | 'FIAT_CURRENCY'
4681
+ | 'OPENBB_MAPPING'
4682
+ | 'FALLBACK';
4683
+
4201
4684
  export type AssetClassGroupDto = {
4202
4685
  /**
4203
4686
  * Asset class name
@@ -4248,25 +4731,6 @@ export type assetClass =
4248
4731
  | 'REAL_ESTATE'
4249
4732
  | 'INDEX';
4250
4733
 
4251
- export type AccountExchangeRateWarningDto = {
4252
- /**
4253
- * Warning type
4254
- */
4255
- type: string;
4256
- /**
4257
- * Currency without exchange rate
4258
- */
4259
- currency: string;
4260
- /**
4261
- * Affected account paths
4262
- */
4263
- accounts: Array<string>;
4264
- /**
4265
- * Total amount in this currency
4266
- */
4267
- totalAmount: string;
4268
- };
4269
-
4270
4734
  export type AssetClassSummaryDto = {
4271
4735
  /**
4272
4736
  * Total number of accounts
@@ -4284,6 +4748,12 @@ export type AssetClassSummaryDto = {
4284
4748
  * Exchange rate warnings
4285
4749
  */
4286
4750
  warnings?: Array<AccountExchangeRateWarningDto>;
4751
+ /**
4752
+ * ADR-0105 §4 fallback provenance stats (holding level only). valueRatio is the grey-area share of total converted value; count is the number of source=FALLBACK holdings.
4753
+ */
4754
+ fallback?: {
4755
+ [key: string]: unknown;
4756
+ };
4287
4757
  };
4288
4758
 
4289
4759
  export type AssetClassAccountsResponseDto = {
@@ -4295,6 +4765,56 @@ export type AssetClassAccountsResponseDto = {
4295
4765
  * Summary statistics
4296
4766
  */
4297
4767
  summary: AssetClassSummaryDto;
4768
+ /**
4769
+ * ADR-0105 §6 holding-level grey-area bucket (source=FALLBACK holdings peeled out of groups). Present only for groupBy=holdingAssetClass when FALLBACK holdings exist.
4770
+ */
4771
+ uncategorized?: AssetClassGroupDto;
4772
+ };
4773
+
4774
+ export type HoldingAssetClassAccountSliceDto = {
4775
+ /**
4776
+ * Account ID
4777
+ */
4778
+ accountId: string;
4779
+ /**
4780
+ * Full account path
4781
+ */
4782
+ accountPath: string;
4783
+ /**
4784
+ * Currency of the holding with the largest converted base value; undefined when no holding is convertible
4785
+ */
4786
+ accountCurrency?: string;
4787
+ /**
4788
+ * Account's market value in base currency (Σ converted holdings; grey bucket included)
4789
+ */
4790
+ marketValueBase: string;
4791
+ /**
4792
+ * Share of the global total (0-100). 0 when globalTotal is zero (no NaN/Infinity).
4793
+ */
4794
+ shareOfTotalPct: number;
4795
+ /**
4796
+ * Per-account asset-class breakdown
4797
+ */
4798
+ groups: Array<AssetClassGroupDto>;
4799
+ /**
4800
+ * Per-account grey bucket (source=FALLBACK holdings, incl. broker cash)
4801
+ */
4802
+ uncategorized?: AssetClassGroupDto;
4803
+ /**
4804
+ * Every holding row for this account (account ID in each row’s `id` field)
4805
+ */
4806
+ holdings: Array<AccountItemWithAssetClassDto>;
4807
+ };
4808
+
4809
+ export type HoldingAssetClassCrossAccountResponseDto = {
4810
+ /**
4811
+ * Merged cross-account holding aggregation
4812
+ */
4813
+ global: AssetClassAccountsResponseDto;
4814
+ /**
4815
+ * Per-account slices
4816
+ */
4817
+ byAccount: Array<HoldingAssetClassAccountSliceDto>;
4298
4818
  };
4299
4819
 
4300
4820
  export type CashFlowByCurrencyDto = {
@@ -4376,6 +4896,258 @@ export type CashFlowResponseDto = {
4376
4896
  warnings?: Array<ExchangeRateWarningDto>;
4377
4897
  };
4378
4898
 
4899
+ export type CategoryGroupDto = {
4900
+ /**
4901
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
4902
+ */
4903
+ category: string;
4904
+ /**
4905
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
4906
+ */
4907
+ totalExpense: string;
4908
+ /**
4909
+ * Share of grand total (0-100); 0 when grand total is 0
4910
+ */
4911
+ sharePct: number;
4912
+ /**
4913
+ * Raw (unconverted) expense per currency
4914
+ */
4915
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4916
+ /**
4917
+ * Converted total in base currency (omitted when FX missing for all currencies in this category)
4918
+ */
4919
+ convertedBalance?: string;
4920
+ };
4921
+
4922
+ export type ExpensesByCategorySummaryDto = {
4923
+ /**
4924
+ * Total across all categories, converted (convertible categories only); expense totals when flow=expense, income totals when flow=income
4925
+ */
4926
+ totalExpense: string;
4927
+ /**
4928
+ * Number of categories
4929
+ */
4930
+ categoryCount: number;
4931
+ };
4932
+
4933
+ export type ExpensesByCategoryResponseDto = {
4934
+ /**
4935
+ * Period requested
4936
+ */
4937
+ period: string;
4938
+ /**
4939
+ * Base currency for converted values
4940
+ */
4941
+ baseCurrency: string;
4942
+ /**
4943
+ * Expense groups by functional category, sorted by converted total desc
4944
+ */
4945
+ groups: Array<CategoryGroupDto>;
4946
+ /**
4947
+ * Summary statistics
4948
+ */
4949
+ summary: ExpensesByCategorySummaryDto;
4950
+ /**
4951
+ * Exchange rate warnings (e.g. missing rate for a currency)
4952
+ */
4953
+ warnings?: Array<ExchangeRateWarningDto>;
4954
+ };
4955
+
4956
+ export type MonetaryDto = {
4957
+ /**
4958
+ * Amount (Decimal string)
4959
+ */
4960
+ amount: string;
4961
+ /**
4962
+ * ISO 4217 currency
4963
+ */
4964
+ currency: string;
4965
+ /**
4966
+ * Converted to user base currency (Decimal string)
4967
+ */
4968
+ baseCcyEquivalent?: {
4969
+ [key: string]: unknown;
4970
+ } | null;
4971
+ };
4972
+
4973
+ export type CurrentPriceDto = {
4974
+ /**
4975
+ * Price amount (Decimal string)
4976
+ */
4977
+ amount: string;
4978
+ /**
4979
+ * Price currency (ISO 4217)
4980
+ */
4981
+ currency: string;
4982
+ /**
4983
+ * Price date (ISO 8601)
4984
+ */
4985
+ date: string;
4986
+ /**
4987
+ * Price source
4988
+ */
4989
+ source: 'USER_OVERRIDE' | 'OPENBB_EQUITY' | 'OPENBB_CURRENCY';
4990
+ };
4991
+
4992
+ /**
4993
+ * Price source
4994
+ */
4995
+ export type source3 = 'USER_OVERRIDE' | 'OPENBB_EQUITY' | 'OPENBB_CURRENCY';
4996
+
4997
+ export type FxRateDto = {
4998
+ from: string;
4999
+ to: string;
5000
+ /**
5001
+ * FX rate (Decimal string)
5002
+ */
5003
+ rate: string;
5004
+ /**
5005
+ * Rate date (ISO 8601)
5006
+ */
5007
+ date: string;
5008
+ };
5009
+
5010
+ export type HoldingPnlRowDto = {
5011
+ /**
5012
+ * Account UUID
5013
+ */
5014
+ accountId: string;
5015
+ /**
5016
+ * Full account path
5017
+ */
5018
+ accountPath: string;
5019
+ /**
5020
+ * Account settlement currency (ISO 4217), from cost currency
5021
+ */
5022
+ accountCcy?: {
5023
+ [key: string]: unknown;
5024
+ } | null;
5025
+ /**
5026
+ * Broker type derived from Platform.type
5027
+ */
5028
+ brokerType?: {
5029
+ [key: string]: unknown;
5030
+ } | null;
5031
+ /**
5032
+ * Commodity symbol
5033
+ */
5034
+ symbol: string;
5035
+ /**
5036
+ * Chart segment token (libs/common resolver)
5037
+ */
5038
+ chartToken: 'equity' | 'fund' | 'bond' | 'cash' | 'other';
5039
+ assetClass: string;
5040
+ assetSubClass?: {
5041
+ [key: string]: unknown;
5042
+ } | null;
5043
+ /**
5044
+ * Net held units (Decimal string)
5045
+ */
5046
+ units: string;
5047
+ /**
5048
+ * Average cost per unit; null when cost currency conflicts or no cost
5049
+ */
5050
+ averageCostPerUnit?: MonetaryDto | null;
5051
+ /**
5052
+ * Cost basis of held units
5053
+ */
5054
+ costBasis?: MonetaryDto | null;
5055
+ /**
5056
+ * Market value at asOf price
5057
+ */
5058
+ marketValue?: MonetaryDto | null;
5059
+ /**
5060
+ * Price used for market value
5061
+ */
5062
+ currentPrice?: CurrentPriceDto | null;
5063
+ /**
5064
+ * Unrealized P&L in base currency (Decimal string); null when any FX/price missing
5065
+ */
5066
+ unrealizedPnlBase?: {
5067
+ [key: string]: unknown;
5068
+ } | null;
5069
+ /**
5070
+ * Unrealized P&L % (Decimal string)
5071
+ */
5072
+ unrealizedPnlPct?: {
5073
+ [key: string]: unknown;
5074
+ } | null;
5075
+ /**
5076
+ * Historical FX rate applied to cost basis
5077
+ */
5078
+ costFxRate?: FxRateDto | null;
5079
+ /**
5080
+ * FX rate applied to market value
5081
+ */
5082
+ marketFxRate?: FxRateDto | null;
5083
+ /**
5084
+ * Share of invested assets % (Decimal string); only for invested chartTokens
5085
+ */
5086
+ pctOfInvestedAssets?: {
5087
+ [key: string]: unknown;
5088
+ } | null;
5089
+ /**
5090
+ * Cumulative realized P&L on sold lots (asOf-date cutoff); null when the method has no applicable sells, a sell lacks a price, or any required FX rate is missing (never-mix). When a sell spans multiple currencies (cross-currency sale), amount and currency reflect the base currency; baseCcyEquivalent is always the authoritative dual-FX figure
5091
+ */
5092
+ realizedPnl?: MonetaryDto | null;
5093
+ };
5094
+
5095
+ /**
5096
+ * Chart segment token (libs/common resolver)
5097
+ */
5098
+ export type chartToken = 'equity' | 'fund' | 'bond' | 'cash' | 'other';
5099
+
5100
+ export type HoldingPnlWarningDto = {
5101
+ /**
5102
+ * Warning type
5103
+ */
5104
+ type:
5105
+ | 'MISSING_COST_FX_RATE'
5106
+ | 'MISSING_MARKET_FX_RATE'
5107
+ | 'MISSING_SALE_PRICE'
5108
+ | 'MISSING_REALIZED_FX_RATE'
5109
+ | 'OVERSOLD_LOTS'
5110
+ | 'NO_PRICE'
5111
+ | 'MIXED_COST_CURRENCY';
5112
+ symbol?: {
5113
+ [key: string]: unknown;
5114
+ } | null;
5115
+ accountId?: {
5116
+ [key: string]: unknown;
5117
+ } | null;
5118
+ currency?: {
5119
+ [key: string]: unknown;
5120
+ } | null;
5121
+ };
5122
+
5123
+ /**
5124
+ * Warning type
5125
+ */
5126
+ export type type4 =
5127
+ | 'MISSING_COST_FX_RATE'
5128
+ | 'MISSING_MARKET_FX_RATE'
5129
+ | 'MISSING_SALE_PRICE'
5130
+ | 'MISSING_REALIZED_FX_RATE'
5131
+ | 'OVERSOLD_LOTS'
5132
+ | 'NO_PRICE'
5133
+ | 'MIXED_COST_CURRENCY';
5134
+
5135
+ export type HoldingPnlResponseDto = {
5136
+ asOfDate: string;
5137
+ baseCurrency: string;
5138
+ /**
5139
+ * Realized-P&L lot-matching method (FIFO or average). Unrealized cost basis remains average regardless of this value (#473).
5140
+ */
5141
+ method: 'average' | 'FIFO';
5142
+ rows: Array<HoldingPnlRowDto>;
5143
+ warnings: Array<HoldingPnlWarningDto>;
5144
+ };
5145
+
5146
+ /**
5147
+ * Realized-P&L lot-matching method (FIFO or average). Unrealized cost basis remains average regardless of this value (#473).
5148
+ */
5149
+ export type method = 'average' | 'FIFO';
5150
+
4379
5151
  export type CurrencyBalanceDto = {
4380
5152
  /**
4381
5153
  * ISO 4217 currency code
@@ -4403,56 +5175,133 @@ export type TimeSeriesPointDto = {
4403
5175
  [key: string]: unknown;
4404
5176
  };
4405
5177
  /**
4406
- * Multi-currency breakdown for this point
5178
+ * Total assets at this date (in base currency)
5179
+ */
5180
+ assets?: string;
5181
+ /**
5182
+ * Total liabilities at this date (in base currency)
5183
+ */
5184
+ liabilities?: string;
5185
+ /**
5186
+ * Multi-currency breakdown for this point
5187
+ */
5188
+ byCurrency?: Array<CurrencyBalanceDto>;
5189
+ };
5190
+
5191
+ export type TrendSummaryDto = {
5192
+ /**
5193
+ * Value at start of period
5194
+ */
5195
+ startValue: string;
5196
+ /**
5197
+ * Value at end of period
5198
+ */
5199
+ endValue: string;
5200
+ /**
5201
+ * Total change over period
5202
+ */
5203
+ totalChange: string;
5204
+ /**
5205
+ * Total change percentage
5206
+ */
5207
+ totalChangePercentage: string;
5208
+ };
5209
+
5210
+ export type MultiCurrencyPointDto = {
5211
+ /**
5212
+ * Date in YYYY-MM-DD format
5213
+ */
5214
+ date: string;
5215
+ /**
5216
+ * Balances by currency
5217
+ */
5218
+ byCurrency: Array<CurrencyBalanceDto>;
5219
+ };
5220
+
5221
+ export type PortfolioTrendsResponseDto = {
5222
+ /**
5223
+ * Time series data points
5224
+ */
5225
+ series: Array<TimeSeriesPointDto>;
5226
+ /**
5227
+ * Period summary
5228
+ */
5229
+ summary: TrendSummaryDto;
5230
+ /**
5231
+ * Period requested
5232
+ */
5233
+ period: string;
5234
+ /**
5235
+ * Data granularity
5236
+ */
5237
+ granularity: string;
5238
+ /**
5239
+ * Base currency for converted values
5240
+ */
5241
+ currency: string;
5242
+ /**
5243
+ * Multi-currency time series (each point has currency breakdown)
5244
+ */
5245
+ byCurrency?: Array<MultiCurrencyPointDto>;
5246
+ /**
5247
+ * Exchange rate warnings
4407
5248
  */
4408
- byCurrency?: Array<CurrencyBalanceDto>;
5249
+ warnings?: Array<ExchangeRateWarningDto>;
4409
5250
  };
4410
5251
 
4411
- export type TrendSummaryDto = {
5252
+ export type CashFlowPointDto = {
4412
5253
  /**
4413
- * Value at start of period
5254
+ * Month key (YYYY-MM)
4414
5255
  */
4415
- startValue: string;
5256
+ month: string;
4416
5257
  /**
4417
- * Value at end of period
5258
+ * Income in base currency (absolute, converted)
4418
5259
  */
4419
- endValue: string;
5260
+ income: string;
4420
5261
  /**
4421
- * Total change over period
5262
+ * Expense in base currency (absolute, converted)
4422
5263
  */
4423
- totalChange: string;
5264
+ expense: string;
4424
5265
  /**
4425
- * Total change percentage
5266
+ * netSavings = income − expense (savings positive)
4426
5267
  */
4427
- totalChangePercentage: string;
5268
+ netSavings: string;
4428
5269
  };
4429
5270
 
4430
- export type MultiCurrencyPointDto = {
5271
+ export type CashFlowTrendSummaryDto = {
4431
5272
  /**
4432
- * Date in YYYY-MM-DD format
5273
+ * Total income across the period
4433
5274
  */
4434
- date: string;
5275
+ totalIncome: string;
4435
5276
  /**
4436
- * Balances by currency
5277
+ * Total expense across the period
4437
5278
  */
4438
- byCurrency: Array<CurrencyBalanceDto>;
5279
+ totalExpense: string;
5280
+ /**
5281
+ * income − expense across the period
5282
+ */
5283
+ totalNetSavings: string;
5284
+ /**
5285
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
5286
+ */
5287
+ averageMonthlyNetSavings: string;
4439
5288
  };
4440
5289
 
4441
- export type PortfolioTrendsResponseDto = {
5290
+ export type CashFlowTrendsResponseDto = {
4442
5291
  /**
4443
- * Time series data points
5292
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
4444
5293
  */
4445
- series: Array<TimeSeriesPointDto>;
5294
+ series: Array<CashFlowPointDto>;
4446
5295
  /**
4447
- * Period summary
5296
+ * Period totals
4448
5297
  */
4449
- summary: TrendSummaryDto;
5298
+ summary: CashFlowTrendSummaryDto;
4450
5299
  /**
4451
5300
  * Period requested
4452
5301
  */
4453
5302
  period: string;
4454
5303
  /**
4455
- * Data granularity
5304
+ * Data granularity (v1 returns month buckets)
4456
5305
  */
4457
5306
  granularity: string;
4458
5307
  /**
@@ -4460,11 +5309,7 @@ export type PortfolioTrendsResponseDto = {
4460
5309
  */
4461
5310
  currency: string;
4462
5311
  /**
4463
- * Multi-currency time series (each point has currency breakdown)
4464
- */
4465
- byCurrency?: Array<MultiCurrencyPointDto>;
4466
- /**
4467
- * Exchange rate warnings
5312
+ * Exchange rate warnings (e.g. missing rate for a currency)
4468
5313
  */
4469
5314
  warnings?: Array<ExchangeRateWarningDto>;
4470
5315
  };
@@ -4655,6 +5500,10 @@ export type TransactionControllerListData = {
4655
5500
  * Filter by account ID (transactions with postings to this account)
4656
5501
  */
4657
5502
  accountId?: string;
5503
+ /**
5504
+ * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
5505
+ */
5506
+ category?: string;
4658
5507
  /**
4659
5508
  * Filter by start date (inclusive), format: YYYY-MM-DD
4660
5509
  */
@@ -5181,6 +6030,103 @@ export type CommodityControllerBulkCreateData = {
5181
6030
 
5182
6031
  export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
5183
6032
 
6033
+ export type PriceControllerCreateData = {
6034
+ /**
6035
+ * Region code for tenant context
6036
+ */
6037
+ region: 'cn' | 'us' | 'de' | 'gb';
6038
+ requestBody: CreateBeanPriceDto;
6039
+ };
6040
+
6041
+ export type PriceControllerCreateResponse = PriceResponseDto;
6042
+
6043
+ export type PriceControllerFindAllData = {
6044
+ /**
6045
+ * Filter by currency (e.g., BTC, AAPL, USD)
6046
+ */
6047
+ currency?: string;
6048
+ /**
6049
+ * Filter prices from this date (ISO 8601 format)
6050
+ */
6051
+ dateFrom?: string;
6052
+ /**
6053
+ * Filter prices to this date (ISO 8601 format)
6054
+ */
6055
+ dateTo?: string;
6056
+ /**
6057
+ * Number of items per page (default: 20, max: 100)
6058
+ */
6059
+ limit?: number;
6060
+ /**
6061
+ * Page number for pagination (default: 1)
6062
+ */
6063
+ page?: number;
6064
+ /**
6065
+ * Filter by quote currency (pricing currency, e.g., USD, CNY)
6066
+ */
6067
+ quoteCurrency?: string;
6068
+ /**
6069
+ * Region code for tenant context
6070
+ */
6071
+ region: 'cn' | 'us' | 'de' | 'gb';
6072
+ /**
6073
+ * Search term for currency or quoteCurrency (case-insensitive partial match)
6074
+ */
6075
+ search?: string;
6076
+ };
6077
+
6078
+ export type PriceControllerFindAllResponse = PriceListResponseDto;
6079
+
6080
+ export type PriceControllerFindOneData = {
6081
+ /**
6082
+ * Price ID
6083
+ */
6084
+ id: string;
6085
+ /**
6086
+ * Region code for tenant context
6087
+ */
6088
+ region: 'cn' | 'us' | 'de' | 'gb';
6089
+ };
6090
+
6091
+ export type PriceControllerFindOneResponse = PriceResponseDto;
6092
+
6093
+ export type PriceControllerUpdateData = {
6094
+ /**
6095
+ * Price ID
6096
+ */
6097
+ id: string;
6098
+ /**
6099
+ * Region code for tenant context
6100
+ */
6101
+ region: 'cn' | 'us' | 'de' | 'gb';
6102
+ requestBody: UpdateBeanPriceDto;
6103
+ };
6104
+
6105
+ export type PriceControllerUpdateResponse = PriceResponseDto;
6106
+
6107
+ export type PriceControllerDeleteData = {
6108
+ /**
6109
+ * Price ID
6110
+ */
6111
+ id: string;
6112
+ /**
6113
+ * Region code for tenant context
6114
+ */
6115
+ region: 'cn' | 'us' | 'de' | 'gb';
6116
+ };
6117
+
6118
+ export type PriceControllerDeleteResponse = void;
6119
+
6120
+ export type PriceControllerBulkCreateData = {
6121
+ /**
6122
+ * Region code for tenant context
6123
+ */
6124
+ region: 'cn' | 'us' | 'de' | 'gb';
6125
+ requestBody: Array<string>;
6126
+ };
6127
+
6128
+ export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
6129
+
5184
6130
  export type RecurringRuleControllerCreateData = {
5185
6131
  /**
5186
6132
  * Region code for tenant context
@@ -5646,6 +6592,149 @@ export type PropertyControllerDeleteData = {
5646
6592
 
5647
6593
  export type PropertyControllerDeleteResponse = void;
5648
6594
 
6595
+ export type EventControllerCreateData = {
6596
+ /**
6597
+ * Region code for tenant context (decorative for life events)
6598
+ */
6599
+ region: 'cn' | 'us' | 'de' | 'gb';
6600
+ requestBody: CreateBeanEventDto;
6601
+ };
6602
+
6603
+ export type EventControllerCreateResponse = EventResponseDto;
6604
+
6605
+ export type EventControllerFindAllData = {
6606
+ /**
6607
+ * Filter life events from this date (ISO 8601 format)
6608
+ */
6609
+ from?: string;
6610
+ /**
6611
+ * Number of items per page (default: 20, max: 100)
6612
+ */
6613
+ limit?: number;
6614
+ /**
6615
+ * Page number for pagination (default: 1)
6616
+ */
6617
+ page?: number;
6618
+ /**
6619
+ * Search term for description (case-insensitive partial match)
6620
+ */
6621
+ q?: string;
6622
+ /**
6623
+ * Region code for tenant context (decorative for life events)
6624
+ */
6625
+ region: 'cn' | 'us' | 'de' | 'gb';
6626
+ /**
6627
+ * Filter life events to this date (ISO 8601 format)
6628
+ */
6629
+ to?: string;
6630
+ /**
6631
+ * Filter by life event type (exact match)
6632
+ */
6633
+ type?: string;
6634
+ };
6635
+
6636
+ export type EventControllerFindAllResponse = EventListResponseDto;
6637
+
6638
+ export type EventControllerFindOneData = {
6639
+ /**
6640
+ * Life event ID
6641
+ */
6642
+ id: string;
6643
+ /**
6644
+ * Region code for tenant context (decorative for life events)
6645
+ */
6646
+ region: 'cn' | 'us' | 'de' | 'gb';
6647
+ };
6648
+
6649
+ export type EventControllerFindOneResponse = EventResponseDto;
6650
+
6651
+ export type EventControllerUpdateData = {
6652
+ /**
6653
+ * Life event ID
6654
+ */
6655
+ id: string;
6656
+ /**
6657
+ * Region code for tenant context (decorative for life events)
6658
+ */
6659
+ region: 'cn' | 'us' | 'de' | 'gb';
6660
+ requestBody: UpdateBeanEventDto;
6661
+ };
6662
+
6663
+ export type EventControllerUpdateResponse = EventResponseDto;
6664
+
6665
+ export type EventControllerDeleteData = {
6666
+ /**
6667
+ * Life event ID
6668
+ */
6669
+ id: string;
6670
+ /**
6671
+ * Region code for tenant context (decorative for life events)
6672
+ */
6673
+ region: 'cn' | 'us' | 'de' | 'gb';
6674
+ };
6675
+
6676
+ export type EventControllerDeleteResponse = void;
6677
+
6678
+ export type EventControllerGetSliceData = {
6679
+ accountPattern: string;
6680
+ granularity: string;
6681
+ /**
6682
+ * Life event ID
6683
+ */
6684
+ id: string;
6685
+ /**
6686
+ * Region code for tenant context (decorative for life events)
6687
+ */
6688
+ region: 'cn' | 'us' | 'de' | 'gb';
6689
+ };
6690
+
6691
+ export type EventControllerGetSliceResponse = unknown;
6692
+
6693
+ export type ReconciliationControllerComputeData = {
6694
+ /**
6695
+ * Region code for tenant context (decorative for reconciliation)
6696
+ */
6697
+ region: 'cn' | 'us' | 'de' | 'gb';
6698
+ requestBody: ComputeReconciliationDto;
6699
+ };
6700
+
6701
+ export type ReconciliationControllerComputeResponse =
6702
+ ReconciliationComputeResultDto;
6703
+
6704
+ export type ReconciliationControllerAssertData = {
6705
+ /**
6706
+ * Region code for tenant context (decorative for reconciliation)
6707
+ */
6708
+ region: 'cn' | 'us' | 'de' | 'gb';
6709
+ requestBody: AssertReconciliationDto;
6710
+ };
6711
+
6712
+ export type ReconciliationControllerAssertResponse = ReconciliationRecordDto;
6713
+
6714
+ export type ReconciliationControllerPadData = {
6715
+ /**
6716
+ * Region code for tenant context (decorative for reconciliation)
6717
+ */
6718
+ region: 'cn' | 'us' | 'de' | 'gb';
6719
+ requestBody: PadReconciliationDto;
6720
+ };
6721
+
6722
+ export type ReconciliationControllerPadResponse = PadResultDto;
6723
+
6724
+ export type ReconciliationControllerHistoryData = {
6725
+ /**
6726
+ * BeanAccount id
6727
+ */
6728
+ accountId: string;
6729
+ /**
6730
+ * Region code for tenant context (decorative for reconciliation)
6731
+ */
6732
+ region: 'cn' | 'us' | 'de' | 'gb';
6733
+ };
6734
+
6735
+ export type ReconciliationControllerHistoryResponse =
6736
+ Array<ReconciliationRecordDto>;
6737
+
5649
6738
  export type ExportControllerExportBeancountResponse = unknown;
5650
6739
 
5651
6740
  export type FileImportControllerImportFileData = {
@@ -5794,9 +6883,9 @@ export type ProviderSyncControllerSyncData = {
5794
6883
  | 'beancount-direct'
5795
6884
  | 'parsed-bill';
5796
6885
  /**
5797
- * Region code
6886
+ * Region code for tenant context
5798
6887
  */
5799
- region: unknown;
6888
+ region: 'cn' | 'us' | 'de' | 'gb';
5800
6889
  requestBody: ProviderSyncDto;
5801
6890
  };
5802
6891
 
@@ -5835,6 +6924,29 @@ export type TelemetryControllerReportTelemetryData = {
5835
6924
 
5836
6925
  export type TelemetryControllerReportTelemetryResponse = unknown;
5837
6926
 
6927
+ export type TelemetryControllerReportCoverageMissData = {
6928
+ /**
6929
+ * Region code for tenant context
6930
+ */
6931
+ region: 'cn' | 'us' | 'de' | 'gb';
6932
+ requestBody: UncoveredFormatMissDto;
6933
+ };
6934
+
6935
+ export type TelemetryControllerReportCoverageMissResponse = unknown;
6936
+
6937
+ export type TelemetryControllerGetCoverageMetricsData = {
6938
+ /**
6939
+ * Region code for tenant context
6940
+ */
6941
+ region: 'cn' | 'us' | 'de' | 'gb';
6942
+ /**
6943
+ * Top-N uncovered formats (default 10)
6944
+ */
6945
+ topN?: unknown;
6946
+ };
6947
+
6948
+ export type TelemetryControllerGetCoverageMetricsResponse = unknown;
6949
+
5838
6950
  export type NlpControllerProcessNaturalLanguageData = {
5839
6951
  /**
5840
6952
  * Region code for tenant context
@@ -5888,6 +7000,10 @@ export type DashboardControllerGetNetWorthData = {
5888
7000
  export type DashboardControllerGetNetWorthResponse = NetWorthResponseDto;
5889
7001
 
5890
7002
  export type DashboardControllerGetAccountsData = {
7003
+ /**
7004
+ * Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
7005
+ */
7006
+ accountId?: string;
5891
7007
  /**
5892
7008
  * Date for balance calculation (ISO 8601 format)
5893
7009
  */
@@ -5895,29 +7011,77 @@ export type DashboardControllerGetAccountsData = {
5895
7011
  /**
5896
7012
  * Grouping strategy
5897
7013
  */
5898
- groupBy?: 'platform' | 'assetClass';
7014
+ groupBy?:
7015
+ | 'platform'
7016
+ | 'assetClass'
7017
+ | 'holdingAssetClass'
7018
+ | 'holdingAssetClassByAccount';
7019
+ /**
7020
+ * Region code for tenant context
7021
+ */
7022
+ region: 'cn' | 'us' | 'de' | 'gb';
7023
+ };
7024
+
7025
+ export type DashboardControllerGetAccountsResponse =
7026
+ | AccountsResponseDto
7027
+ | AssetClassAccountsResponseDto
7028
+ | HoldingAssetClassCrossAccountResponseDto;
7029
+
7030
+ export type DashboardControllerGetCashFlowData = {
7031
+ /**
7032
+ * Period in YYYY-MM format
7033
+ */
7034
+ period: string;
7035
+ /**
7036
+ * Region code for tenant context
7037
+ */
7038
+ region: 'cn' | 'us' | 'de' | 'gb';
7039
+ };
7040
+
7041
+ export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
7042
+
7043
+ export type DashboardControllerGetExpensesData = {
7044
+ /**
7045
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
7046
+ */
7047
+ flow?: 'expense' | 'income';
7048
+ /**
7049
+ * Grouping strategy
7050
+ */
7051
+ groupBy?: 'category';
7052
+ /**
7053
+ * Time window (1m = current calendar month)
7054
+ */
7055
+ period?: '1m' | '3m' | '6m' | '1y';
5899
7056
  /**
5900
7057
  * Region code for tenant context
5901
7058
  */
5902
7059
  region: 'cn' | 'us' | 'de' | 'gb';
5903
7060
  };
5904
7061
 
5905
- export type DashboardControllerGetAccountsResponse =
5906
- | AccountsResponseDto
5907
- | AssetClassAccountsResponseDto;
7062
+ export type DashboardControllerGetExpensesResponse =
7063
+ ExpensesByCategoryResponseDto;
5908
7064
 
5909
- export type DashboardControllerGetCashFlowData = {
7065
+ export type HoldingPnlControllerGetHoldingPnlData = {
5910
7066
  /**
5911
- * Period in YYYY-MM format
7067
+ * Scope to a single account
5912
7068
  */
5913
- period: string;
7069
+ accountId?: string;
7070
+ /**
7071
+ * As-of date (ISO 8601), defaults to today
7072
+ */
7073
+ asOf?: string;
7074
+ /**
7075
+ * Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
7076
+ */
7077
+ method?: 'FIFO' | 'average';
5914
7078
  /**
5915
7079
  * Region code for tenant context
5916
7080
  */
5917
7081
  region: 'cn' | 'us' | 'de' | 'gb';
5918
7082
  };
5919
7083
 
5920
- export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
7084
+ export type HoldingPnlControllerGetHoldingPnlResponse = HoldingPnlResponseDto;
5921
7085
 
5922
7086
  export type ReportingControllerGetPortfolioTrendsData = {
5923
7087
  /**
@@ -5937,6 +7101,24 @@ export type ReportingControllerGetPortfolioTrendsData = {
5937
7101
  export type ReportingControllerGetPortfolioTrendsResponse =
5938
7102
  PortfolioTrendsResponseDto;
5939
7103
 
7104
+ export type ReportingControllerGetCashFlowTrendsData = {
7105
+ /**
7106
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
7107
+ */
7108
+ granularity?: 'day' | 'week' | 'month';
7109
+ /**
7110
+ * Time period
7111
+ */
7112
+ period?: '1m' | '3m' | '6m' | '1y';
7113
+ /**
7114
+ * Region code for tenant context
7115
+ */
7116
+ region: 'cn' | 'us' | 'de' | 'gb';
7117
+ };
7118
+
7119
+ export type ReportingControllerGetCashFlowTrendsResponse =
7120
+ CashFlowTrendsResponseDto;
7121
+
5940
7122
  export type ReportingControllerGenerateSnapshotData = {
5941
7123
  /**
5942
7124
  * Region code for tenant context
@@ -6724,6 +7906,90 @@ export type $OpenApiTs = {
6724
7906
  };
6725
7907
  };
6726
7908
  };
7909
+ '/api/v1/{region}/bean/prices': {
7910
+ post: {
7911
+ req: PriceControllerCreateData;
7912
+ res: {
7913
+ /**
7914
+ * Price created successfully
7915
+ */
7916
+ 201: PriceResponseDto;
7917
+ /**
7918
+ * Currency or quoteCurrency commodity not found
7919
+ */
7920
+ 404: unknown;
7921
+ /**
7922
+ * Price already exists for this currency pair and date
7923
+ */
7924
+ 409: unknown;
7925
+ };
7926
+ };
7927
+ get: {
7928
+ req: PriceControllerFindAllData;
7929
+ res: {
7930
+ /**
7931
+ * Prices retrieved successfully
7932
+ */
7933
+ 200: PriceListResponseDto;
7934
+ };
7935
+ };
7936
+ };
7937
+ '/api/v1/{region}/bean/prices/{id}': {
7938
+ get: {
7939
+ req: PriceControllerFindOneData;
7940
+ res: {
7941
+ /**
7942
+ * Price retrieved successfully
7943
+ */
7944
+ 200: PriceResponseDto;
7945
+ /**
7946
+ * Price not found
7947
+ */
7948
+ 404: unknown;
7949
+ };
7950
+ };
7951
+ put: {
7952
+ req: PriceControllerUpdateData;
7953
+ res: {
7954
+ /**
7955
+ * Price updated successfully
7956
+ */
7957
+ 200: PriceResponseDto;
7958
+ /**
7959
+ * Price not found
7960
+ */
7961
+ 404: unknown;
7962
+ /**
7963
+ * Updated price conflicts with existing price
7964
+ */
7965
+ 409: unknown;
7966
+ };
7967
+ };
7968
+ delete: {
7969
+ req: PriceControllerDeleteData;
7970
+ res: {
7971
+ /**
7972
+ * Price deleted successfully
7973
+ */
7974
+ 204: void;
7975
+ /**
7976
+ * Price not found
7977
+ */
7978
+ 404: unknown;
7979
+ };
7980
+ };
7981
+ };
7982
+ '/api/v1/{region}/bean/prices/bulk': {
7983
+ post: {
7984
+ req: PriceControllerBulkCreateData;
7985
+ res: {
7986
+ /**
7987
+ * Prices created successfully
7988
+ */
7989
+ 201: Array<PriceResponseDto>;
7990
+ };
7991
+ };
7992
+ };
6727
7993
  '/api/v1/{region}/bean/recurring-rules': {
6728
7994
  post: {
6729
7995
  req: RecurringRuleControllerCreateData;
@@ -7368,6 +8634,166 @@ export type $OpenApiTs = {
7368
8634
  };
7369
8635
  };
7370
8636
  };
8637
+ '/api/v1/{region}/bean/events': {
8638
+ post: {
8639
+ req: EventControllerCreateData;
8640
+ res: {
8641
+ /**
8642
+ * Life event created successfully
8643
+ */
8644
+ 201: EventResponseDto;
8645
+ /**
8646
+ * Life event already exists for this (userId, type, date) combination
8647
+ */
8648
+ 409: unknown;
8649
+ };
8650
+ };
8651
+ get: {
8652
+ req: EventControllerFindAllData;
8653
+ res: {
8654
+ /**
8655
+ * Life events retrieved successfully
8656
+ */
8657
+ 200: EventListResponseDto;
8658
+ };
8659
+ };
8660
+ };
8661
+ '/api/v1/{region}/bean/events/{id}': {
8662
+ get: {
8663
+ req: EventControllerFindOneData;
8664
+ res: {
8665
+ /**
8666
+ * Life event retrieved successfully
8667
+ */
8668
+ 200: EventResponseDto;
8669
+ /**
8670
+ * Life event not found
8671
+ */
8672
+ 404: unknown;
8673
+ };
8674
+ };
8675
+ put: {
8676
+ req: EventControllerUpdateData;
8677
+ res: {
8678
+ /**
8679
+ * Life event updated successfully
8680
+ */
8681
+ 200: EventResponseDto;
8682
+ /**
8683
+ * If-Match header is not a valid ISO 8601 date
8684
+ */
8685
+ 400: unknown;
8686
+ /**
8687
+ * Life event not found
8688
+ */
8689
+ 404: unknown;
8690
+ /**
8691
+ * Updated event conflicts with an existing (userId, type, date) combination
8692
+ */
8693
+ 409: unknown;
8694
+ /**
8695
+ * If-Match precondition failed (updatedAt mismatch)
8696
+ */
8697
+ 412: unknown;
8698
+ };
8699
+ };
8700
+ delete: {
8701
+ req: EventControllerDeleteData;
8702
+ res: {
8703
+ /**
8704
+ * Life event deleted successfully
8705
+ */
8706
+ 204: void;
8707
+ /**
8708
+ * Life event not found
8709
+ */
8710
+ 404: unknown;
8711
+ };
8712
+ };
8713
+ };
8714
+ '/api/v1/{region}/bean/events/{id}/slice': {
8715
+ get: {
8716
+ req: EventControllerGetSliceData;
8717
+ res: {
8718
+ /**
8719
+ * Time-series sliced by the life event range
8720
+ */
8721
+ 200: unknown;
8722
+ /**
8723
+ * accountPattern query param is empty
8724
+ */
8725
+ 400: unknown;
8726
+ /**
8727
+ * Life event not found
8728
+ */
8729
+ 404: unknown;
8730
+ };
8731
+ };
8732
+ };
8733
+ '/api/v1/{region}/bean/reconciliations': {
8734
+ post: {
8735
+ req: ReconciliationControllerComputeData;
8736
+ res: {
8737
+ /**
8738
+ * Reconciliation preview
8739
+ */
8740
+ 200: ReconciliationComputeResultDto;
8741
+ /**
8742
+ * Account not found
8743
+ */
8744
+ 404: unknown;
8745
+ };
8746
+ };
8747
+ };
8748
+ '/api/v1/{region}/bean/reconciliations/assert': {
8749
+ post: {
8750
+ req: ReconciliationControllerAssertData;
8751
+ res: {
8752
+ /**
8753
+ * Balance assertion recorded
8754
+ */
8755
+ 201: ReconciliationRecordDto;
8756
+ /**
8757
+ * Account not found
8758
+ */
8759
+ 404: unknown;
8760
+ };
8761
+ };
8762
+ };
8763
+ '/api/v1/{region}/bean/reconciliations/pad': {
8764
+ post: {
8765
+ req: ReconciliationControllerPadData;
8766
+ res: {
8767
+ /**
8768
+ * Pad adjusting entry generated
8769
+ */
8770
+ 201: PadResultDto;
8771
+ /**
8772
+ * Book already within tolerance — no pad needed
8773
+ */
8774
+ 400: unknown;
8775
+ /**
8776
+ * Account not found
8777
+ */
8778
+ 404: unknown;
8779
+ };
8780
+ };
8781
+ };
8782
+ '/api/v1/{region}/bean/accounts/{accountId}/reconciliations': {
8783
+ get: {
8784
+ req: ReconciliationControllerHistoryData;
8785
+ res: {
8786
+ /**
8787
+ * Reconciliation history
8788
+ */
8789
+ 200: Array<ReconciliationRecordDto>;
8790
+ /**
8791
+ * Account not found
8792
+ */
8793
+ 404: unknown;
8794
+ };
8795
+ };
8796
+ };
7371
8797
  '/api/v1/{region}/bean/export/beancount': {
7372
8798
  get: {
7373
8799
  res: {
@@ -7658,6 +9084,32 @@ export type $OpenApiTs = {
7658
9084
  };
7659
9085
  };
7660
9086
  };
9087
+ '/api/v1/{region}/bean/import/parser-coverage-miss': {
9088
+ post: {
9089
+ req: TelemetryControllerReportCoverageMissData;
9090
+ res: {
9091
+ /**
9092
+ * Coverage miss report received
9093
+ */
9094
+ 200: unknown;
9095
+ /**
9096
+ * Unauthorized
9097
+ */
9098
+ 401: unknown;
9099
+ };
9100
+ };
9101
+ };
9102
+ '/api/v1/{region}/bean/import/parser-coverage-metrics': {
9103
+ get: {
9104
+ req: TelemetryControllerGetCoverageMetricsData;
9105
+ res: {
9106
+ /**
9107
+ * Coverage metrics
9108
+ */
9109
+ 200: unknown;
9110
+ };
9111
+ };
9112
+ };
7661
9113
  '/api/v1/{region}/bean/nlp/process': {
7662
9114
  post: {
7663
9115
  req: NlpControllerProcessNaturalLanguageData;
@@ -7727,7 +9179,10 @@ export type $OpenApiTs = {
7727
9179
  /**
7728
9180
  * Accounts retrieved successfully. Response type depends on groupBy parameter.
7729
9181
  */
7730
- 200: AccountsResponseDto | AssetClassAccountsResponseDto;
9182
+ 200:
9183
+ | AccountsResponseDto
9184
+ | AssetClassAccountsResponseDto
9185
+ | HoldingAssetClassCrossAccountResponseDto;
7731
9186
  /**
7732
9187
  * User not authenticated
7733
9188
  */
@@ -7754,6 +9209,44 @@ export type $OpenApiTs = {
7754
9209
  };
7755
9210
  };
7756
9211
  };
9212
+ '/api/v1/{region}/dashboard/expenses': {
9213
+ get: {
9214
+ req: DashboardControllerGetExpensesData;
9215
+ res: {
9216
+ /**
9217
+ * Expenses retrieved successfully
9218
+ */
9219
+ 200: ExpensesByCategoryResponseDto;
9220
+ /**
9221
+ * Invalid groupBy or period
9222
+ */
9223
+ 400: unknown;
9224
+ /**
9225
+ * User not authenticated
9226
+ */
9227
+ 401: unknown;
9228
+ };
9229
+ };
9230
+ };
9231
+ '/api/v1/{region}/investment/holdings/pnl': {
9232
+ get: {
9233
+ req: HoldingPnlControllerGetHoldingPnlData;
9234
+ res: {
9235
+ /**
9236
+ * Holding P&L retrieved successfully
9237
+ */
9238
+ 200: HoldingPnlResponseDto;
9239
+ /**
9240
+ * Invalid asOf format/value/future date, invalid accountId format, or unsupported method
9241
+ */
9242
+ 400: unknown;
9243
+ /**
9244
+ * User not authenticated
9245
+ */
9246
+ 401: unknown;
9247
+ };
9248
+ };
9249
+ };
7757
9250
  '/api/v1/{region}/reporting/portfolio/trends': {
7758
9251
  get: {
7759
9252
  req: ReportingControllerGetPortfolioTrendsData;
@@ -7769,6 +9262,21 @@ export type $OpenApiTs = {
7769
9262
  };
7770
9263
  };
7771
9264
  };
9265
+ '/api/v1/{region}/reporting/cash-flow/trends': {
9266
+ get: {
9267
+ req: ReportingControllerGetCashFlowTrendsData;
9268
+ res: {
9269
+ /**
9270
+ * Cash-flow trends retrieved successfully
9271
+ */
9272
+ 200: CashFlowTrendsResponseDto;
9273
+ /**
9274
+ * User not authenticated
9275
+ */
9276
+ 401: unknown;
9277
+ };
9278
+ };
9279
+ };
7772
9280
  '/api/v1/{region}/reporting/snapshots/generate': {
7773
9281
  post: {
7774
9282
  req: ReportingControllerGenerateSnapshotData;