@firela/api-types 0.0.0-canary.5c1ed455 → 0.0.0-canary.5fa96f73

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.
@@ -848,6 +848,51 @@ export type flag2 =
848
848
  */
849
849
  export type status2 = 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
850
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
+
851
896
  export type TransactionListResponseDto = {
852
897
  /**
853
898
  * List of transactions
@@ -865,6 +910,10 @@ export type TransactionListResponseDto = {
865
910
  * Number of items skipped
866
911
  */
867
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;
868
917
  };
869
918
 
870
919
  export type TagSuggestionDto = {
@@ -1324,17 +1373,17 @@ export type ResolveResultDto = {
1324
1373
  [key: string]: string;
1325
1374
  };
1326
1375
  /**
1327
- * Resolution ID for undo
1376
+ * Resolution ID for undo. Absent when the resolver rejected the decision (review stayed PENDING).
1328
1377
  */
1329
- resolutionId: string;
1378
+ resolutionId?: string;
1330
1379
  /**
1331
1380
  * Whether this decision can be undone
1332
1381
  */
1333
- canUndo: boolean;
1382
+ canUndo?: boolean;
1334
1383
  /**
1335
1384
  * Deadline for undo (24h from resolution)
1336
1385
  */
1337
- undoDeadline: string;
1386
+ undoDeadline?: string;
1338
1387
  /**
1339
1388
  * Rule ID if learning was triggered (ACCEPT_AND_LEARN actions). Use this to deep-link to the rule management page.
1340
1389
  */
@@ -3029,6 +3078,96 @@ export type UpdatePropertyDto = {
3029
3078
  value: string;
3030
3079
  };
3031
3080
 
3081
+ export type CreateBeanEventDto = {
3082
+ /**
3083
+ * Life event date (ISO 8601)
3084
+ */
3085
+ date: string;
3086
+ /**
3087
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3088
+ */
3089
+ type: string;
3090
+ /**
3091
+ * Life event description. Empty string is a VALID value (distinct from absence).
3092
+ */
3093
+ description: string;
3094
+ /**
3095
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3096
+ */
3097
+ meta?: {
3098
+ [key: string]: unknown;
3099
+ };
3100
+ };
3101
+
3102
+ export type EventResponseDto = {
3103
+ /**
3104
+ * Unique identifier
3105
+ */
3106
+ id: string;
3107
+ /**
3108
+ * User ID (owner of the life event)
3109
+ */
3110
+ userId: string;
3111
+ /**
3112
+ * Life event date (ISO 8601 format)
3113
+ */
3114
+ date: string;
3115
+ /**
3116
+ * Life event type (user-defined, e.g., "employer", "location")
3117
+ */
3118
+ type: string;
3119
+ /**
3120
+ * Life event description. May be an empty string (a valid value distinct from absence).
3121
+ */
3122
+ description: string;
3123
+ /**
3124
+ * Product-side metadata (free-form JSON)
3125
+ */
3126
+ meta: {
3127
+ [key: string]: unknown;
3128
+ };
3129
+ /**
3130
+ * Creation timestamp
3131
+ */
3132
+ createdAt: string;
3133
+ /**
3134
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3135
+ */
3136
+ updatedAt: string;
3137
+ };
3138
+
3139
+ export type EventListResponseDto = {
3140
+ /**
3141
+ * List of life events
3142
+ */
3143
+ items: Array<EventResponseDto>;
3144
+ /**
3145
+ * Total number of life events matching the query
3146
+ */
3147
+ total: number;
3148
+ };
3149
+
3150
+ export type UpdateBeanEventDto = {
3151
+ /**
3152
+ * Life event date (ISO 8601)
3153
+ */
3154
+ date?: string;
3155
+ /**
3156
+ * Life event type (user-defined)
3157
+ */
3158
+ type?: string;
3159
+ /**
3160
+ * Life event description. Empty string is a VALID value (distinct from absence).
3161
+ */
3162
+ description?: string;
3163
+ /**
3164
+ * Product-side metadata (free-form JSON)
3165
+ */
3166
+ meta?: {
3167
+ [key: string]: unknown;
3168
+ };
3169
+ };
3170
+
3032
3171
  export type FileImportDto = {
3033
3172
  /**
3034
3173
  * Bill file to import (CSV, PDF, OFX, etc.)
@@ -4070,17 +4209,6 @@ export type liabilitySubType = 'borrow' | 'repay';
4070
4209
  */
4071
4210
  export type equitySubType = 'opening' | 'adjustment';
4072
4211
 
4073
- export type BalanceByCurrencyDto = {
4074
- /**
4075
- * ISO 4217 currency code
4076
- */
4077
- currency: string;
4078
- /**
4079
- * Balance amount
4080
- */
4081
- balance: string;
4082
- };
4083
-
4084
4212
  export type NetWorthByCurrencyDto = {
4085
4213
  /**
4086
4214
  * Net worth by currency
@@ -4121,21 +4249,6 @@ export type ConvertedNetWorthDto = {
4121
4249
  };
4122
4250
  };
4123
4251
 
4124
- export type ExchangeRateWarningDto = {
4125
- /**
4126
- * Warning type
4127
- */
4128
- type: string;
4129
- /**
4130
- * Currency without exchange rate
4131
- */
4132
- currency: string;
4133
- /**
4134
- * Total amount affected
4135
- */
4136
- totalAmount: string;
4137
- };
4138
-
4139
4252
  export type NetWorthResponseDto = {
4140
4253
  /**
4141
4254
  * Total net worth (assets - liabilities, converted to base currency)
@@ -4216,9 +4329,40 @@ export type PlatformGroupDto = {
4216
4329
  */
4217
4330
  accounts: Array<AccountItemDto>;
4218
4331
  /**
4219
- * Total balance across all accounts in platform
4332
+ * FX-converted total balance in base currency
4220
4333
  */
4221
4334
  totalBalance: string;
4335
+ /**
4336
+ * Raw (unconverted) balances grouped by currency
4337
+ */
4338
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4339
+ /**
4340
+ * Converted balance in base currency (omitted when no currency is convertible)
4341
+ */
4342
+ convertedBalance?: string;
4343
+ /**
4344
+ * Share of the grand converted total (0-100); 0 when grand total is 0
4345
+ */
4346
+ sharePct: number;
4347
+ };
4348
+
4349
+ export type AccountExchangeRateWarningDto = {
4350
+ /**
4351
+ * Warning type
4352
+ */
4353
+ type: string;
4354
+ /**
4355
+ * Currency without exchange rate
4356
+ */
4357
+ currency: string;
4358
+ /**
4359
+ * Affected account paths
4360
+ */
4361
+ accounts: Array<string>;
4362
+ /**
4363
+ * Total amount in this currency
4364
+ */
4365
+ totalAmount: string;
4222
4366
  };
4223
4367
 
4224
4368
  export type AccountsSummaryDto = {
@@ -4230,6 +4374,14 @@ export type AccountsSummaryDto = {
4230
4374
  * Total number of platforms
4231
4375
  */
4232
4376
  totalPlatforms: number;
4377
+ /**
4378
+ * Base currency for conversion
4379
+ */
4380
+ baseCurrency: string;
4381
+ /**
4382
+ * Per-account exchange rate warnings
4383
+ */
4384
+ warnings?: Array<AccountExchangeRateWarningDto>;
4233
4385
  };
4234
4386
 
4235
4387
  export type AccountsResponseDto = {
@@ -4345,25 +4497,6 @@ export type assetClass =
4345
4497
  | 'REAL_ESTATE'
4346
4498
  | 'INDEX';
4347
4499
 
4348
- export type AccountExchangeRateWarningDto = {
4349
- /**
4350
- * Warning type
4351
- */
4352
- type: string;
4353
- /**
4354
- * Currency without exchange rate
4355
- */
4356
- currency: string;
4357
- /**
4358
- * Affected account paths
4359
- */
4360
- accounts: Array<string>;
4361
- /**
4362
- * Total amount in this currency
4363
- */
4364
- totalAmount: string;
4365
- };
4366
-
4367
4500
  export type AssetClassSummaryDto = {
4368
4501
  /**
4369
4502
  * Total number of accounts
@@ -4529,6 +4662,63 @@ export type CashFlowResponseDto = {
4529
4662
  warnings?: Array<ExchangeRateWarningDto>;
4530
4663
  };
4531
4664
 
4665
+ export type CategoryGroupDto = {
4666
+ /**
4667
+ * Functional category (account-path Group segment); regional and universal account paths merge under it
4668
+ */
4669
+ category: string;
4670
+ /**
4671
+ * Converted total for this category in base currency (expense amount when flow=expense, income amount when flow=income)
4672
+ */
4673
+ totalExpense: string;
4674
+ /**
4675
+ * Share of grand total (0-100); 0 when grand total is 0
4676
+ */
4677
+ sharePct: number;
4678
+ /**
4679
+ * Raw (unconverted) expense per currency
4680
+ */
4681
+ balanceByCurrency: Array<BalanceByCurrencyDto>;
4682
+ /**
4683
+ * Converted total in base currency (omitted when FX missing for all currencies in this category)
4684
+ */
4685
+ convertedBalance?: string;
4686
+ };
4687
+
4688
+ export type ExpensesByCategorySummaryDto = {
4689
+ /**
4690
+ * Total across all categories, converted (convertible categories only); expense totals when flow=expense, income totals when flow=income
4691
+ */
4692
+ totalExpense: string;
4693
+ /**
4694
+ * Number of categories
4695
+ */
4696
+ categoryCount: number;
4697
+ };
4698
+
4699
+ export type ExpensesByCategoryResponseDto = {
4700
+ /**
4701
+ * Period requested
4702
+ */
4703
+ period: string;
4704
+ /**
4705
+ * Base currency for converted values
4706
+ */
4707
+ baseCurrency: string;
4708
+ /**
4709
+ * Expense groups by functional category, sorted by converted total desc
4710
+ */
4711
+ groups: Array<CategoryGroupDto>;
4712
+ /**
4713
+ * Summary statistics
4714
+ */
4715
+ summary: ExpensesByCategorySummaryDto;
4716
+ /**
4717
+ * Exchange rate warnings (e.g. missing rate for a currency)
4718
+ */
4719
+ warnings?: Array<ExchangeRateWarningDto>;
4720
+ };
4721
+
4532
4722
  export type MonetaryDto = {
4533
4723
  /**
4534
4724
  * Amount (Decimal string)
@@ -4852,6 +5042,14 @@ export type TimeSeriesPointDto = {
4852
5042
  change?: {
4853
5043
  [key: string]: unknown;
4854
5044
  };
5045
+ /**
5046
+ * Total assets at this date (in base currency)
5047
+ */
5048
+ assets?: string;
5049
+ /**
5050
+ * Total liabilities at this date (in base currency)
5051
+ */
5052
+ liabilities?: string;
4855
5053
  /**
4856
5054
  * Multi-currency breakdown for this point
4857
5055
  */
@@ -4919,6 +5117,71 @@ export type PortfolioTrendsResponseDto = {
4919
5117
  warnings?: Array<ExchangeRateWarningDto>;
4920
5118
  };
4921
5119
 
5120
+ export type CashFlowPointDto = {
5121
+ /**
5122
+ * Month key (YYYY-MM)
5123
+ */
5124
+ month: string;
5125
+ /**
5126
+ * Income in base currency (absolute, converted)
5127
+ */
5128
+ income: string;
5129
+ /**
5130
+ * Expense in base currency (absolute, converted)
5131
+ */
5132
+ expense: string;
5133
+ /**
5134
+ * netSavings = income − expense (savings positive)
5135
+ */
5136
+ netSavings: string;
5137
+ };
5138
+
5139
+ export type CashFlowTrendSummaryDto = {
5140
+ /**
5141
+ * Total income across the period
5142
+ */
5143
+ totalIncome: string;
5144
+ /**
5145
+ * Total expense across the period
5146
+ */
5147
+ totalExpense: string;
5148
+ /**
5149
+ * income − expense across the period
5150
+ */
5151
+ totalNetSavings: string;
5152
+ /**
5153
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
5154
+ */
5155
+ averageMonthlyNetSavings: string;
5156
+ };
5157
+
5158
+ export type CashFlowTrendsResponseDto = {
5159
+ /**
5160
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
5161
+ */
5162
+ series: Array<CashFlowPointDto>;
5163
+ /**
5164
+ * Period totals
5165
+ */
5166
+ summary: CashFlowTrendSummaryDto;
5167
+ /**
5168
+ * Period requested
5169
+ */
5170
+ period: string;
5171
+ /**
5172
+ * Data granularity (v1 returns month buckets)
5173
+ */
5174
+ granularity: string;
5175
+ /**
5176
+ * Base currency for converted values
5177
+ */
5178
+ currency: string;
5179
+ /**
5180
+ * Exchange rate warnings (e.g. missing rate for a currency)
5181
+ */
5182
+ warnings?: Array<ExchangeRateWarningDto>;
5183
+ };
5184
+
4922
5185
  export type GenerateSnapshotBody = unknown;
4923
5186
 
4924
5187
  export type GenerateSnapshotResponse = unknown;
@@ -5105,6 +5368,10 @@ export type TransactionControllerListData = {
5105
5368
  * Filter by account ID (transactions with postings to this account)
5106
5369
  */
5107
5370
  accountId?: string;
5371
+ /**
5372
+ * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
5373
+ */
5374
+ category?: string;
5108
5375
  /**
5109
5376
  * Filter by start date (inclusive), format: YYYY-MM-DD
5110
5377
  */
@@ -6096,6 +6363,104 @@ export type PropertyControllerDeleteData = {
6096
6363
 
6097
6364
  export type PropertyControllerDeleteResponse = void;
6098
6365
 
6366
+ export type EventControllerCreateData = {
6367
+ /**
6368
+ * Region code for tenant context (decorative for life events)
6369
+ */
6370
+ region: 'cn' | 'us' | 'de' | 'gb';
6371
+ requestBody: CreateBeanEventDto;
6372
+ };
6373
+
6374
+ export type EventControllerCreateResponse = EventResponseDto;
6375
+
6376
+ export type EventControllerFindAllData = {
6377
+ /**
6378
+ * Filter life events from this date (ISO 8601 format)
6379
+ */
6380
+ from?: string;
6381
+ /**
6382
+ * Number of items per page (default: 20, max: 100)
6383
+ */
6384
+ limit?: number;
6385
+ /**
6386
+ * Page number for pagination (default: 1)
6387
+ */
6388
+ page?: number;
6389
+ /**
6390
+ * Search term for description (case-insensitive partial match)
6391
+ */
6392
+ q?: string;
6393
+ /**
6394
+ * Region code for tenant context (decorative for life events)
6395
+ */
6396
+ region: 'cn' | 'us' | 'de' | 'gb';
6397
+ /**
6398
+ * Filter life events to this date (ISO 8601 format)
6399
+ */
6400
+ to?: string;
6401
+ /**
6402
+ * Filter by life event type (exact match)
6403
+ */
6404
+ type?: string;
6405
+ };
6406
+
6407
+ export type EventControllerFindAllResponse = EventListResponseDto;
6408
+
6409
+ export type EventControllerFindOneData = {
6410
+ /**
6411
+ * Life event ID
6412
+ */
6413
+ id: string;
6414
+ /**
6415
+ * Region code for tenant context (decorative for life events)
6416
+ */
6417
+ region: 'cn' | 'us' | 'de' | 'gb';
6418
+ };
6419
+
6420
+ export type EventControllerFindOneResponse = EventResponseDto;
6421
+
6422
+ export type EventControllerUpdateData = {
6423
+ /**
6424
+ * Life event ID
6425
+ */
6426
+ id: string;
6427
+ /**
6428
+ * Region code for tenant context (decorative for life events)
6429
+ */
6430
+ region: 'cn' | 'us' | 'de' | 'gb';
6431
+ requestBody: UpdateBeanEventDto;
6432
+ };
6433
+
6434
+ export type EventControllerUpdateResponse = EventResponseDto;
6435
+
6436
+ export type EventControllerDeleteData = {
6437
+ /**
6438
+ * Life event ID
6439
+ */
6440
+ id: string;
6441
+ /**
6442
+ * Region code for tenant context (decorative for life events)
6443
+ */
6444
+ region: 'cn' | 'us' | 'de' | 'gb';
6445
+ };
6446
+
6447
+ export type EventControllerDeleteResponse = void;
6448
+
6449
+ export type EventControllerGetSliceData = {
6450
+ accountPattern: string;
6451
+ granularity: string;
6452
+ /**
6453
+ * Life event ID
6454
+ */
6455
+ id: string;
6456
+ /**
6457
+ * Region code for tenant context (decorative for life events)
6458
+ */
6459
+ region: 'cn' | 'us' | 'de' | 'gb';
6460
+ };
6461
+
6462
+ export type EventControllerGetSliceResponse = unknown;
6463
+
6099
6464
  export type ExportControllerExportBeancountResponse = unknown;
6100
6465
 
6101
6466
  export type FileImportControllerImportFileData = {
@@ -6401,6 +6766,28 @@ export type DashboardControllerGetCashFlowData = {
6401
6766
 
6402
6767
  export type DashboardControllerGetCashFlowResponse = CashFlowResponseDto;
6403
6768
 
6769
+ export type DashboardControllerGetExpensesData = {
6770
+ /**
6771
+ * Account root to aggregate (expense → ^Expenses:, income → ^Income:)
6772
+ */
6773
+ flow?: 'expense' | 'income';
6774
+ /**
6775
+ * Grouping strategy
6776
+ */
6777
+ groupBy?: 'category';
6778
+ /**
6779
+ * Time window (1m = current calendar month)
6780
+ */
6781
+ period?: '1m' | '3m' | '6m' | '1y';
6782
+ /**
6783
+ * Region code for tenant context
6784
+ */
6785
+ region: 'cn' | 'us' | 'de' | 'gb';
6786
+ };
6787
+
6788
+ export type DashboardControllerGetExpensesResponse =
6789
+ ExpensesByCategoryResponseDto;
6790
+
6404
6791
  export type HoldingPnlControllerGetHoldingPnlData = {
6405
6792
  /**
6406
6793
  * Scope to a single account
@@ -6537,6 +6924,24 @@ export type ReportingControllerGetPortfolioTrendsData = {
6537
6924
  export type ReportingControllerGetPortfolioTrendsResponse =
6538
6925
  PortfolioTrendsResponseDto;
6539
6926
 
6927
+ export type ReportingControllerGetCashFlowTrendsData = {
6928
+ /**
6929
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6930
+ */
6931
+ granularity?: 'day' | 'week' | 'month';
6932
+ /**
6933
+ * Time period
6934
+ */
6935
+ period?: '1m' | '3m' | '6m' | '1y';
6936
+ /**
6937
+ * Region code for tenant context
6938
+ */
6939
+ region: 'cn' | 'us' | 'de' | 'gb';
6940
+ };
6941
+
6942
+ export type ReportingControllerGetCashFlowTrendsResponse =
6943
+ CashFlowTrendsResponseDto;
6944
+
6540
6945
  export type ReportingControllerGenerateSnapshotData = {
6541
6946
  /**
6542
6947
  * Region code for tenant context
@@ -7968,6 +8373,102 @@ export type $OpenApiTs = {
7968
8373
  };
7969
8374
  };
7970
8375
  };
8376
+ '/api/v1/{region}/bean/events': {
8377
+ post: {
8378
+ req: EventControllerCreateData;
8379
+ res: {
8380
+ /**
8381
+ * Life event created successfully
8382
+ */
8383
+ 201: EventResponseDto;
8384
+ /**
8385
+ * Life event already exists for this (userId, type, date) combination
8386
+ */
8387
+ 409: unknown;
8388
+ };
8389
+ };
8390
+ get: {
8391
+ req: EventControllerFindAllData;
8392
+ res: {
8393
+ /**
8394
+ * Life events retrieved successfully
8395
+ */
8396
+ 200: EventListResponseDto;
8397
+ };
8398
+ };
8399
+ };
8400
+ '/api/v1/{region}/bean/events/{id}': {
8401
+ get: {
8402
+ req: EventControllerFindOneData;
8403
+ res: {
8404
+ /**
8405
+ * Life event retrieved successfully
8406
+ */
8407
+ 200: EventResponseDto;
8408
+ /**
8409
+ * Life event not found
8410
+ */
8411
+ 404: unknown;
8412
+ };
8413
+ };
8414
+ put: {
8415
+ req: EventControllerUpdateData;
8416
+ res: {
8417
+ /**
8418
+ * Life event updated successfully
8419
+ */
8420
+ 200: EventResponseDto;
8421
+ /**
8422
+ * If-Match header is not a valid ISO 8601 date
8423
+ */
8424
+ 400: unknown;
8425
+ /**
8426
+ * Life event not found
8427
+ */
8428
+ 404: unknown;
8429
+ /**
8430
+ * Updated event conflicts with an existing (userId, type, date) combination
8431
+ */
8432
+ 409: unknown;
8433
+ /**
8434
+ * If-Match precondition failed (updatedAt mismatch)
8435
+ */
8436
+ 412: unknown;
8437
+ };
8438
+ };
8439
+ delete: {
8440
+ req: EventControllerDeleteData;
8441
+ res: {
8442
+ /**
8443
+ * Life event deleted successfully
8444
+ */
8445
+ 204: void;
8446
+ /**
8447
+ * Life event not found
8448
+ */
8449
+ 404: unknown;
8450
+ };
8451
+ };
8452
+ };
8453
+ '/api/v1/{region}/bean/events/{id}/slice': {
8454
+ get: {
8455
+ req: EventControllerGetSliceData;
8456
+ res: {
8457
+ /**
8458
+ * Time-series sliced by the life event range
8459
+ */
8460
+ 200: unknown;
8461
+ /**
8462
+ * accountPattern query param is empty
8463
+ */
8464
+ 400: unknown;
8465
+ /**
8466
+ * Life event not found
8467
+ */
8468
+ 404: unknown;
8469
+ };
8470
+ };
8471
+ };
7971
8472
  '/api/v1/{region}/bean/export/beancount': {
7972
8473
  get: {
7973
8474
  res: {
@@ -8383,6 +8884,25 @@ export type $OpenApiTs = {
8383
8884
  };
8384
8885
  };
8385
8886
  };
8887
+ '/api/v1/{region}/dashboard/expenses': {
8888
+ get: {
8889
+ req: DashboardControllerGetExpensesData;
8890
+ res: {
8891
+ /**
8892
+ * Expenses retrieved successfully
8893
+ */
8894
+ 200: ExpensesByCategoryResponseDto;
8895
+ /**
8896
+ * Invalid groupBy or period
8897
+ */
8898
+ 400: unknown;
8899
+ /**
8900
+ * User not authenticated
8901
+ */
8902
+ 401: unknown;
8903
+ };
8904
+ };
8905
+ };
8386
8906
  '/api/v1/{region}/investment/holdings/pnl': {
8387
8907
  get: {
8388
8908
  req: HoldingPnlControllerGetHoldingPnlData;
@@ -8501,6 +9021,21 @@ export type $OpenApiTs = {
8501
9021
  };
8502
9022
  };
8503
9023
  };
9024
+ '/api/v1/{region}/reporting/cash-flow/trends': {
9025
+ get: {
9026
+ req: ReportingControllerGetCashFlowTrendsData;
9027
+ res: {
9028
+ /**
9029
+ * Cash-flow trends retrieved successfully
9030
+ */
9031
+ 200: CashFlowTrendsResponseDto;
9032
+ /**
9033
+ * User not authenticated
9034
+ */
9035
+ 401: unknown;
9036
+ };
9037
+ };
9038
+ };
8504
9039
  '/api/v1/{region}/reporting/snapshots/generate': {
8505
9040
  post: {
8506
9041
  req: ReportingControllerGenerateSnapshotData;