@firela/api-types 0.0.0-canary.7cd70834 → 0.0.0-canary.7fcf7940

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.
@@ -17,23 +17,33 @@ import type {
17
17
  AccountControllerCloseResponse,
18
18
  AccountControllerReopenData,
19
19
  AccountControllerReopenResponse,
20
+ AccountControllerAddOpeningBalanceData,
21
+ AccountControllerAddOpeningBalanceResponse,
22
+ AccountStandardsControllerGetTemplatesData,
23
+ AccountStandardsControllerGetTemplatesResponse,
24
+ AccountStandardsControllerGetTemplateMetadataData,
25
+ AccountStandardsControllerGetTemplateMetadataResponse,
26
+ AccountStandardsControllerGetRegionsData,
27
+ AccountStandardsControllerGetRegionsResponse,
20
28
  TransactionControllerCreateData,
21
29
  TransactionControllerCreateResponse,
22
30
  TransactionControllerListData,
23
31
  TransactionControllerListResponse,
24
- TransactionControllerData,
25
- TransactionControllerResponse,
32
+ TransactionControllerCreateBatchData,
33
+ TransactionControllerCreateBatchResponse,
34
+ TransactionControllerCorrectData,
35
+ TransactionControllerCorrectResponse,
36
+ TransactionControllerSuggestTagsData,
37
+ TransactionControllerSuggestTagsResponse,
26
38
  TransactionControllerGetDetailData,
27
39
  TransactionControllerGetDetailResponse,
28
40
  TransactionControllerUpdateData,
29
41
  TransactionControllerUpdateResponse,
30
- TransactionController1Data,
31
- TransactionController1Response,
32
- AccountStandardsControllerGetTemplatesData,
33
- AccountStandardsControllerGetTemplatesResponse,
34
- AccountStandardsControllerGetRegionsResponse,
42
+ TransactionControllerDeleteData,
43
+ TransactionControllerDeleteResponse,
35
44
  BalanceControllerGetBalanceData,
36
45
  BalanceControllerGetBalanceResponse,
46
+ BalanceControllerGetMultiCurrencyBalanceData,
37
47
  BalanceControllerGetMultiCurrencyBalanceResponse,
38
48
  ReviewControllerFindAllData,
39
49
  ReviewControllerFindAllResponse,
@@ -41,13 +51,14 @@ import type {
41
51
  ReviewControllerGetStatsResponse,
42
52
  ReviewControllerFindOneData,
43
53
  ReviewControllerFindOneResponse,
44
- ReviewControllerData,
45
- ReviewControllerResponse,
46
- ReviewController1Data,
47
- ReviewController1Response,
48
- ReviewController2Data,
49
- ReviewController2Response,
50
- PayeeControllerResponse,
54
+ ReviewControllerResolveData,
55
+ ReviewControllerResolveResponse,
56
+ ReviewControllerUndoData,
57
+ ReviewControllerUndoResponse,
58
+ ReviewControllerBatchResolveData,
59
+ ReviewControllerBatchResolveResponse,
60
+ PayeeControllerCreateData,
61
+ PayeeControllerCreateResponse,
51
62
  PayeeControllerFindAllData,
52
63
  PayeeControllerFindAllResponse,
53
64
  PayeeControllerAutocompleteData,
@@ -56,43 +67,62 @@ import type {
56
67
  PayeeControllerGetTopPayeesResponse,
57
68
  PayeeControllerFindOneData,
58
69
  PayeeControllerFindOneResponse,
59
- PayeeController1Response,
60
- PayeeController2Response,
61
- PayeeProfileAdminControllerResponse,
70
+ PayeeControllerUpdateData,
71
+ PayeeControllerUpdateResponse,
72
+ PayeeControllerDeleteData,
73
+ PayeeControllerDeleteResponse,
74
+ PayeeProfileAdminControllerCreateData,
75
+ PayeeProfileAdminControllerCreateResponse,
62
76
  PayeeProfileAdminControllerFindAllData,
63
77
  PayeeProfileAdminControllerFindAllResponse,
64
78
  PayeeProfileAdminControllerFindOneData,
65
79
  PayeeProfileAdminControllerFindOneResponse,
66
- PayeeProfileAdminController1Response,
67
- PayeeProfileAdminController2Response,
68
- PayeeProfileAdminController3Response,
69
- PayeeProfileAdminController4Response,
70
- CommodityControllerData,
71
- CommodityControllerResponse,
80
+ PayeeProfileAdminControllerUpdateData,
81
+ PayeeProfileAdminControllerUpdateResponse,
82
+ PayeeProfileAdminControllerDeleteData,
83
+ PayeeProfileAdminControllerDeleteResponse,
84
+ PayeeProfileAdminControllerVerifyData,
85
+ PayeeProfileAdminControllerVerifyResponse,
86
+ PayeeProfileAdminControllerUnverifyData,
87
+ PayeeProfileAdminControllerUnverifyResponse,
88
+ CommodityControllerCreateData,
89
+ CommodityControllerCreateResponse,
72
90
  CommodityControllerFindAllData,
73
91
  CommodityControllerFindAllResponse,
74
92
  CommodityControllerFindOneData,
75
93
  CommodityControllerFindOneResponse,
76
- CommodityController1Data,
77
- CommodityController1Response,
78
- CommodityController2Data,
79
- CommodityController2Response,
80
- CommodityController3Data,
81
- CommodityController3Response,
82
- CommodityController4Data,
83
- CommodityController4Response,
84
- RecurringRuleControllerData,
85
- RecurringRuleControllerResponse,
94
+ CommodityControllerUpdateData,
95
+ CommodityControllerUpdateResponse,
96
+ CommodityControllerDeleteData,
97
+ CommodityControllerDeleteResponse,
98
+ CommodityControllerGetOrCreateData,
99
+ CommodityControllerGetOrCreateResponse,
100
+ CommodityControllerBulkCreateData,
101
+ CommodityControllerBulkCreateResponse,
102
+ PriceControllerCreateData,
103
+ PriceControllerCreateResponse,
104
+ PriceControllerFindAllData,
105
+ PriceControllerFindAllResponse,
106
+ PriceControllerFindOneData,
107
+ PriceControllerFindOneResponse,
108
+ PriceControllerUpdateData,
109
+ PriceControllerUpdateResponse,
110
+ PriceControllerDeleteData,
111
+ PriceControllerDeleteResponse,
112
+ PriceControllerBulkCreateData,
113
+ PriceControllerBulkCreateResponse,
114
+ RecurringRuleControllerCreateData,
115
+ RecurringRuleControllerCreateResponse,
86
116
  RecurringRuleControllerFindAllData,
87
117
  RecurringRuleControllerFindAllResponse,
88
- RecurringRuleController1Data,
89
- RecurringRuleController1Response,
118
+ RecurringRuleControllerCreateFromTransactionData,
119
+ RecurringRuleControllerCreateFromTransactionResponse,
90
120
  RecurringRuleControllerFindOneData,
91
121
  RecurringRuleControllerFindOneResponse,
92
- RecurringRuleController2Data,
93
- RecurringRuleController2Response,
94
- RecurringRuleController3Data,
95
- RecurringRuleController3Response,
122
+ RecurringRuleControllerUpdateData,
123
+ RecurringRuleControllerUpdateResponse,
124
+ RecurringRuleControllerDeleteData,
125
+ RecurringRuleControllerDeleteResponse,
96
126
  RecurringRuleControllerGetWithStatsData,
97
127
  RecurringRuleControllerGetWithStatsResponse,
98
128
  ExpectedTransactionControllerFindAllData,
@@ -101,38 +131,26 @@ import type {
101
131
  ExpectedTransactionControllerFindOverdueResponse,
102
132
  ExpectedTransactionControllerFindOneData,
103
133
  ExpectedTransactionControllerFindOneResponse,
104
- ExpectedTransactionControllerData,
105
- ExpectedTransactionControllerResponse,
106
- ExpectedTransactionController1Data,
107
- ExpectedTransactionController1Response,
108
- ExpectedTransactionController2Data,
109
- ExpectedTransactionController2Response,
110
- ExpectedTransactionController3Data,
111
- ExpectedTransactionController3Response,
112
- ExpectedTransactionController4Data,
113
- ExpectedTransactionController4Response,
134
+ ExpectedTransactionControllerSkipData,
135
+ ExpectedTransactionControllerSkipResponse,
136
+ ExpectedTransactionControllerUndoSkipData,
137
+ ExpectedTransactionControllerUndoSkipResponse,
138
+ ExpectedTransactionControllerConfirmMatchData,
139
+ ExpectedTransactionControllerConfirmMatchResponse,
140
+ ExpectedTransactionControllerUnmatchData,
141
+ ExpectedTransactionControllerUnmatchResponse,
142
+ ExpectedTransactionControllerEnterNowData,
143
+ ExpectedTransactionControllerEnterNowResponse,
114
144
  ForecastControllerGetForecastData,
115
145
  ForecastControllerGetForecastResponse,
116
- TransactionRuleControllerData,
117
- TransactionRuleControllerResponse,
118
- TransactionRuleControllerListData,
119
- TransactionRuleControllerListResponse,
120
- TransactionRuleControllerValidateData,
121
- TransactionRuleControllerValidateResponse,
122
- TransactionRuleController1Data,
123
- TransactionRuleController1Response,
124
- TransactionRuleControllerExportData,
125
- TransactionRuleControllerExportResponse,
126
- TransactionRuleControllerGetStatisticsData,
127
- TransactionRuleControllerGetStatisticsResponse,
128
- TransactionRuleControllerGetDetailData,
129
- TransactionRuleControllerGetDetailResponse,
130
- TransactionRuleController2Data,
131
- TransactionRuleController2Response,
132
- TransactionRuleController3Data,
133
- TransactionRuleController3Response,
134
- TransactionRuleControllerTestData,
135
- TransactionRuleControllerTestResponse,
146
+ ReportingControllerGetPortfolioTrendsData,
147
+ ReportingControllerGetPortfolioTrendsResponse,
148
+ ReportingControllerGetCashFlowTrendsData,
149
+ ReportingControllerGetCashFlowTrendsResponse,
150
+ ReportingControllerGenerateSnapshotData,
151
+ ReportingControllerGenerateSnapshotResponse,
152
+ ReportingControllerBackfillSnapshotsData,
153
+ ReportingControllerBackfillSnapshotsResponse,
136
154
  UserControllerDeleteOwnUserData,
137
155
  UserControllerDeleteOwnUserResponse,
138
156
  UserControllerGetUserData,
@@ -151,25 +169,87 @@ import type {
151
169
  PropertyControllerGetAllResponse,
152
170
  PropertyControllerGetByKeyData,
153
171
  PropertyControllerGetByKeyResponse,
154
- PropertyControllerResponse,
155
- PropertyController1Response,
172
+ PropertyControllerUpdateData,
173
+ PropertyControllerUpdateResponse,
174
+ PropertyControllerDeleteData,
175
+ PropertyControllerDeleteResponse,
176
+ TransactionRuleControllerCreateData,
177
+ TransactionRuleControllerCreateResponse,
178
+ TransactionRuleControllerListData,
179
+ TransactionRuleControllerListResponse,
180
+ TransactionRuleControllerValidateData,
181
+ TransactionRuleControllerValidateResponse,
182
+ TransactionRuleControllerBulkCreateData,
183
+ TransactionRuleControllerBulkCreateResponse,
184
+ TransactionRuleControllerExportData,
185
+ TransactionRuleControllerExportResponse,
186
+ TransactionRuleControllerGetStatisticsData,
187
+ TransactionRuleControllerGetStatisticsResponse,
188
+ TransactionRuleControllerGetDetailData,
189
+ TransactionRuleControllerGetDetailResponse,
190
+ TransactionRuleControllerUpdateData,
191
+ TransactionRuleControllerUpdateResponse,
192
+ TransactionRuleControllerDeleteData,
193
+ TransactionRuleControllerDeleteResponse,
194
+ TransactionRuleControllerTestData,
195
+ TransactionRuleControllerTestResponse,
196
+ CategoryCatalogControllerListData,
197
+ CategoryCatalogControllerListResponse,
198
+ EventControllerCreateData,
199
+ EventControllerCreateResponse,
200
+ EventControllerFindAllData,
201
+ EventControllerFindAllResponse,
202
+ EventControllerFindOneData,
203
+ EventControllerFindOneResponse,
204
+ EventControllerUpdateData,
205
+ EventControllerUpdateResponse,
206
+ EventControllerDeleteData,
207
+ EventControllerDeleteResponse,
208
+ EventControllerGetSliceData,
209
+ EventControllerGetSliceResponse,
210
+ OnboardingControllerBootstrapData,
211
+ OnboardingControllerBootstrapResponse,
212
+ ReconciliationControllerComputeData,
213
+ ReconciliationControllerComputeResponse,
214
+ ReconciliationControllerAssertData,
215
+ ReconciliationControllerAssertResponse,
216
+ ReconciliationControllerPadData,
217
+ ReconciliationControllerPadResponse,
218
+ ReconciliationControllerHistoryData,
219
+ ReconciliationControllerHistoryResponse,
220
+ ExportControllerExportBeancountResponse,
156
221
  FileImportControllerImportFileData,
157
222
  FileImportControllerImportFileResponse,
158
223
  FileImportControllerIdentifyFileData,
159
224
  FileImportControllerIdentifyFileResponse,
225
+ FileImportControllerImportBeancountData,
226
+ FileImportControllerImportBeancountResponse,
160
227
  ImporterConfigControllerGetConfigData,
161
228
  ImporterConfigControllerGetConfigResponse,
162
- ImporterConfigControllerData,
163
- ImporterConfigControllerResponse,
164
- ImporterConfigController1Data,
165
- ImporterConfigController1Response,
229
+ ImporterConfigControllerUpdateConfigData,
230
+ ImporterConfigControllerUpdateConfigResponse,
231
+ ImporterConfigControllerResetConfigData,
232
+ ImporterConfigControllerResetConfigResponse,
166
233
  ProviderSyncControllerSyncData,
167
234
  ProviderSyncControllerSyncResponse,
235
+ ProviderSyncControllerGetSupportedProvidersData,
168
236
  ProviderSyncControllerGetSupportedProvidersResponse,
169
237
  ProviderSyncControllerIsProviderSupportedData,
170
238
  ProviderSyncControllerIsProviderSupportedResponse,
239
+ ExternalAccountLinkControllerCreateData,
240
+ ExternalAccountLinkControllerCreateResponse,
241
+ ExternalAccountLinkControllerFindAllData,
242
+ ExternalAccountLinkControllerFindAllResponse,
243
+ ExternalAccountLinkControllerFindOneData,
244
+ ExternalAccountLinkControllerFindOneResponse,
245
+ ExternalAccountLinkControllerRemoveData,
246
+ ExternalAccountLinkControllerRemoveResponse,
171
247
  TelemetryControllerReportTelemetryData,
172
248
  TelemetryControllerReportTelemetryResponse,
249
+ TelemetryControllerReportCoverageMissData,
250
+ TelemetryControllerReportCoverageMissResponse,
251
+ TelemetryControllerGetCoverageMetricsData,
252
+ TelemetryControllerGetCoverageMetricsResponse,
173
253
  NlpControllerProcessNaturalLanguageData,
174
254
  NlpControllerProcessNaturalLanguageResponse,
175
255
  NlpControllerClearSessionData,
@@ -177,55 +257,45 @@ import type {
177
257
  NlpControllerGetSessionData,
178
258
  NlpControllerGetSessionResponse,
179
259
  PlatformControllerFindAllResponse,
180
- PlatformControllerResponse,
260
+ PlatformControllerCreateData,
261
+ PlatformControllerCreateResponse,
262
+ PlatformControllerGetPlatformListData,
181
263
  PlatformControllerGetPlatformListResponse,
182
- PlatformController1Response,
183
- PlatformController2Response,
184
- SymbolControllerLookupSymbolData,
185
- SymbolControllerLookupSymbolResponse,
186
- SymbolControllerGetSymbolDataData,
187
- SymbolControllerGetSymbolDataResponse,
188
- SymbolControllerGatherSymbolForDateData,
189
- SymbolControllerGatherSymbolForDateResponse,
190
- SymbolControllerResponse,
191
- CacheControllerFlushCacheResponse,
264
+ PlatformControllerMatchPlatformsData,
265
+ PlatformControllerMatchPlatformsResponse,
266
+ PlatformControllerUpdateData,
267
+ PlatformControllerUpdateResponse,
268
+ PlatformControllerDeleteData,
269
+ PlatformControllerDeleteResponse,
192
270
  DashboardControllerGetNetWorthData,
193
271
  DashboardControllerGetNetWorthResponse,
194
272
  DashboardControllerGetAccountsData,
195
273
  DashboardControllerGetAccountsResponse,
196
274
  DashboardControllerGetCashFlowData,
197
275
  DashboardControllerGetCashFlowResponse,
198
- ReportingControllerGetPortfolioTrendsData,
199
- ReportingControllerGetPortfolioTrendsResponse,
200
- ReportingControllerGenerateSnapshotData,
201
- ReportingControllerGenerateSnapshotResponse,
202
- ReportingControllerBackfillSnapshotsData,
203
- ReportingControllerBackfillSnapshotsResponse,
204
- ApiKeysControllerResponse,
276
+ DashboardControllerGetExpensesData,
277
+ DashboardControllerGetExpensesResponse,
278
+ HoldingPnlControllerGetHoldingPnlData,
279
+ HoldingPnlControllerGetHoldingPnlResponse,
280
+ ApiKeysControllerCreateApiKeyResponse,
205
281
  AuthControllerAccessTokenLoginData,
206
282
  AuthControllerAccessTokenLoginResponse,
283
+ CacheControllerFlushCacheResponse,
207
284
  ExchangeRateControllerGetExchangeRateData,
208
285
  ExchangeRateControllerGetExchangeRateResponse,
209
286
  HealthControllerGetHealthResponse,
210
287
  HealthControllerCheckDatabaseResponse,
288
+ HealthControllerCheckOpenBbResponse,
211
289
  HealthControllerCheckRedisResponse,
212
290
  HealthControllerGetCircuitBreakersHealthResponse,
213
291
  HealthControllerResetCircuitBreakerData,
214
292
  HealthControllerResetCircuitBreakerResponse,
215
293
  HealthControllerGetMetricsResponse,
216
- HealthControllerGetHealthOfDataEnhancerData,
217
- HealthControllerGetHealthOfDataEnhancerResponse,
218
- HealthControllerCheckDataProvidersResponse,
219
- HealthControllerGetHealthOfDataProviderData,
220
- HealthControllerGetHealthOfDataProviderResponse,
221
294
  InfoControllerGetInfoResponse,
222
- LogoControllerGetLogoByDataSourceAndSymbolData,
223
- LogoControllerGetLogoByDataSourceAndSymbolResponse,
224
- LogoControllerGetLogoByUrlData,
225
- LogoControllerGetLogoByUrlResponse,
226
- MarketDataControllerGetMarketDataBySymbolData,
227
- MarketDataControllerGetMarketDataBySymbolResponse,
228
- MarketDataControllerResponse
295
+ SymbolControllerSearchData,
296
+ SymbolControllerSearchResponse,
297
+ SymbolControllerGetQuoteData,
298
+ SymbolControllerGetQuoteResponse
229
299
  } from './types.gen';
230
300
 
231
301
  export class BeanAccountsService {
@@ -263,7 +333,7 @@ export class BeanAccountsService {
263
333
  * @param data.type Filter by account type
264
334
  * @param data.status Filter by status
265
335
  * @param data.isCustom Filter by custom (user-created) accounts only
266
- * @param data.search Search term for path or i18nKey
336
+ * @param data.search Search term for account path
267
337
  * @param data.limit Maximum number of results
268
338
  * @param data.offset Number of results to skip
269
339
  * @returns AccountListResponseDto Accounts retrieved successfully
@@ -344,7 +414,7 @@ export class BeanAccountsService {
344
414
 
345
415
  /**
346
416
  * Delete account
347
- * Deletes an account (only if no transactions)
417
+ * Deletes an account (only if no active transactions; voided/superseded residual postings are cleaned up)
348
418
  * @param data The data for the request.
349
419
  * @param data.id Account UUID
350
420
  * @param data.region Region code for tenant context
@@ -363,7 +433,7 @@ export class BeanAccountsService {
363
433
  },
364
434
  errors: {
365
435
  404: 'Account not found',
366
- 409: 'Account has transactions and cannot be deleted'
436
+ 409: 'Account has active transactions and cannot be deleted'
367
437
  }
368
438
  });
369
439
  }
@@ -425,6 +495,107 @@ export class BeanAccountsService {
425
495
  }
426
496
  });
427
497
  }
498
+
499
+ /**
500
+ * Post an opening-balance transaction
501
+ * Posts a double-entry opening-balance transaction against Equity:Opening-Balances for an existing Assets/Liabilities account. At most one active opening balance per account.
502
+ * @param data The data for the request.
503
+ * @param data.id Account UUID
504
+ * @param data.region Region code for tenant context
505
+ * @param data.requestBody
506
+ * @returns OpeningBalanceResultDto Opening-balance transaction created
507
+ * @throws ApiError
508
+ */
509
+ public static accountControllerAddOpeningBalance(
510
+ data: AccountControllerAddOpeningBalanceData
511
+ ): CancelablePromise<AccountControllerAddOpeningBalanceResponse> {
512
+ return __request(OpenAPI, {
513
+ method: 'POST',
514
+ url: '/api/v1/{region}/bean/accounts/{id}/opening-balance',
515
+ path: {
516
+ id: data.id,
517
+ region: data.region
518
+ },
519
+ body: data.requestBody,
520
+ mediaType: 'application/json',
521
+ errors: {
522
+ 404: 'Account not found',
523
+ 409: 'An opening balance already exists for this account'
524
+ }
525
+ });
526
+ }
527
+ }
528
+
529
+ export class BeanAccountStandardsService {
530
+ /**
531
+ * Get account templates
532
+ * Returns predefined account templates for a region. Supports filtering by account type and search term.
533
+ * @param data The data for the request.
534
+ * @param data.region Region code (cn, us, de)
535
+ * @param data.type Filter by account type
536
+ * @param data.search Search term for path or description
537
+ * @returns AccountStandardListResponseDto Account templates retrieved successfully
538
+ * @throws ApiError
539
+ */
540
+ public static accountStandardsControllerGetTemplates(
541
+ data: AccountStandardsControllerGetTemplatesData
542
+ ): CancelablePromise<AccountStandardsControllerGetTemplatesResponse> {
543
+ return __request(OpenAPI, {
544
+ method: 'GET',
545
+ url: '/api/v1/{region}/bean/account-standards',
546
+ path: {
547
+ region: data.region
548
+ },
549
+ query: {
550
+ type: data.type,
551
+ search: data.search
552
+ }
553
+ });
554
+ }
555
+
556
+ /**
557
+ * Get template metadata for an account path
558
+ * Returns root type for a template path.
559
+ * @param data The data for the request.
560
+ * @param data.region Region code for tenant context
561
+ * @param data.path Account path to check
562
+ * @returns TemplateMetadataResponseDto Template metadata retrieved successfully
563
+ * @throws ApiError
564
+ */
565
+ public static accountStandardsControllerGetTemplateMetadata(
566
+ data: AccountStandardsControllerGetTemplateMetadataData
567
+ ): CancelablePromise<AccountStandardsControllerGetTemplateMetadataResponse> {
568
+ return __request(OpenAPI, {
569
+ method: 'GET',
570
+ url: '/api/v1/{region}/bean/account-standards/template-metadata',
571
+ path: {
572
+ region: data.region
573
+ },
574
+ query: {
575
+ path: data.path
576
+ }
577
+ });
578
+ }
579
+
580
+ /**
581
+ * Get available regions with hierarchy
582
+ * Returns supported regions with inheritance metadata
583
+ * @param data The data for the request.
584
+ * @param data.region Region code for tenant context
585
+ * @returns RegionsMetadataResponseDto Regions metadata retrieved successfully
586
+ * @throws ApiError
587
+ */
588
+ public static accountStandardsControllerGetRegions(
589
+ data: AccountStandardsControllerGetRegionsData
590
+ ): CancelablePromise<AccountStandardsControllerGetRegionsResponse> {
591
+ return __request(OpenAPI, {
592
+ method: 'GET',
593
+ url: '/api/v1/{region}/bean/account-standards/regions',
594
+ path: {
595
+ region: data.region
596
+ }
597
+ });
598
+ }
428
599
  }
429
600
 
430
601
  export class BeanTransactionsService {
@@ -470,6 +641,7 @@ export class BeanTransactionsService {
470
641
  * @param data.status Filter by transaction status
471
642
  * @param data.search Search in narration and payee fields (max 200 chars)
472
643
  * @param data.accountId Filter by account ID (transactions with postings to this account)
644
+ * @param data.category Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
473
645
  * @returns TransactionListResponseDto Transaction list
474
646
  * @throws ApiError
475
647
  */
@@ -489,28 +661,102 @@ export class BeanTransactionsService {
489
661
  dateTo: data.dateTo,
490
662
  status: data.status,
491
663
  search: data.search,
492
- accountId: data.accountId
664
+ accountId: data.accountId,
665
+ category: data.category
493
666
  },
494
667
  errors: {
668
+ 400: 'Validation failed',
495
669
  401: 'Authentication required'
496
670
  }
497
671
  });
498
672
  }
499
673
 
500
674
  /**
675
+ * @deprecated
676
+ * Batch create transactions (DEPRECATED)
677
+ * DEPRECATED: Use POST /:region/bean/import/provider/:name/sync instead. This endpoint skips dedup, rule matching, and review branching.
501
678
  * @param data The data for the request.
502
679
  * @param data.region Region code for tenant context
503
- * @returns unknown
680
+ * @param data.requestBody
681
+ * @returns BatchTransactionResponseDto Transactions processed
504
682
  * @throws ApiError
505
683
  */
506
- public static transactionController(
507
- data: TransactionControllerData
508
- ): CancelablePromise<TransactionControllerResponse> {
684
+ public static transactionControllerCreateBatch(
685
+ data: TransactionControllerCreateBatchData
686
+ ): CancelablePromise<TransactionControllerCreateBatchResponse> {
509
687
  return __request(OpenAPI, {
510
688
  method: 'POST',
511
689
  url: '/api/v1/{region}/bean/transactions/batch',
512
690
  path: {
513
691
  region: data.region
692
+ },
693
+ body: data.requestBody,
694
+ mediaType: 'application/json',
695
+ errors: {
696
+ 400: 'Invalid input',
697
+ 401: 'Authentication required'
698
+ }
699
+ });
700
+ }
701
+
702
+ /**
703
+ * Correct (supersede) a transaction
704
+ * Atomically voids the original (SUPERSEDED) and creates a replacement through the full validation pipeline.
705
+ * @param data The data for the request.
706
+ * @param data.id Original transaction ID to correct
707
+ * @param data.region Region code for tenant context
708
+ * @param data.requestBody
709
+ * @returns TransactionDetailDto Corrected transaction created
710
+ * @throws ApiError
711
+ */
712
+ public static transactionControllerCorrect(
713
+ data: TransactionControllerCorrectData
714
+ ): CancelablePromise<TransactionControllerCorrectResponse> {
715
+ return __request(OpenAPI, {
716
+ method: 'POST',
717
+ url: '/api/v1/{region}/bean/transactions/{id}/correct',
718
+ path: {
719
+ id: data.id,
720
+ region: data.region
721
+ },
722
+ body: data.requestBody,
723
+ mediaType: 'application/json',
724
+ errors: {
725
+ 404: 'Original transaction not found',
726
+ 409: 'Original no longer ACTIVE (concurrent modification)',
727
+ 422: 'Pipeline validation failed (does not balance, invalid accounts)'
728
+ }
729
+ });
730
+ }
731
+
732
+ /**
733
+ * Suggest transaction tags
734
+ * Returns distinct tags from the user ACTIVE transactions, sorted by usage, for autocomplete. Optional q performs a case-insensitive prefix match.
735
+ * @param data The data for the request.
736
+ * @param data.region Region code for tenant context
737
+ * @param data.q Prefix match, case-insensitive (max 50 chars)
738
+ * @param data.sort usage (default) or name
739
+ * @param data.limit Max suggestions (1-100, default 10)
740
+ * @returns TagSuggestionsResponseDto Tag suggestions
741
+ * @throws ApiError
742
+ */
743
+ public static transactionControllerSuggestTags(
744
+ data: TransactionControllerSuggestTagsData
745
+ ): CancelablePromise<TransactionControllerSuggestTagsResponse> {
746
+ return __request(OpenAPI, {
747
+ method: 'GET',
748
+ url: '/api/v1/{region}/bean/transactions/tags',
749
+ path: {
750
+ region: data.region
751
+ },
752
+ query: {
753
+ q: data.q,
754
+ sort: data.sort,
755
+ limit: data.limit
756
+ },
757
+ errors: {
758
+ 400: 'Validation failed',
759
+ 401: 'Authentication required'
514
760
  }
515
761
  });
516
762
  }
@@ -572,63 +818,31 @@ export class BeanTransactionsService {
572
818
  }
573
819
 
574
820
  /**
821
+ * Void transaction
822
+ * Soft-deletes a transaction by marking it as VOIDED
575
823
  * @param data The data for the request.
824
+ * @param data.id Transaction ID
576
825
  * @param data.region Region code for tenant context
577
- * @returns void
826
+ * @returns void Transaction voided successfully
578
827
  * @throws ApiError
579
828
  */
580
- public static transactionController1(
581
- data: TransactionController1Data
582
- ): CancelablePromise<TransactionController1Response> {
829
+ public static transactionControllerDelete(
830
+ data: TransactionControllerDeleteData
831
+ ): CancelablePromise<TransactionControllerDeleteResponse> {
583
832
  return __request(OpenAPI, {
584
833
  method: 'DELETE',
585
834
  url: '/api/v1/{region}/bean/transactions/{id}',
586
835
  path: {
587
- region: data.region
588
- }
589
- });
590
- }
591
- }
592
-
593
- export class BeanAccountStandardsService {
594
- /**
595
- * Get account templates
596
- * Returns predefined account templates for a region. Supports filtering by account type and search term.
597
- * @param data The data for the request.
598
- * @param data.region Region code (cn, us, de)
599
- * @param data.type Filter by account type
600
- * @param data.search Search term for path or description
601
- * @returns AccountStandardListResponseDto Account templates retrieved successfully
602
- * @throws ApiError
603
- */
604
- public static accountStandardsControllerGetTemplates(
605
- data: AccountStandardsControllerGetTemplatesData
606
- ): CancelablePromise<AccountStandardsControllerGetTemplatesResponse> {
607
- return __request(OpenAPI, {
608
- method: 'GET',
609
- url: '/api/v1/{region}/bean/account-standards',
610
- path: {
836
+ id: data.id,
611
837
  region: data.region
612
838
  },
613
- query: {
614
- type: data.type,
615
- search: data.search
839
+ errors: {
840
+ 400: 'Transaction already voided',
841
+ 401: 'Authentication required',
842
+ 404: 'Transaction not found'
616
843
  }
617
844
  });
618
845
  }
619
-
620
- /**
621
- * Get available regions with hierarchy
622
- * Returns supported regions with inheritance metadata
623
- * @returns RegionsMetadataResponseDto Regions metadata retrieved successfully
624
- * @throws ApiError
625
- */
626
- public static accountStandardsControllerGetRegions(): CancelablePromise<AccountStandardsControllerGetRegionsResponse> {
627
- return __request(OpenAPI, {
628
- method: 'GET',
629
- url: '/api/v1/{region}/bean/account-standards/regions'
630
- });
631
- }
632
846
  }
633
847
 
634
848
  export class BeanBalancesService {
@@ -636,7 +850,8 @@ export class BeanBalancesService {
636
850
  * Query account balance
637
851
  * Calculate account balance at a specific date for a single currency
638
852
  * @param data The data for the request.
639
- * @param data.account Account name (e.g., "Assets:Bank:Checking")
853
+ * @param data.account Account name (e.g., "Assets:Checking")
854
+ * @param data.region Region code for tenant context
640
855
  * @param data.date Date to calculate balance at (ISO 8601 format)
641
856
  * @param data.currency Currency to query (e.g., "USD", "CNY")
642
857
  * @returns BalanceResponseDto Balance calculated successfully
@@ -648,6 +863,9 @@ export class BeanBalancesService {
648
863
  return __request(OpenAPI, {
649
864
  method: 'GET',
650
865
  url: '/api/v1/{region}/bean/balances',
866
+ path: {
867
+ region: data.region
868
+ },
651
869
  query: {
652
870
  account: data.account,
653
871
  date: data.date,
@@ -663,13 +881,20 @@ export class BeanBalancesService {
663
881
  /**
664
882
  * Query multi-currency account balance
665
883
  * Calculate account balances for all currencies at a specific date
884
+ * @param data The data for the request.
885
+ * @param data.region Region code for tenant context
666
886
  * @returns MultiCurrencyBalanceResponseDto Balances calculated successfully
667
887
  * @throws ApiError
668
888
  */
669
- public static balanceControllerGetMultiCurrencyBalance(): CancelablePromise<BalanceControllerGetMultiCurrencyBalanceResponse> {
889
+ public static balanceControllerGetMultiCurrencyBalance(
890
+ data: BalanceControllerGetMultiCurrencyBalanceData
891
+ ): CancelablePromise<BalanceControllerGetMultiCurrencyBalanceResponse> {
670
892
  return __request(OpenAPI, {
671
893
  method: 'GET',
672
894
  url: '/api/v1/{region}/bean/balances/multi-currency',
895
+ path: {
896
+ region: data.region
897
+ },
673
898
  errors: {
674
899
  400: 'Invalid query parameters',
675
900
  401: 'User not authenticated'
@@ -751,69 +976,94 @@ export class BeanReviewsService {
751
976
  }
752
977
 
753
978
  /**
979
+ * Resolve a review item
754
980
  * @param data The data for the request.
981
+ * @param data.id Review ID
755
982
  * @param data.region Region code for tenant context
756
- * @returns unknown
983
+ * @param data.requestBody
984
+ * @returns ResolveResultDto
757
985
  * @throws ApiError
758
986
  */
759
- public static reviewController(
760
- data: ReviewControllerData
761
- ): CancelablePromise<ReviewControllerResponse> {
987
+ public static reviewControllerResolve(
988
+ data: ReviewControllerResolveData
989
+ ): CancelablePromise<ReviewControllerResolveResponse> {
762
990
  return __request(OpenAPI, {
763
991
  method: 'POST',
764
992
  url: '/api/v1/{region}/bean/reviews/{id}/resolve',
765
993
  path: {
994
+ id: data.id,
766
995
  region: data.region
767
- }
996
+ },
997
+ body: data.requestBody,
998
+ mediaType: 'application/json'
768
999
  });
769
1000
  }
770
1001
 
771
1002
  /**
1003
+ * Undo a resolution (within 24h)
772
1004
  * @param data The data for the request.
1005
+ * @param data.id Review ID
773
1006
  * @param data.region Region code for tenant context
774
- * @returns unknown
1007
+ * @returns UndoResultDto
775
1008
  * @throws ApiError
776
1009
  */
777
- public static reviewController1(
778
- data: ReviewController1Data
779
- ): CancelablePromise<ReviewController1Response> {
1010
+ public static reviewControllerUndo(
1011
+ data: ReviewControllerUndoData
1012
+ ): CancelablePromise<ReviewControllerUndoResponse> {
780
1013
  return __request(OpenAPI, {
781
1014
  method: 'POST',
782
1015
  url: '/api/v1/{region}/bean/reviews/{id}/undo',
783
1016
  path: {
1017
+ id: data.id,
784
1018
  region: data.region
785
1019
  }
786
1020
  });
787
1021
  }
788
1022
 
789
1023
  /**
1024
+ * Batch resolve multiple reviews
790
1025
  * @param data The data for the request.
791
1026
  * @param data.region Region code for tenant context
792
- * @returns unknown
1027
+ * @param data.requestBody Batch resolution request containing review IDs and action
1028
+ * @returns BatchResolveResultDto
793
1029
  * @throws ApiError
794
1030
  */
795
- public static reviewController2(
796
- data: ReviewController2Data
797
- ): CancelablePromise<ReviewController2Response> {
1031
+ public static reviewControllerBatchResolve(
1032
+ data: ReviewControllerBatchResolveData
1033
+ ): CancelablePromise<ReviewControllerBatchResolveResponse> {
798
1034
  return __request(OpenAPI, {
799
1035
  method: 'POST',
800
1036
  url: '/api/v1/{region}/bean/reviews/batch-resolve',
801
1037
  path: {
802
1038
  region: data.region
803
- }
1039
+ },
1040
+ body: data.requestBody,
1041
+ mediaType: 'application/json'
804
1042
  });
805
1043
  }
806
1044
  }
807
1045
 
808
1046
  export class BeanPayeesService {
809
1047
  /**
810
- * @returns unknown
1048
+ * Create a new payee
1049
+ * Creates a new payee mapping for the authenticated user. The payee name must be unique within the user's account.
1050
+ * @param data The data for the request.
1051
+ * @param data.requestBody
1052
+ * @returns PayeeResponseDto Payee created successfully
811
1053
  * @throws ApiError
812
1054
  */
813
- public static payeeController(): CancelablePromise<PayeeControllerResponse> {
1055
+ public static payeeControllerCreate(
1056
+ data: PayeeControllerCreateData
1057
+ ): CancelablePromise<PayeeControllerCreateResponse> {
814
1058
  return __request(OpenAPI, {
815
1059
  method: 'POST',
816
- url: '/api/v1/bean/payees'
1060
+ url: '/api/v1/bean/payees',
1061
+ body: data.requestBody,
1062
+ mediaType: 'application/json',
1063
+ errors: {
1064
+ 400: 'Invalid input data',
1065
+ 409: 'Payee already exists'
1066
+ }
817
1067
  });
818
1068
  }
819
1069
 
@@ -912,37 +1162,78 @@ export class BeanPayeesService {
912
1162
  }
913
1163
 
914
1164
  /**
915
- * @returns unknown
1165
+ * Update payee
1166
+ * Updates a payee mapping. The payee name cannot be changed after creation.
1167
+ * @param data The data for the request.
1168
+ * @param data.id Payee UUID
1169
+ * @param data.requestBody
1170
+ * @returns PayeeResponseDto Payee updated successfully
916
1171
  * @throws ApiError
917
1172
  */
918
- public static payeeController1(): CancelablePromise<PayeeController1Response> {
1173
+ public static payeeControllerUpdate(
1174
+ data: PayeeControllerUpdateData
1175
+ ): CancelablePromise<PayeeControllerUpdateResponse> {
919
1176
  return __request(OpenAPI, {
920
1177
  method: 'PUT',
921
- url: '/api/v1/bean/payees/{id}'
922
- });
923
- }
1178
+ url: '/api/v1/bean/payees/{id}',
1179
+ path: {
1180
+ id: data.id
1181
+ },
1182
+ body: data.requestBody,
1183
+ mediaType: 'application/json',
1184
+ errors: {
1185
+ 400: 'Invalid input data',
1186
+ 404: 'Payee not found'
1187
+ }
1188
+ });
1189
+ }
924
1190
 
925
1191
  /**
926
- * @returns void
1192
+ * Delete payee
1193
+ * Soft deletes a payee by marking it as inactive. Inactive payees will not appear in autocomplete suggestions.
1194
+ * @param data The data for the request.
1195
+ * @param data.id Payee UUID
1196
+ * @returns void Payee deleted successfully
927
1197
  * @throws ApiError
928
1198
  */
929
- public static payeeController2(): CancelablePromise<PayeeController2Response> {
1199
+ public static payeeControllerDelete(
1200
+ data: PayeeControllerDeleteData
1201
+ ): CancelablePromise<PayeeControllerDeleteResponse> {
930
1202
  return __request(OpenAPI, {
931
1203
  method: 'DELETE',
932
- url: '/api/v1/bean/payees/{id}'
1204
+ url: '/api/v1/bean/payees/{id}',
1205
+ path: {
1206
+ id: data.id
1207
+ },
1208
+ errors: {
1209
+ 404: 'Payee not found'
1210
+ }
933
1211
  });
934
1212
  }
935
1213
  }
936
1214
 
937
1215
  export class AdminPayeeProfilesService {
938
1216
  /**
939
- * @returns unknown
1217
+ * Create payee profile (Admin only)
1218
+ * Creates a new global payee profile. The canonical name must be unique (case-insensitive).
1219
+ * @param data The data for the request.
1220
+ * @param data.requestBody
1221
+ * @returns PayeeProfileResponseDto Payee profile created successfully
940
1222
  * @throws ApiError
941
1223
  */
942
- public static payeeProfileAdminController(): CancelablePromise<PayeeProfileAdminControllerResponse> {
1224
+ public static payeeProfileAdminControllerCreate(
1225
+ data: PayeeProfileAdminControllerCreateData
1226
+ ): CancelablePromise<PayeeProfileAdminControllerCreateResponse> {
943
1227
  return __request(OpenAPI, {
944
1228
  method: 'POST',
945
- url: '/api/v1/admin/payee-profiles'
1229
+ url: '/api/v1/admin/payee-profiles',
1230
+ body: data.requestBody,
1231
+ mediaType: 'application/json',
1232
+ errors: {
1233
+ 400: 'Validation failed',
1234
+ 403: 'Admin access required',
1235
+ 409: 'Payee profile already exists'
1236
+ }
946
1237
  });
947
1238
  }
948
1239
 
@@ -1004,65 +1295,130 @@ export class AdminPayeeProfilesService {
1004
1295
  }
1005
1296
 
1006
1297
  /**
1007
- * @returns unknown
1298
+ * Update payee profile (Admin only)
1299
+ * Updates an existing payee profile. The canonical name cannot be changed.
1300
+ * @param data The data for the request.
1301
+ * @param data.id Payee profile ID (UUID)
1302
+ * @param data.requestBody
1303
+ * @returns PayeeProfileResponseDto Payee profile updated successfully
1008
1304
  * @throws ApiError
1009
1305
  */
1010
- public static payeeProfileAdminController1(): CancelablePromise<PayeeProfileAdminController1Response> {
1306
+ public static payeeProfileAdminControllerUpdate(
1307
+ data: PayeeProfileAdminControllerUpdateData
1308
+ ): CancelablePromise<PayeeProfileAdminControllerUpdateResponse> {
1011
1309
  return __request(OpenAPI, {
1012
1310
  method: 'PUT',
1013
- url: '/api/v1/admin/payee-profiles/{id}'
1311
+ url: '/api/v1/admin/payee-profiles/{id}',
1312
+ path: {
1313
+ id: data.id
1314
+ },
1315
+ body: data.requestBody,
1316
+ mediaType: 'application/json',
1317
+ errors: {
1318
+ 403: 'Admin access required',
1319
+ 404: 'Payee profile not found'
1320
+ }
1014
1321
  });
1015
1322
  }
1016
1323
 
1017
1324
  /**
1018
- * @returns void
1325
+ * Soft delete payee profile (Admin only)
1326
+ * Marks a payee profile as inactive (soft delete). The profile cannot be deleted if it is referenced by user payees.
1327
+ * @param data The data for the request.
1328
+ * @param data.id Payee profile ID (UUID)
1329
+ * @returns void Payee profile deleted successfully
1019
1330
  * @throws ApiError
1020
1331
  */
1021
- public static payeeProfileAdminController2(): CancelablePromise<PayeeProfileAdminController2Response> {
1332
+ public static payeeProfileAdminControllerDelete(
1333
+ data: PayeeProfileAdminControllerDeleteData
1334
+ ): CancelablePromise<PayeeProfileAdminControllerDeleteResponse> {
1022
1335
  return __request(OpenAPI, {
1023
1336
  method: 'DELETE',
1024
- url: '/api/v1/admin/payee-profiles/{id}'
1337
+ url: '/api/v1/admin/payee-profiles/{id}',
1338
+ path: {
1339
+ id: data.id
1340
+ },
1341
+ errors: {
1342
+ 403: 'Admin access required',
1343
+ 404: 'Payee profile not found',
1344
+ 409: 'Payee profile is in use and cannot be deleted'
1345
+ }
1025
1346
  });
1026
1347
  }
1027
1348
 
1028
1349
  /**
1029
- * @returns unknown
1350
+ * Verify payee profile (Admin only)
1351
+ * Marks a payee profile as verified by setting verifiedAt to current timestamp.
1352
+ * @param data The data for the request.
1353
+ * @param data.id Payee profile ID (UUID)
1354
+ * @returns PayeeProfileResponseDto Payee profile verified successfully
1030
1355
  * @throws ApiError
1031
1356
  */
1032
- public static payeeProfileAdminController3(): CancelablePromise<PayeeProfileAdminController3Response> {
1357
+ public static payeeProfileAdminControllerVerify(
1358
+ data: PayeeProfileAdminControllerVerifyData
1359
+ ): CancelablePromise<PayeeProfileAdminControllerVerifyResponse> {
1033
1360
  return __request(OpenAPI, {
1034
1361
  method: 'POST',
1035
- url: '/api/v1/admin/payee-profiles/{id}/verify'
1362
+ url: '/api/v1/admin/payee-profiles/{id}/verify',
1363
+ path: {
1364
+ id: data.id
1365
+ },
1366
+ errors: {
1367
+ 403: 'Admin access required',
1368
+ 404: 'Payee profile not found'
1369
+ }
1036
1370
  });
1037
1371
  }
1038
1372
 
1039
1373
  /**
1040
- * @returns unknown
1374
+ * Unverify payee profile (Admin only)
1375
+ * Removes verification status by setting verifiedAt to null.
1376
+ * @param data The data for the request.
1377
+ * @param data.id Payee profile ID (UUID)
1378
+ * @returns PayeeProfileResponseDto Payee profile unverified successfully
1041
1379
  * @throws ApiError
1042
1380
  */
1043
- public static payeeProfileAdminController4(): CancelablePromise<PayeeProfileAdminController4Response> {
1381
+ public static payeeProfileAdminControllerUnverify(
1382
+ data: PayeeProfileAdminControllerUnverifyData
1383
+ ): CancelablePromise<PayeeProfileAdminControllerUnverifyResponse> {
1044
1384
  return __request(OpenAPI, {
1045
1385
  method: 'DELETE',
1046
- url: '/api/v1/admin/payee-profiles/{id}/verify'
1386
+ url: '/api/v1/admin/payee-profiles/{id}/verify',
1387
+ path: {
1388
+ id: data.id
1389
+ },
1390
+ errors: {
1391
+ 403: 'Admin access required',
1392
+ 404: 'Payee profile not found'
1393
+ }
1047
1394
  });
1048
1395
  }
1049
1396
  }
1050
1397
 
1051
1398
  export class BeanCommoditiesService {
1052
1399
  /**
1400
+ * Create a new commodity
1401
+ * Creates a new commodity definition for the authenticated user
1053
1402
  * @param data The data for the request.
1054
1403
  * @param data.region Region code for tenant context
1055
- * @returns unknown
1404
+ * @param data.requestBody
1405
+ * @returns CommodityResponseDto Commodity created successfully
1056
1406
  * @throws ApiError
1057
1407
  */
1058
- public static commodityController(
1059
- data: CommodityControllerData
1060
- ): CancelablePromise<CommodityControllerResponse> {
1408
+ public static commodityControllerCreate(
1409
+ data: CommodityControllerCreateData
1410
+ ): CancelablePromise<CommodityControllerCreateResponse> {
1061
1411
  return __request(OpenAPI, {
1062
1412
  method: 'POST',
1063
1413
  url: '/api/v1/{region}/bean/commodities',
1064
1414
  path: {
1065
1415
  region: data.region
1416
+ },
1417
+ body: data.requestBody,
1418
+ mediaType: 'application/json',
1419
+ errors: {
1420
+ 400: 'Invalid input data',
1421
+ 409: 'Commodity already exists'
1066
1422
  }
1067
1423
  });
1068
1424
  }
@@ -1119,68 +1475,92 @@ export class BeanCommoditiesService {
1119
1475
  }
1120
1476
 
1121
1477
  /**
1478
+ * Update commodity
1479
+ * Updates an existing commodity definition. Symbol cannot be changed.
1122
1480
  * @param data The data for the request.
1481
+ * @param data.symbol Commodity symbol
1123
1482
  * @param data.region Region code for tenant context
1124
- * @returns unknown
1483
+ * @param data.requestBody
1484
+ * @returns CommodityResponseDto Commodity updated successfully
1125
1485
  * @throws ApiError
1126
1486
  */
1127
- public static commodityController1(
1128
- data: CommodityController1Data
1129
- ): CancelablePromise<CommodityController1Response> {
1487
+ public static commodityControllerUpdate(
1488
+ data: CommodityControllerUpdateData
1489
+ ): CancelablePromise<CommodityControllerUpdateResponse> {
1130
1490
  return __request(OpenAPI, {
1131
1491
  method: 'PUT',
1132
1492
  url: '/api/v1/{region}/bean/commodities/{symbol}',
1133
1493
  path: {
1494
+ symbol: data.symbol,
1134
1495
  region: data.region
1496
+ },
1497
+ body: data.requestBody,
1498
+ mediaType: 'application/json',
1499
+ errors: {
1500
+ 400: 'Invalid input data',
1501
+ 404: 'Commodity not found'
1135
1502
  }
1136
1503
  });
1137
1504
  }
1138
1505
 
1139
1506
  /**
1507
+ * Delete commodity
1508
+ * Deletes a commodity definition
1140
1509
  * @param data The data for the request.
1510
+ * @param data.symbol Commodity symbol
1141
1511
  * @param data.region Region code for tenant context
1142
- * @returns void
1512
+ * @returns void Commodity deleted successfully
1143
1513
  * @throws ApiError
1144
1514
  */
1145
- public static commodityController2(
1146
- data: CommodityController2Data
1147
- ): CancelablePromise<CommodityController2Response> {
1515
+ public static commodityControllerDelete(
1516
+ data: CommodityControllerDeleteData
1517
+ ): CancelablePromise<CommodityControllerDeleteResponse> {
1148
1518
  return __request(OpenAPI, {
1149
1519
  method: 'DELETE',
1150
1520
  url: '/api/v1/{region}/bean/commodities/{symbol}',
1151
1521
  path: {
1522
+ symbol: data.symbol,
1152
1523
  region: data.region
1524
+ },
1525
+ errors: {
1526
+ 404: 'Commodity not found'
1153
1527
  }
1154
1528
  });
1155
1529
  }
1156
1530
 
1157
1531
  /**
1532
+ * Ensure commodity exists
1533
+ * Gets existing commodity or creates it with automatic initialization from OpenBB
1158
1534
  * @param data The data for the request.
1535
+ * @param data.symbol Commodity symbol
1159
1536
  * @param data.region Region code for tenant context
1160
- * @returns unknown
1537
+ * @returns CommodityResponseDto Commodity retrieved or created
1161
1538
  * @throws ApiError
1162
1539
  */
1163
- public static commodityController3(
1164
- data: CommodityController3Data
1165
- ): CancelablePromise<CommodityController3Response> {
1540
+ public static commodityControllerGetOrCreate(
1541
+ data: CommodityControllerGetOrCreateData
1542
+ ): CancelablePromise<CommodityControllerGetOrCreateResponse> {
1166
1543
  return __request(OpenAPI, {
1167
1544
  method: 'POST',
1168
1545
  url: '/api/v1/{region}/bean/commodities/{symbol}/ensure',
1169
1546
  path: {
1547
+ symbol: data.symbol,
1170
1548
  region: data.region
1171
1549
  }
1172
1550
  });
1173
1551
  }
1174
1552
 
1175
1553
  /**
1554
+ * Bulk create commodities
1555
+ * Creates multiple commodities from a list of symbols, useful for initialization
1176
1556
  * @param data The data for the request.
1177
1557
  * @param data.region Region code for tenant context
1178
- * @returns unknown
1558
+ * @returns CommodityResponseDto Commodities created successfully
1179
1559
  * @throws ApiError
1180
1560
  */
1181
- public static commodityController4(
1182
- data: CommodityController4Data
1183
- ): CancelablePromise<CommodityController4Response> {
1561
+ public static commodityControllerBulkCreate(
1562
+ data: CommodityControllerBulkCreateData
1563
+ ): CancelablePromise<CommodityControllerBulkCreateResponse> {
1184
1564
  return __request(OpenAPI, {
1185
1565
  method: 'POST',
1186
1566
  url: '/api/v1/{region}/bean/commodities/bulk',
@@ -1191,21 +1571,197 @@ export class BeanCommoditiesService {
1191
1571
  }
1192
1572
  }
1193
1573
 
1574
+ export class BeanPricesService {
1575
+ /**
1576
+ * Create a new price
1577
+ * Creates a new price entry for the authenticated user
1578
+ * @param data The data for the request.
1579
+ * @param data.region Region code for tenant context
1580
+ * @param data.requestBody
1581
+ * @returns PriceResponseDto Price created successfully
1582
+ * @throws ApiError
1583
+ */
1584
+ public static priceControllerCreate(
1585
+ data: PriceControllerCreateData
1586
+ ): CancelablePromise<PriceControllerCreateResponse> {
1587
+ return __request(OpenAPI, {
1588
+ method: 'POST',
1589
+ url: '/api/v1/{region}/bean/prices',
1590
+ path: {
1591
+ region: data.region
1592
+ },
1593
+ body: data.requestBody,
1594
+ mediaType: 'application/json',
1595
+ errors: {
1596
+ 404: 'Currency or quoteCurrency commodity not found',
1597
+ 409: 'Price already exists for this currency pair and date'
1598
+ }
1599
+ });
1600
+ }
1601
+
1602
+ /**
1603
+ * List user prices
1604
+ * Returns all price entries for the authenticated user with optional filtering
1605
+ * @param data The data for the request.
1606
+ * @param data.region Region code for tenant context
1607
+ * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
1608
+ * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
1609
+ * @param data.dateFrom Filter prices from this date (ISO 8601 format)
1610
+ * @param data.dateTo Filter prices to this date (ISO 8601 format)
1611
+ * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
1612
+ * @param data.page Page number for pagination (default: 1)
1613
+ * @param data.limit Number of items per page (default: 20, max: 100)
1614
+ * @returns PriceListResponseDto Prices retrieved successfully
1615
+ * @throws ApiError
1616
+ */
1617
+ public static priceControllerFindAll(
1618
+ data: PriceControllerFindAllData
1619
+ ): CancelablePromise<PriceControllerFindAllResponse> {
1620
+ return __request(OpenAPI, {
1621
+ method: 'GET',
1622
+ url: '/api/v1/{region}/bean/prices',
1623
+ path: {
1624
+ region: data.region
1625
+ },
1626
+ query: {
1627
+ currency: data.currency,
1628
+ quoteCurrency: data.quoteCurrency,
1629
+ dateFrom: data.dateFrom,
1630
+ dateTo: data.dateTo,
1631
+ search: data.search,
1632
+ page: data.page,
1633
+ limit: data.limit
1634
+ }
1635
+ });
1636
+ }
1637
+
1638
+ /**
1639
+ * Get price by ID
1640
+ * Returns a single price entry by its ID
1641
+ * @param data The data for the request.
1642
+ * @param data.id Price ID
1643
+ * @param data.region Region code for tenant context
1644
+ * @returns PriceResponseDto Price retrieved successfully
1645
+ * @throws ApiError
1646
+ */
1647
+ public static priceControllerFindOne(
1648
+ data: PriceControllerFindOneData
1649
+ ): CancelablePromise<PriceControllerFindOneResponse> {
1650
+ return __request(OpenAPI, {
1651
+ method: 'GET',
1652
+ url: '/api/v1/{region}/bean/prices/{id}',
1653
+ path: {
1654
+ id: data.id,
1655
+ region: data.region
1656
+ },
1657
+ errors: {
1658
+ 404: 'Price not found'
1659
+ }
1660
+ });
1661
+ }
1662
+
1663
+ /**
1664
+ * Update a price
1665
+ * Updates an existing price entry
1666
+ * @param data The data for the request.
1667
+ * @param data.id Price ID
1668
+ * @param data.region Region code for tenant context
1669
+ * @param data.requestBody
1670
+ * @returns PriceResponseDto Price updated successfully
1671
+ * @throws ApiError
1672
+ */
1673
+ public static priceControllerUpdate(
1674
+ data: PriceControllerUpdateData
1675
+ ): CancelablePromise<PriceControllerUpdateResponse> {
1676
+ return __request(OpenAPI, {
1677
+ method: 'PUT',
1678
+ url: '/api/v1/{region}/bean/prices/{id}',
1679
+ path: {
1680
+ id: data.id,
1681
+ region: data.region
1682
+ },
1683
+ body: data.requestBody,
1684
+ mediaType: 'application/json',
1685
+ errors: {
1686
+ 404: 'Price not found',
1687
+ 409: 'Updated price conflicts with existing price'
1688
+ }
1689
+ });
1690
+ }
1691
+
1692
+ /**
1693
+ * Delete a price
1694
+ * Deletes a price entry (hard delete)
1695
+ * @param data The data for the request.
1696
+ * @param data.id Price ID
1697
+ * @param data.region Region code for tenant context
1698
+ * @returns void Price deleted successfully
1699
+ * @throws ApiError
1700
+ */
1701
+ public static priceControllerDelete(
1702
+ data: PriceControllerDeleteData
1703
+ ): CancelablePromise<PriceControllerDeleteResponse> {
1704
+ return __request(OpenAPI, {
1705
+ method: 'DELETE',
1706
+ url: '/api/v1/{region}/bean/prices/{id}',
1707
+ path: {
1708
+ id: data.id,
1709
+ region: data.region
1710
+ },
1711
+ errors: {
1712
+ 404: 'Price not found'
1713
+ }
1714
+ });
1715
+ }
1716
+
1717
+ /**
1718
+ * Bulk create prices
1719
+ * Creates multiple price entries at once (skips duplicates)
1720
+ * @param data The data for the request.
1721
+ * @param data.region Region code for tenant context
1722
+ * @param data.requestBody
1723
+ * @returns PriceResponseDto Prices created successfully
1724
+ * @throws ApiError
1725
+ */
1726
+ public static priceControllerBulkCreate(
1727
+ data: PriceControllerBulkCreateData
1728
+ ): CancelablePromise<PriceControllerBulkCreateResponse> {
1729
+ return __request(OpenAPI, {
1730
+ method: 'POST',
1731
+ url: '/api/v1/{region}/bean/prices/bulk',
1732
+ path: {
1733
+ region: data.region
1734
+ },
1735
+ body: data.requestBody,
1736
+ mediaType: 'application/json'
1737
+ });
1738
+ }
1739
+ }
1740
+
1194
1741
  export class RecurringRulesService {
1195
1742
  /**
1743
+ * Create a new recurring rule
1744
+ * Creates a new recurring transaction rule for the authenticated user
1196
1745
  * @param data The data for the request.
1197
1746
  * @param data.region Region code for tenant context
1198
- * @returns unknown
1747
+ * @param data.requestBody
1748
+ * @returns RecurringRuleResponseDto Rule created successfully
1199
1749
  * @throws ApiError
1200
1750
  */
1201
- public static recurringRuleController(
1202
- data: RecurringRuleControllerData
1203
- ): CancelablePromise<RecurringRuleControllerResponse> {
1751
+ public static recurringRuleControllerCreate(
1752
+ data: RecurringRuleControllerCreateData
1753
+ ): CancelablePromise<RecurringRuleControllerCreateResponse> {
1204
1754
  return __request(OpenAPI, {
1205
1755
  method: 'POST',
1206
1756
  url: '/api/v1/{region}/bean/recurring-rules',
1207
1757
  path: {
1208
1758
  region: data.region
1759
+ },
1760
+ body: data.requestBody,
1761
+ mediaType: 'application/json',
1762
+ errors: {
1763
+ 400: 'Invalid input data (e.g., autoCreate without accounts)',
1764
+ 409: 'Rule with same name already exists'
1209
1765
  }
1210
1766
  });
1211
1767
  }
@@ -1239,19 +1795,30 @@ export class RecurringRulesService {
1239
1795
  }
1240
1796
 
1241
1797
  /**
1798
+ * Create recurring rule from transaction
1799
+ * Auto-creates a recurring rule using transaction data. User only confirms frequency.
1242
1800
  * @param data The data for the request.
1801
+ * @param data.transactionId Source transaction ID
1243
1802
  * @param data.region Region code for tenant context
1244
- * @returns unknown
1803
+ * @param data.requestBody
1804
+ * @returns RecurringRuleResponseDto Rule created successfully
1245
1805
  * @throws ApiError
1246
1806
  */
1247
- public static recurringRuleController1(
1248
- data: RecurringRuleController1Data
1249
- ): CancelablePromise<RecurringRuleController1Response> {
1807
+ public static recurringRuleControllerCreateFromTransaction(
1808
+ data: RecurringRuleControllerCreateFromTransactionData
1809
+ ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
1250
1810
  return __request(OpenAPI, {
1251
1811
  method: 'POST',
1252
1812
  url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
1253
1813
  path: {
1814
+ transactionId: data.transactionId,
1254
1815
  region: data.region
1816
+ },
1817
+ body: data.requestBody,
1818
+ mediaType: 'application/json',
1819
+ errors: {
1820
+ 404: 'Transaction not found',
1821
+ 409: 'Rule with same name already exists or transaction already linked'
1255
1822
  }
1256
1823
  });
1257
1824
  }
@@ -1282,37 +1849,55 @@ export class RecurringRulesService {
1282
1849
  }
1283
1850
 
1284
1851
  /**
1852
+ * Update recurring rule
1853
+ * Updates an existing recurring rule
1285
1854
  * @param data The data for the request.
1855
+ * @param data.id Rule ID
1286
1856
  * @param data.region Region code for tenant context
1287
- * @returns unknown
1857
+ * @param data.requestBody
1858
+ * @returns RecurringRuleResponseDto Rule updated successfully
1288
1859
  * @throws ApiError
1289
1860
  */
1290
- public static recurringRuleController2(
1291
- data: RecurringRuleController2Data
1292
- ): CancelablePromise<RecurringRuleController2Response> {
1861
+ public static recurringRuleControllerUpdate(
1862
+ data: RecurringRuleControllerUpdateData
1863
+ ): CancelablePromise<RecurringRuleControllerUpdateResponse> {
1293
1864
  return __request(OpenAPI, {
1294
1865
  method: 'PATCH',
1295
1866
  url: '/api/v1/{region}/bean/recurring-rules/{id}',
1296
1867
  path: {
1868
+ id: data.id,
1297
1869
  region: data.region
1870
+ },
1871
+ body: data.requestBody,
1872
+ mediaType: 'application/json',
1873
+ errors: {
1874
+ 400: 'Invalid input data',
1875
+ 404: 'Rule not found'
1298
1876
  }
1299
1877
  });
1300
1878
  }
1301
1879
 
1302
1880
  /**
1881
+ * Delete recurring rule
1882
+ * Soft deletes a recurring rule (sets isActive to false)
1303
1883
  * @param data The data for the request.
1884
+ * @param data.id Rule ID
1304
1885
  * @param data.region Region code for tenant context
1305
- * @returns void
1886
+ * @returns void Rule deleted successfully
1306
1887
  * @throws ApiError
1307
1888
  */
1308
- public static recurringRuleController3(
1309
- data: RecurringRuleController3Data
1310
- ): CancelablePromise<RecurringRuleController3Response> {
1889
+ public static recurringRuleControllerDelete(
1890
+ data: RecurringRuleControllerDeleteData
1891
+ ): CancelablePromise<RecurringRuleControllerDeleteResponse> {
1311
1892
  return __request(OpenAPI, {
1312
1893
  method: 'DELETE',
1313
1894
  url: '/api/v1/{region}/bean/recurring-rules/{id}',
1314
1895
  path: {
1896
+ id: data.id,
1315
1897
  region: data.region
1898
+ },
1899
+ errors: {
1900
+ 404: 'Rule not found'
1316
1901
  }
1317
1902
  });
1318
1903
  }
@@ -1420,113 +2005,576 @@ export class ExpectedTransactionsService {
1420
2005
  }
1421
2006
 
1422
2007
  /**
2008
+ * Skip expected transaction
2009
+ * Marks an expected transaction as skipped (PENDING -> SKIPPED)
1423
2010
  * @param data The data for the request.
2011
+ * @param data.id Expected transaction ID
1424
2012
  * @param data.region Region code for tenant context
1425
- * @returns unknown
2013
+ * @returns ExpectedTransactionResponseDto Expected transaction skipped successfully
1426
2014
  * @throws ApiError
1427
2015
  */
1428
- public static expectedTransactionController(
1429
- data: ExpectedTransactionControllerData
1430
- ): CancelablePromise<ExpectedTransactionControllerResponse> {
2016
+ public static expectedTransactionControllerSkip(
2017
+ data: ExpectedTransactionControllerSkipData
2018
+ ): CancelablePromise<ExpectedTransactionControllerSkipResponse> {
1431
2019
  return __request(OpenAPI, {
1432
2020
  method: 'POST',
1433
2021
  url: '/api/v1/{region}/bean/expected-transactions/{id}/skip',
1434
2022
  path: {
2023
+ id: data.id,
1435
2024
  region: data.region
2025
+ },
2026
+ errors: {
2027
+ 400: 'Cannot skip - not in PENDING status',
2028
+ 404: 'Expected transaction not found'
1436
2029
  }
1437
2030
  });
1438
2031
  }
1439
2032
 
1440
2033
  /**
2034
+ * Undo skip
2035
+ * Reverses a skip operation (SKIPPED -> PENDING)
1441
2036
  * @param data The data for the request.
2037
+ * @param data.id Expected transaction ID
1442
2038
  * @param data.region Region code for tenant context
1443
- * @returns unknown
2039
+ * @returns ExpectedTransactionResponseDto Skip undone successfully
1444
2040
  * @throws ApiError
1445
2041
  */
1446
- public static expectedTransactionController1(
1447
- data: ExpectedTransactionController1Data
1448
- ): CancelablePromise<ExpectedTransactionController1Response> {
2042
+ public static expectedTransactionControllerUndoSkip(
2043
+ data: ExpectedTransactionControllerUndoSkipData
2044
+ ): CancelablePromise<ExpectedTransactionControllerUndoSkipResponse> {
1449
2045
  return __request(OpenAPI, {
1450
2046
  method: 'DELETE',
1451
2047
  url: '/api/v1/{region}/bean/expected-transactions/{id}/skip',
1452
2048
  path: {
2049
+ id: data.id,
1453
2050
  region: data.region
2051
+ },
2052
+ errors: {
2053
+ 400: 'Cannot undo - not in SKIPPED status',
2054
+ 404: 'Expected transaction not found'
1454
2055
  }
1455
2056
  });
1456
2057
  }
1457
2058
 
1458
2059
  /**
2060
+ * Confirm transaction match
2061
+ * Manually matches an expected transaction with an actual transaction
1459
2062
  * @param data The data for the request.
2063
+ * @param data.id Expected transaction ID
1460
2064
  * @param data.region Region code for tenant context
1461
- * @returns unknown
2065
+ * @param data.requestBody
2066
+ * @returns unknown Match confirmed successfully
1462
2067
  * @throws ApiError
1463
2068
  */
1464
- public static expectedTransactionController2(
1465
- data: ExpectedTransactionController2Data
1466
- ): CancelablePromise<ExpectedTransactionController2Response> {
2069
+ public static expectedTransactionControllerConfirmMatch(
2070
+ data: ExpectedTransactionControllerConfirmMatchData
2071
+ ): CancelablePromise<ExpectedTransactionControllerConfirmMatchResponse> {
1467
2072
  return __request(OpenAPI, {
1468
2073
  method: 'POST',
1469
2074
  url: '/api/v1/{region}/bean/expected-transactions/{id}/match',
1470
2075
  path: {
2076
+ id: data.id,
1471
2077
  region: data.region
2078
+ },
2079
+ body: data.requestBody,
2080
+ mediaType: 'application/json',
2081
+ errors: {
2082
+ 400: 'Cannot match - not in PENDING status',
2083
+ 404: 'Expected or actual transaction not found',
2084
+ 409: 'Actual transaction already matched to another rule'
1472
2085
  }
1473
2086
  });
1474
2087
  }
1475
2088
 
1476
2089
  /**
2090
+ * Unmatch transaction
2091
+ * Removes the match between expected and actual transaction (COMPLETED -> PENDING)
1477
2092
  * @param data The data for the request.
2093
+ * @param data.id Expected transaction ID
1478
2094
  * @param data.region Region code for tenant context
1479
- * @returns unknown
2095
+ * @returns unknown Match removed successfully
1480
2096
  * @throws ApiError
1481
2097
  */
1482
- public static expectedTransactionController3(
1483
- data: ExpectedTransactionController3Data
1484
- ): CancelablePromise<ExpectedTransactionController3Response> {
2098
+ public static expectedTransactionControllerUnmatch(
2099
+ data: ExpectedTransactionControllerUnmatchData
2100
+ ): CancelablePromise<ExpectedTransactionControllerUnmatchResponse> {
1485
2101
  return __request(OpenAPI, {
1486
2102
  method: 'DELETE',
1487
2103
  url: '/api/v1/{region}/bean/expected-transactions/{id}/match',
1488
2104
  path: {
2105
+ id: data.id,
1489
2106
  region: data.region
2107
+ },
2108
+ errors: {
2109
+ 400: 'Cannot unmatch - not in COMPLETED status',
2110
+ 404: 'Expected transaction not found'
1490
2111
  }
1491
2112
  });
1492
2113
  }
1493
2114
 
1494
2115
  /**
2116
+ * Enter Now
2117
+ * Creates an actual transaction for an expected transaction (YNAB-style Enter Now)
1495
2118
  * @param data The data for the request.
2119
+ * @param data.id Expected transaction ID
1496
2120
  * @param data.region Region code for tenant context
1497
- * @returns unknown
2121
+ * @param data.requestBody
2122
+ * @returns unknown Transaction created successfully
2123
+ * @throws ApiError
2124
+ */
2125
+ public static expectedTransactionControllerEnterNow(
2126
+ data: ExpectedTransactionControllerEnterNowData
2127
+ ): CancelablePromise<ExpectedTransactionControllerEnterNowResponse> {
2128
+ return __request(OpenAPI, {
2129
+ method: 'POST',
2130
+ url: '/api/v1/{region}/bean/expected-transactions/{id}/enter',
2131
+ path: {
2132
+ id: data.id,
2133
+ region: data.region
2134
+ },
2135
+ body: data.requestBody,
2136
+ mediaType: 'application/json',
2137
+ errors: {
2138
+ 400: 'Cannot enter - not in PENDING status or missing accounts',
2139
+ 404: 'Expected transaction or accounts not found'
2140
+ }
2141
+ });
2142
+ }
2143
+ }
2144
+
2145
+ export class RecurringForecastService {
2146
+ /**
2147
+ * Get cash flow forecast
2148
+ * Returns predicted outflows for the next N months based on active recurring rules
2149
+ * @param data The data for the request.
2150
+ * @param data.region Region code for tenant context
2151
+ * @param data.months Number of months to forecast (1-12, default 3)
2152
+ * @returns ForecastResponseDto Forecast retrieved successfully
2153
+ * @throws ApiError
2154
+ */
2155
+ public static forecastControllerGetForecast(
2156
+ data: ForecastControllerGetForecastData
2157
+ ): CancelablePromise<ForecastControllerGetForecastResponse> {
2158
+ return __request(OpenAPI, {
2159
+ method: 'GET',
2160
+ url: '/api/v1/{region}/bean/recurring/forecast',
2161
+ path: {
2162
+ region: data.region
2163
+ },
2164
+ query: {
2165
+ months: data.months
2166
+ }
2167
+ });
2168
+ }
2169
+ }
2170
+
2171
+ export class ReportingService {
2172
+ /**
2173
+ * Get portfolio value trends
2174
+ *
2175
+ * Returns time series data of portfolio net worth.
2176
+ *
2177
+ * **Multi-currency Support:**
2178
+ * - `series[].byCurrency` - Currency breakdown for each data point
2179
+ * - `byCurrency` - Separate time series grouped by currency
2180
+ * - `warnings` - Exchange rate warnings if conversion failed
2181
+ *
2182
+ * **Parameters:**
2183
+ * - `period`: Time period (1m, 3m, 6m, 1y)
2184
+ * - `granularity`: Data granularity (day, week, month)
2185
+ *
2186
+ * @param data The data for the request.
2187
+ * @param data.region Region code for tenant context
2188
+ * @param data.period Time period
2189
+ * @param data.granularity Data granularity
2190
+ * @returns PortfolioTrendsResponseDto Trends retrieved successfully
2191
+ * @throws ApiError
2192
+ */
2193
+ public static reportingControllerGetPortfolioTrends(
2194
+ data: ReportingControllerGetPortfolioTrendsData
2195
+ ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
2196
+ return __request(OpenAPI, {
2197
+ method: 'GET',
2198
+ url: '/api/v1/{region}/reporting/portfolio/trends',
2199
+ path: {
2200
+ region: data.region
2201
+ },
2202
+ query: {
2203
+ period: data.period,
2204
+ granularity: data.granularity
2205
+ },
2206
+ errors: {
2207
+ 401: 'User not authenticated'
2208
+ }
2209
+ });
2210
+ }
2211
+
2212
+ /**
2213
+ * Get cash-flow trends
2214
+ *
2215
+ * Monthly income / expense / netSavings over a fixed N-month window
2216
+ * (current month + N−1 prior). Missing months are zero-filled (flow metric).
2217
+ *
2218
+ * **Parameters:**
2219
+ * - `period`: 1m | 3m | 6m | 1y (default 6m)
2220
+ * - `granularity`: accepted for API symmetry; v1 returns month buckets
2221
+ *
2222
+ * @param data The data for the request.
2223
+ * @param data.region Region code for tenant context
2224
+ * @param data.period Time period
2225
+ * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
2226
+ * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
2227
+ * @throws ApiError
2228
+ */
2229
+ public static reportingControllerGetCashFlowTrends(
2230
+ data: ReportingControllerGetCashFlowTrendsData
2231
+ ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
2232
+ return __request(OpenAPI, {
2233
+ method: 'GET',
2234
+ url: '/api/v1/{region}/reporting/cash-flow/trends',
2235
+ path: {
2236
+ region: data.region
2237
+ },
2238
+ query: {
2239
+ period: data.period,
2240
+ granularity: data.granularity
2241
+ },
2242
+ errors: {
2243
+ 401: 'User not authenticated'
2244
+ }
2245
+ });
2246
+ }
2247
+
2248
+ /**
2249
+ * Generate portfolio snapshot
2250
+ *
2251
+ * Manually generate a portfolio snapshot for a specific date.
2252
+ *
2253
+ * **Multi-currency Support:**
2254
+ * - Fetches balances grouped by currency
2255
+ * - Uses user's baseCurrency setting for conversion
2256
+ * - Stores exchange rates and warnings
2257
+ *
2258
+ * **Use Cases:**
2259
+ * - Testing snapshot generation
2260
+ * - Force regeneration after data correction
2261
+ * - Initial setup for new users
2262
+ *
2263
+ * @param data The data for the request.
2264
+ * @param data.region Region code for tenant context
2265
+ * @param data.requestBody Optional date (defaults to today)
2266
+ * @returns GenerateSnapshotResponse Snapshot generated successfully
2267
+ * @throws ApiError
2268
+ */
2269
+ public static reportingControllerGenerateSnapshot(
2270
+ data: ReportingControllerGenerateSnapshotData
2271
+ ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
2272
+ return __request(OpenAPI, {
2273
+ method: 'POST',
2274
+ url: '/api/v1/{region}/reporting/snapshots/generate',
2275
+ path: {
2276
+ region: data.region
2277
+ },
2278
+ body: data.requestBody,
2279
+ mediaType: 'application/json',
2280
+ errors: {
2281
+ 400: 'Invalid date format',
2282
+ 401: 'User not authenticated'
2283
+ }
2284
+ });
2285
+ }
2286
+
2287
+ /**
2288
+ * Backfill portfolio snapshots
2289
+ *
2290
+ * Generate snapshots for a date range (historical data backfill).
2291
+ *
2292
+ * **Multi-currency Support:**
2293
+ * - Each snapshot includes multi-currency data
2294
+ * - Uses exchange rates available at generation time
2295
+ * - Warnings stored for missing exchange rates
2296
+ *
2297
+ * **Best Practices:**
2298
+ * - Use for initial setup after account configuration
2299
+ * - Run during low-traffic periods for large date ranges
2300
+ * - Existing snapshots are skipped (not regenerated)
2301
+ *
2302
+ * @param data The data for the request.
2303
+ * @param data.region Region code for tenant context
2304
+ * @param data.requestBody
2305
+ * @returns BackfillSnapshotsResponse Backfill completed successfully
2306
+ * @throws ApiError
2307
+ */
2308
+ public static reportingControllerBackfillSnapshots(
2309
+ data: ReportingControllerBackfillSnapshotsData
2310
+ ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
2311
+ return __request(OpenAPI, {
2312
+ method: 'POST',
2313
+ url: '/api/v1/{region}/reporting/snapshots/backfill',
2314
+ path: {
2315
+ region: data.region
2316
+ },
2317
+ body: data.requestBody,
2318
+ mediaType: 'application/json',
2319
+ errors: {
2320
+ 400: 'Invalid date format or range',
2321
+ 401: 'User not authenticated',
2322
+ 409: 'Backfill already in progress for this user'
2323
+ }
2324
+ });
2325
+ }
2326
+ }
2327
+
2328
+ export class UsersService {
2329
+ /**
2330
+ * Delete own user account
2331
+ * @param data The data for the request.
2332
+ * @param data.requestBody
2333
+ * @returns void User deleted successfully
2334
+ * @throws ApiError
2335
+ */
2336
+ public static userControllerDeleteOwnUser(
2337
+ data: UserControllerDeleteOwnUserData
2338
+ ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
2339
+ return __request(OpenAPI, {
2340
+ method: 'DELETE',
2341
+ url: '/api/v1/users',
2342
+ body: data.requestBody,
2343
+ mediaType: 'application/json',
2344
+ errors: {
2345
+ 403: 'Invalid access token'
2346
+ }
2347
+ });
2348
+ }
2349
+
2350
+ /**
2351
+ * Get current authenticated user
2352
+ * @param data The data for the request.
2353
+ * @param data.acceptLanguage
2354
+ * @returns UserResponseDto User retrieved successfully
2355
+ * @throws ApiError
2356
+ */
2357
+ public static userControllerGetUser(
2358
+ data: UserControllerGetUserData
2359
+ ): CancelablePromise<UserControllerGetUserResponse> {
2360
+ return __request(OpenAPI, {
2361
+ method: 'GET',
2362
+ url: '/api/v1/users',
2363
+ headers: {
2364
+ 'accept-language': data.acceptLanguage
2365
+ }
2366
+ });
2367
+ }
2368
+
2369
+ /**
2370
+ * Sign up new user
2371
+ * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
2372
+ * @param data The data for the request.
2373
+ * @param data.requestBody
2374
+ * @returns SignupResponseDto User created successfully
2375
+ * @throws ApiError
2376
+ */
2377
+ public static userControllerSignupUser(
2378
+ data: UserControllerSignupUserData
2379
+ ): CancelablePromise<UserControllerSignupUserResponse> {
2380
+ return __request(OpenAPI, {
2381
+ method: 'POST',
2382
+ url: '/api/v1/users',
2383
+ body: data.requestBody,
2384
+ mediaType: 'application/json',
2385
+ errors: {
2386
+ 400: 'Invalid Turnstile token (when Turnstile is enabled)',
2387
+ 403: 'User signup is disabled'
2388
+ }
2389
+ });
2390
+ }
2391
+
2392
+ /**
2393
+ * Delete user by ID (admin only)
2394
+ * @param data The data for the request.
2395
+ * @param data.id User ID to delete
2396
+ * @returns void User deleted successfully
2397
+ * @throws ApiError
2398
+ */
2399
+ public static userControllerDeleteUser(
2400
+ data: UserControllerDeleteUserData
2401
+ ): CancelablePromise<UserControllerDeleteUserResponse> {
2402
+ return __request(OpenAPI, {
2403
+ method: 'DELETE',
2404
+ url: '/api/v1/users/{id}',
2405
+ path: {
2406
+ id: data.id
2407
+ },
2408
+ errors: {
2409
+ 403: 'Cannot delete own account or insufficient permissions'
2410
+ }
2411
+ });
2412
+ }
2413
+
2414
+ /**
2415
+ * Get user info by user ID
2416
+ * @param data The data for the request.
2417
+ * @param data.id User ID
2418
+ * @returns unknown User info retrieved successfully
2419
+ * @throws ApiError
2420
+ */
2421
+ public static userControllerGetUserInfo(
2422
+ data: UserControllerGetUserInfoData
2423
+ ): CancelablePromise<UserControllerGetUserInfoResponse> {
2424
+ return __request(OpenAPI, {
2425
+ method: 'GET',
2426
+ url: '/api/v1/users/{id}/info',
2427
+ path: {
2428
+ id: data.id
2429
+ },
2430
+ errors: {
2431
+ 403: 'Cannot access other user info without admin permission'
2432
+ }
2433
+ });
2434
+ }
2435
+
2436
+ /**
2437
+ * Update user settings
2438
+ * @param data The data for the request.
2439
+ * @param data.requestBody
2440
+ * @returns unknown Settings updated successfully
2441
+ * @throws ApiError
2442
+ */
2443
+ public static userControllerUpdateUserSetting(
2444
+ data: UserControllerUpdateUserSettingData
2445
+ ): CancelablePromise<UserControllerUpdateUserSettingResponse> {
2446
+ return __request(OpenAPI, {
2447
+ method: 'PUT',
2448
+ url: '/api/v1/users/setting',
2449
+ body: data.requestBody,
2450
+ mediaType: 'application/json',
2451
+ errors: {
2452
+ 403: 'Insufficient permissions'
2453
+ }
2454
+ });
2455
+ }
2456
+
2457
+ /**
2458
+ * Get all user settings paginated (admin only)
2459
+ * @param data The data for the request.
2460
+ * @param data.pageNo Page number
2461
+ * @param data.pageSize Page size
2462
+ * @returns unknown Settings list retrieved successfully
2463
+ * @throws ApiError
2464
+ */
2465
+ public static userControllerGetAllUserSettingsByPage(
2466
+ data: UserControllerGetAllUserSettingsByPageData
2467
+ ): CancelablePromise<UserControllerGetAllUserSettingsByPageResponse> {
2468
+ return __request(OpenAPI, {
2469
+ method: 'GET',
2470
+ url: '/api/v1/users/settings-by-page',
2471
+ query: {
2472
+ pageNo: data.pageNo,
2473
+ pageSize: data.pageSize
2474
+ }
2475
+ });
2476
+ }
2477
+
2478
+ /**
2479
+ * Get asset and liability summary for current user
2480
+ * @returns unknown Summary retrieved successfully
1498
2481
  * @throws ApiError
1499
2482
  */
1500
- public static expectedTransactionController4(
1501
- data: ExpectedTransactionController4Data
1502
- ): CancelablePromise<ExpectedTransactionController4Response> {
2483
+ public static userControllerGetAssetLiabilitySummary(): CancelablePromise<UserControllerGetAssetLiabilitySummaryResponse> {
1503
2484
  return __request(OpenAPI, {
1504
- method: 'POST',
1505
- url: '/api/v1/{region}/bean/expected-transactions/{id}/enter',
1506
- path: {
1507
- region: data.region
1508
- }
2485
+ method: 'GET',
2486
+ url: '/api/v1/users/asset-liability-summary'
1509
2487
  });
1510
2488
  }
1511
2489
  }
1512
2490
 
1513
- export class RecurringForecastService {
2491
+ export class PropertiesService {
1514
2492
  /**
1515
- * Get cash flow forecast
1516
- * Returns predicted outflows for the next N months based on active recurring rules
2493
+ * Get all system properties
2494
+ * @returns unknown Properties retrieved successfully
2495
+ * @throws ApiError
2496
+ */
2497
+ public static propertyControllerGetAll(): CancelablePromise<PropertyControllerGetAllResponse> {
2498
+ return __request(OpenAPI, {
2499
+ method: 'GET',
2500
+ url: '/api/v1/admin/properties',
2501
+ errors: {
2502
+ 401: 'Unauthorized',
2503
+ 403: 'Forbidden - insufficient permissions'
2504
+ }
2505
+ });
2506
+ }
2507
+
2508
+ /**
2509
+ * Get property by key
1517
2510
  * @param data The data for the request.
1518
- * @param data.months Number of months to forecast (1-12, default 3)
1519
- * @returns ForecastResponseDto Forecast retrieved successfully
2511
+ * @param data.key Property key
2512
+ * @returns unknown Property retrieved successfully
1520
2513
  * @throws ApiError
1521
2514
  */
1522
- public static forecastControllerGetForecast(
1523
- data: ForecastControllerGetForecastData = {}
1524
- ): CancelablePromise<ForecastControllerGetForecastResponse> {
2515
+ public static propertyControllerGetByKey(
2516
+ data: PropertyControllerGetByKeyData
2517
+ ): CancelablePromise<PropertyControllerGetByKeyResponse> {
1525
2518
  return __request(OpenAPI, {
1526
2519
  method: 'GET',
1527
- url: '/api/v1/{region}/bean/recurring/forecast',
1528
- query: {
1529
- months: data.months
2520
+ url: '/api/v1/admin/properties/{key}',
2521
+ path: {
2522
+ key: data.key
2523
+ },
2524
+ errors: {
2525
+ 401: 'Unauthorized',
2526
+ 403: 'Forbidden - insufficient permissions',
2527
+ 404: 'Property not found'
2528
+ }
2529
+ });
2530
+ }
2531
+
2532
+ /**
2533
+ * Update a system property
2534
+ * @param data The data for the request.
2535
+ * @param data.key Property key
2536
+ * @param data.requestBody
2537
+ * @returns unknown Property updated successfully
2538
+ * @throws ApiError
2539
+ */
2540
+ public static propertyControllerUpdate(
2541
+ data: PropertyControllerUpdateData
2542
+ ): CancelablePromise<PropertyControllerUpdateResponse> {
2543
+ return __request(OpenAPI, {
2544
+ method: 'PUT',
2545
+ url: '/api/v1/admin/properties/{key}',
2546
+ path: {
2547
+ key: data.key
2548
+ },
2549
+ body: data.requestBody,
2550
+ mediaType: 'application/json',
2551
+ errors: {
2552
+ 401: 'Unauthorized',
2553
+ 403: 'Forbidden - insufficient permissions'
2554
+ }
2555
+ });
2556
+ }
2557
+
2558
+ /**
2559
+ * Delete a system property
2560
+ * @param data The data for the request.
2561
+ * @param data.key Property key
2562
+ * @returns void Property deleted successfully
2563
+ * @throws ApiError
2564
+ */
2565
+ public static propertyControllerDelete(
2566
+ data: PropertyControllerDeleteData
2567
+ ): CancelablePromise<PropertyControllerDeleteResponse> {
2568
+ return __request(OpenAPI, {
2569
+ method: 'DELETE',
2570
+ url: '/api/v1/admin/properties/{key}',
2571
+ path: {
2572
+ key: data.key
2573
+ },
2574
+ errors: {
2575
+ 401: 'Unauthorized',
2576
+ 403: 'Forbidden - insufficient permissions',
2577
+ 404: 'Property not found'
1530
2578
  }
1531
2579
  });
1532
2580
  }
@@ -1534,19 +2582,29 @@ export class RecurringForecastService {
1534
2582
 
1535
2583
  export class BeanTransactionRulesService {
1536
2584
  /**
2585
+ * Create a new transaction rule (or upsert if upsertByPayee=true)
2586
+ * Creates a new rule. If upsertByPayee=true, updates existing rule matching payeeKeywords[0] instead of creating duplicate.
1537
2587
  * @param data The data for the request.
1538
2588
  * @param data.region Region code for tenant context
1539
- * @returns unknown
2589
+ * @param data.requestBody
2590
+ * @returns TransactionRuleResponseDto Rule updated successfully (upsert mode)
1540
2591
  * @throws ApiError
1541
2592
  */
1542
- public static transactionRuleController(
1543
- data: TransactionRuleControllerData
1544
- ): CancelablePromise<TransactionRuleControllerResponse> {
2593
+ public static transactionRuleControllerCreate(
2594
+ data: TransactionRuleControllerCreateData
2595
+ ): CancelablePromise<TransactionRuleControllerCreateResponse> {
1545
2596
  return __request(OpenAPI, {
1546
2597
  method: 'POST',
1547
2598
  url: '/api/v1/{region}/bean/transaction-rules',
1548
2599
  path: {
1549
2600
  region: data.region
2601
+ },
2602
+ body: data.requestBody,
2603
+ mediaType: 'application/json',
2604
+ errors: {
2605
+ 400: 'Validation failed',
2606
+ 401: 'Unauthorized',
2607
+ 409: 'Resource conflict - another process is updating this rule'
1550
2608
  }
1551
2609
  });
1552
2610
  }
@@ -1605,25 +2663,34 @@ export class BeanTransactionRulesService {
1605
2663
  body: data.requestBody,
1606
2664
  mediaType: 'application/json',
1607
2665
  errors: {
2666
+ 400: 'Validation failed',
1608
2667
  401: 'Unauthorized'
1609
2668
  }
1610
2669
  });
1611
2670
  }
1612
2671
 
1613
2672
  /**
2673
+ * Bulk create transaction rules
1614
2674
  * @param data The data for the request.
1615
2675
  * @param data.region Region code for tenant context
1616
- * @returns unknown
2676
+ * @param data.requestBody
2677
+ * @returns BulkCreateRulesResponseDto Bulk create completed
1617
2678
  * @throws ApiError
1618
2679
  */
1619
- public static transactionRuleController1(
1620
- data: TransactionRuleController1Data
1621
- ): CancelablePromise<TransactionRuleController1Response> {
2680
+ public static transactionRuleControllerBulkCreate(
2681
+ data: TransactionRuleControllerBulkCreateData
2682
+ ): CancelablePromise<TransactionRuleControllerBulkCreateResponse> {
1622
2683
  return __request(OpenAPI, {
1623
2684
  method: 'POST',
1624
2685
  url: '/api/v1/{region}/bean/transaction-rules/bulk',
1625
2686
  path: {
1626
2687
  region: data.region
2688
+ },
2689
+ body: data.requestBody,
2690
+ mediaType: 'application/json',
2691
+ errors: {
2692
+ 400: 'Invalid bulk create data',
2693
+ 401: 'Unauthorized'
1627
2694
  }
1628
2695
  });
1629
2696
  }
@@ -1704,37 +2771,59 @@ export class BeanTransactionRulesService {
1704
2771
  }
1705
2772
 
1706
2773
  /**
2774
+ * Update a transaction rule
1707
2775
  * @param data The data for the request.
2776
+ * @param data.ruleId Rule ID to update
1708
2777
  * @param data.region Region code for tenant context
1709
- * @returns unknown
2778
+ * @param data.requestBody
2779
+ * @returns TransactionRuleResponseDto Rule updated successfully
1710
2780
  * @throws ApiError
1711
2781
  */
1712
- public static transactionRuleController2(
1713
- data: TransactionRuleController2Data
1714
- ): CancelablePromise<TransactionRuleController2Response> {
2782
+ public static transactionRuleControllerUpdate(
2783
+ data: TransactionRuleControllerUpdateData
2784
+ ): CancelablePromise<TransactionRuleControllerUpdateResponse> {
1715
2785
  return __request(OpenAPI, {
1716
2786
  method: 'PUT',
1717
2787
  url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
1718
2788
  path: {
2789
+ ruleId: data.ruleId,
1719
2790
  region: data.region
2791
+ },
2792
+ body: data.requestBody,
2793
+ mediaType: 'application/json',
2794
+ errors: {
2795
+ 400: 'Validation failed',
2796
+ 401: 'Unauthorized',
2797
+ 403: 'Forbidden - not owner of rule',
2798
+ 404: 'Rule not found',
2799
+ 409: 'Resource conflict - rule is being modified by another process'
1720
2800
  }
1721
2801
  });
1722
2802
  }
1723
2803
 
1724
2804
  /**
2805
+ * Delete a transaction rule
1725
2806
  * @param data The data for the request.
2807
+ * @param data.ruleId Rule ID to delete
1726
2808
  * @param data.region Region code for tenant context
1727
- * @returns void
2809
+ * @returns void Rule deleted successfully
1728
2810
  * @throws ApiError
1729
2811
  */
1730
- public static transactionRuleController3(
1731
- data: TransactionRuleController3Data
1732
- ): CancelablePromise<TransactionRuleController3Response> {
2812
+ public static transactionRuleControllerDelete(
2813
+ data: TransactionRuleControllerDeleteData
2814
+ ): CancelablePromise<TransactionRuleControllerDeleteResponse> {
1733
2815
  return __request(OpenAPI, {
1734
2816
  method: 'DELETE',
1735
2817
  url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
1736
2818
  path: {
2819
+ ruleId: data.ruleId,
1737
2820
  region: data.region
2821
+ },
2822
+ errors: {
2823
+ 401: 'Unauthorized',
2824
+ 403: 'Forbidden - not owner of rule',
2825
+ 404: 'Rule not found',
2826
+ 409: 'Resource conflict - rule is being modified by another process'
1738
2827
  }
1739
2828
  });
1740
2829
  }
@@ -1769,229 +2858,353 @@ export class BeanTransactionRulesService {
1769
2858
  }
1770
2859
  }
1771
2860
 
1772
- export class UsersService {
2861
+ export class BeanCategoryCatalogService {
1773
2862
  /**
1774
- * Delete own user account
2863
+ * List category catalog for a region
2864
+ * Returns the region-scoped category slugs (expense/income/investment/banking/transfer/payment) for the NLP result picker. CN-exclusive payment instruments (huabei/baitiao) appear only under /cn.
2865
+ * @param data The data for the request.
2866
+ * @param data.region Region code for tenant context
2867
+ * @param data.scenario Filter by scenario
2868
+ * @param data.routeBearing Filter by routeBearing (entity-router route() consumes it)
2869
+ * @returns CategoryCatalogListResponseDto Category catalog retrieved successfully
2870
+ * @throws ApiError
2871
+ */
2872
+ public static categoryCatalogControllerList(
2873
+ data: CategoryCatalogControllerListData
2874
+ ): CancelablePromise<CategoryCatalogControllerListResponse> {
2875
+ return __request(OpenAPI, {
2876
+ method: 'GET',
2877
+ url: '/api/v1/{region}/bean/categories',
2878
+ path: {
2879
+ region: data.region
2880
+ },
2881
+ query: {
2882
+ scenario: data.scenario,
2883
+ routeBearing: data.routeBearing
2884
+ }
2885
+ });
2886
+ }
2887
+ }
2888
+
2889
+ export class LifeEventsService {
2890
+ /**
2891
+ * Create a new life event
2892
+ * Creates a new life event entry for the authenticated user. Returns ETag header carrying the row updatedAt.
1775
2893
  * @param data The data for the request.
2894
+ * @param data.region Region code for tenant context (decorative for life events)
1776
2895
  * @param data.requestBody
1777
- * @returns void User deleted successfully
2896
+ * @returns EventResponseDto Life event created successfully
1778
2897
  * @throws ApiError
1779
2898
  */
1780
- public static userControllerDeleteOwnUser(
1781
- data: UserControllerDeleteOwnUserData
1782
- ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
2899
+ public static eventControllerCreate(
2900
+ data: EventControllerCreateData
2901
+ ): CancelablePromise<EventControllerCreateResponse> {
1783
2902
  return __request(OpenAPI, {
1784
- method: 'DELETE',
1785
- url: '/api/v1/users',
2903
+ method: 'POST',
2904
+ url: '/api/v1/{region}/bean/events',
2905
+ path: {
2906
+ region: data.region
2907
+ },
1786
2908
  body: data.requestBody,
1787
2909
  mediaType: 'application/json',
1788
2910
  errors: {
1789
- 403: 'Invalid access token'
2911
+ 409: 'Life event already exists for this (userId, type, date) combination'
1790
2912
  }
1791
2913
  });
1792
2914
  }
1793
2915
 
1794
2916
  /**
1795
- * Get current authenticated user
2917
+ * List user life events
2918
+ * Returns life events for the authenticated user with optional filtering by type, description search, and date range.
1796
2919
  * @param data The data for the request.
1797
- * @param data.acceptLanguage
1798
- * @returns unknown User retrieved successfully
2920
+ * @param data.region Region code for tenant context (decorative for life events)
2921
+ * @param data.type Filter by life event type (exact match)
2922
+ * @param data.q Search term for description (case-insensitive partial match)
2923
+ * @param data.from Filter life events from this date (ISO 8601 format)
2924
+ * @param data.to Filter life events to this date (ISO 8601 format)
2925
+ * @param data.page Page number for pagination (default: 1)
2926
+ * @param data.limit Number of items per page (default: 20, max: 100)
2927
+ * @returns EventListResponseDto Life events retrieved successfully
1799
2928
  * @throws ApiError
1800
2929
  */
1801
- public static userControllerGetUser(
1802
- data: UserControllerGetUserData
1803
- ): CancelablePromise<UserControllerGetUserResponse> {
2930
+ public static eventControllerFindAll(
2931
+ data: EventControllerFindAllData
2932
+ ): CancelablePromise<EventControllerFindAllResponse> {
1804
2933
  return __request(OpenAPI, {
1805
2934
  method: 'GET',
1806
- url: '/api/v1/users',
1807
- headers: {
1808
- 'accept-language': data.acceptLanguage
2935
+ url: '/api/v1/{region}/bean/events',
2936
+ path: {
2937
+ region: data.region
2938
+ },
2939
+ query: {
2940
+ type: data.type,
2941
+ q: data.q,
2942
+ from: data.from,
2943
+ to: data.to,
2944
+ page: data.page,
2945
+ limit: data.limit
1809
2946
  }
1810
2947
  });
1811
2948
  }
1812
2949
 
1813
2950
  /**
1814
- * Sign up new user
1815
- * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
2951
+ * Get life event by ID
2952
+ * Returns a single life event by its ID. Returns ETag header.
2953
+ * @param data The data for the request.
2954
+ * @param data.id Life event ID
2955
+ * @param data.region Region code for tenant context (decorative for life events)
2956
+ * @returns EventResponseDto Life event retrieved successfully
2957
+ * @throws ApiError
2958
+ */
2959
+ public static eventControllerFindOne(
2960
+ data: EventControllerFindOneData
2961
+ ): CancelablePromise<EventControllerFindOneResponse> {
2962
+ return __request(OpenAPI, {
2963
+ method: 'GET',
2964
+ url: '/api/v1/{region}/bean/events/{id}',
2965
+ path: {
2966
+ id: data.id,
2967
+ region: data.region
2968
+ },
2969
+ errors: {
2970
+ 404: 'Life event not found'
2971
+ }
2972
+ });
2973
+ }
2974
+
2975
+ /**
2976
+ * Update a life event
2977
+ * Updates an existing life event. If If-Match header is provided, performs optimistic concurrency check; mismatched updatedAt returns 412.
1816
2978
  * @param data The data for the request.
2979
+ * @param data.id Life event ID
2980
+ * @param data.region Region code for tenant context (decorative for life events)
1817
2981
  * @param data.requestBody
1818
- * @returns unknown User created successfully
2982
+ * @returns EventResponseDto Life event updated successfully
1819
2983
  * @throws ApiError
1820
2984
  */
1821
- public static userControllerSignupUser(
1822
- data: UserControllerSignupUserData
1823
- ): CancelablePromise<UserControllerSignupUserResponse> {
2985
+ public static eventControllerUpdate(
2986
+ data: EventControllerUpdateData
2987
+ ): CancelablePromise<EventControllerUpdateResponse> {
1824
2988
  return __request(OpenAPI, {
1825
- method: 'POST',
1826
- url: '/api/v1/users',
2989
+ method: 'PUT',
2990
+ url: '/api/v1/{region}/bean/events/{id}',
2991
+ path: {
2992
+ id: data.id,
2993
+ region: data.region
2994
+ },
1827
2995
  body: data.requestBody,
1828
2996
  mediaType: 'application/json',
1829
2997
  errors: {
1830
- 400: 'Invalid Turnstile token (when Turnstile is enabled)',
1831
- 403: 'User signup is disabled'
2998
+ 400: 'If-Match header is not a valid ISO 8601 date',
2999
+ 404: 'Life event not found',
3000
+ 409: 'Updated event conflicts with an existing (userId, type, date) combination',
3001
+ 412: 'If-Match precondition failed (updatedAt mismatch)'
1832
3002
  }
1833
3003
  });
1834
3004
  }
1835
3005
 
1836
3006
  /**
1837
- * Delete user by ID (admin only)
3007
+ * Delete a life event
3008
+ * Deletes a life event entry (hard delete). Returns 204.
1838
3009
  * @param data The data for the request.
1839
- * @param data.id User ID to delete
1840
- * @returns void User deleted successfully
3010
+ * @param data.id Life event ID
3011
+ * @param data.region Region code for tenant context (decorative for life events)
3012
+ * @returns void Life event deleted successfully
1841
3013
  * @throws ApiError
1842
3014
  */
1843
- public static userControllerDeleteUser(
1844
- data: UserControllerDeleteUserData
1845
- ): CancelablePromise<UserControllerDeleteUserResponse> {
3015
+ public static eventControllerDelete(
3016
+ data: EventControllerDeleteData
3017
+ ): CancelablePromise<EventControllerDeleteResponse> {
1846
3018
  return __request(OpenAPI, {
1847
3019
  method: 'DELETE',
1848
- url: '/api/v1/users/{id}',
3020
+ url: '/api/v1/{region}/bean/events/{id}',
1849
3021
  path: {
1850
- id: data.id
3022
+ id: data.id,
3023
+ region: data.region
1851
3024
  },
1852
3025
  errors: {
1853
- 403: 'Cannot delete own account or insufficient permissions'
3026
+ 404: 'Life event not found'
1854
3027
  }
1855
3028
  });
1856
3029
  }
1857
3030
 
1858
3031
  /**
1859
- * Get user info by user ID
3032
+ * Slice time-series by a life event (Phase 79)
3033
+ * Returns aggregated time-series for postings matching accountPattern within the half-open date range of the given life event.
1860
3034
  * @param data The data for the request.
1861
- * @param data.id User ID
1862
- * @returns unknown User info retrieved successfully
3035
+ * @param data.id Life event ID
3036
+ * @param data.accountPattern
3037
+ * @param data.granularity
3038
+ * @param data.region Region code for tenant context (decorative for life events)
3039
+ * @returns unknown Time-series sliced by the life event range
1863
3040
  * @throws ApiError
1864
3041
  */
1865
- public static userControllerGetUserInfo(
1866
- data: UserControllerGetUserInfoData
1867
- ): CancelablePromise<UserControllerGetUserInfoResponse> {
3042
+ public static eventControllerGetSlice(
3043
+ data: EventControllerGetSliceData
3044
+ ): CancelablePromise<EventControllerGetSliceResponse> {
1868
3045
  return __request(OpenAPI, {
1869
3046
  method: 'GET',
1870
- url: '/api/v1/users/{id}/info',
3047
+ url: '/api/v1/{region}/bean/events/{id}/slice',
1871
3048
  path: {
1872
- id: data.id
3049
+ id: data.id,
3050
+ region: data.region
3051
+ },
3052
+ query: {
3053
+ accountPattern: data.accountPattern,
3054
+ granularity: data.granularity
1873
3055
  },
1874
3056
  errors: {
1875
- 403: 'Cannot access other user info without admin permission'
3057
+ 400: 'accountPattern query param is empty',
3058
+ 404: 'Life event not found'
1876
3059
  }
1877
3060
  });
1878
3061
  }
3062
+ }
1879
3063
 
3064
+ export class OnboardingService {
1880
3065
  /**
1881
- * Update user settings
3066
+ * Bootstrap core accounts + register asset accounts with opening balances (ADR-0113)
1882
3067
  * @param data The data for the request.
3068
+ * @param data.region Region code for tenant context
1883
3069
  * @param data.requestBody
1884
- * @returns unknown Settings updated successfully
3070
+ * @returns unknown Onboarding bootstrap result.
1885
3071
  * @throws ApiError
1886
3072
  */
1887
- public static userControllerUpdateUserSetting(
1888
- data: UserControllerUpdateUserSettingData
1889
- ): CancelablePromise<UserControllerUpdateUserSettingResponse> {
3073
+ public static onboardingControllerBootstrap(
3074
+ data: OnboardingControllerBootstrapData
3075
+ ): CancelablePromise<OnboardingControllerBootstrapResponse> {
1890
3076
  return __request(OpenAPI, {
1891
- method: 'PUT',
1892
- url: '/api/v1/users/setting',
3077
+ method: 'POST',
3078
+ url: '/api/v1/{region}/bean/onboarding',
3079
+ path: {
3080
+ region: data.region
3081
+ },
1893
3082
  body: data.requestBody,
1894
3083
  mediaType: 'application/json',
1895
3084
  errors: {
1896
- 403: 'Insufficient permissions'
3085
+ 422: 'Invalid region/account path/duplicate paths.'
1897
3086
  }
1898
3087
  });
1899
3088
  }
3089
+ }
1900
3090
 
3091
+ export class BalanceReconciliationService {
1901
3092
  /**
1902
- * Get all user settings paginated (admin only)
3093
+ * Preview reconciliation (book vs actual)
3094
+ * Computes book balance, diff, Beancount-inferred tolerance, and suggested action without persisting.
1903
3095
  * @param data The data for the request.
1904
- * @param data.pageNo Page number
1905
- * @param data.pageSize Page size
1906
- * @returns unknown Settings list retrieved successfully
3096
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3097
+ * @param data.requestBody
3098
+ * @returns ReconciliationComputeResultDto Reconciliation preview
1907
3099
  * @throws ApiError
1908
3100
  */
1909
- public static userControllerGetAllUserSettingsByPage(
1910
- data: UserControllerGetAllUserSettingsByPageData
1911
- ): CancelablePromise<UserControllerGetAllUserSettingsByPageResponse> {
3101
+ public static reconciliationControllerCompute(
3102
+ data: ReconciliationControllerComputeData
3103
+ ): CancelablePromise<ReconciliationControllerComputeResponse> {
1912
3104
  return __request(OpenAPI, {
1913
- method: 'GET',
1914
- url: '/api/v1/users/settings-by-page',
1915
- query: {
1916
- pageNo: data.pageNo,
1917
- pageSize: data.pageSize
3105
+ method: 'POST',
3106
+ url: '/api/v1/{region}/bean/reconciliations',
3107
+ path: {
3108
+ region: data.region
3109
+ },
3110
+ body: data.requestBody,
3111
+ mediaType: 'application/json',
3112
+ errors: {
3113
+ 404: 'Account not found'
1918
3114
  }
1919
3115
  });
1920
3116
  }
1921
3117
 
1922
3118
  /**
1923
- * Get asset and liability summary for current user
1924
- * @returns unknown Summary retrieved successfully
3119
+ * Record a balance assertion
3120
+ * Persists the reconciliation as a BeanBalance assertion (amount = actual, diffAmount = book − actual). Re-reconciling the same day/currency upserts.
3121
+ * @param data The data for the request.
3122
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3123
+ * @param data.requestBody
3124
+ * @returns ReconciliationRecordDto Balance assertion recorded
1925
3125
  * @throws ApiError
1926
3126
  */
1927
- public static userControllerGetAssetLiabilitySummary(): CancelablePromise<UserControllerGetAssetLiabilitySummaryResponse> {
3127
+ public static reconciliationControllerAssert(
3128
+ data: ReconciliationControllerAssertData
3129
+ ): CancelablePromise<ReconciliationControllerAssertResponse> {
1928
3130
  return __request(OpenAPI, {
1929
- method: 'GET',
1930
- url: '/api/v1/users/asset-liability-summary'
3131
+ method: 'POST',
3132
+ url: '/api/v1/{region}/bean/reconciliations/assert',
3133
+ path: {
3134
+ region: data.region
3135
+ },
3136
+ body: data.requestBody,
3137
+ mediaType: 'application/json',
3138
+ errors: {
3139
+ 404: 'Account not found'
3140
+ }
1931
3141
  });
1932
3142
  }
1933
- }
1934
3143
 
1935
- export class PropertiesService {
1936
3144
  /**
1937
- * Get all system properties
1938
- * @returns unknown Properties retrieved successfully
3145
+ * Generate a pad adjusting entry
3146
+ * When book is outside tolerance, synthesizes a Beancount pad transaction (flag P) booking the diff from source_account and persists it. Source defaults to Equity:Opening-Balances.
3147
+ * @param data The data for the request.
3148
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3149
+ * @param data.requestBody
3150
+ * @returns PadResultDto Pad adjusting entry generated
1939
3151
  * @throws ApiError
1940
3152
  */
1941
- public static propertyControllerGetAll(): CancelablePromise<PropertyControllerGetAllResponse> {
3153
+ public static reconciliationControllerPad(
3154
+ data: ReconciliationControllerPadData
3155
+ ): CancelablePromise<ReconciliationControllerPadResponse> {
1942
3156
  return __request(OpenAPI, {
1943
- method: 'GET',
1944
- url: '/api/v1/admin/properties',
3157
+ method: 'POST',
3158
+ url: '/api/v1/{region}/bean/reconciliations/pad',
3159
+ path: {
3160
+ region: data.region
3161
+ },
3162
+ body: data.requestBody,
3163
+ mediaType: 'application/json',
1945
3164
  errors: {
1946
- 401: 'Unauthorized',
1947
- 403: 'Forbidden - insufficient permissions'
3165
+ 400: 'Book already within tolerance — no pad needed',
3166
+ 404: 'Account not found'
1948
3167
  }
1949
3168
  });
1950
3169
  }
1951
3170
 
1952
3171
  /**
1953
- * Get property by key
3172
+ * List reconciliation history for an account
3173
+ * Returns recorded balance assertions (most recent first). The latest drives the account-detail "Last <date>" badge.
1954
3174
  * @param data The data for the request.
1955
- * @param data.key Property key
1956
- * @returns unknown Property retrieved successfully
3175
+ * @param data.accountId BeanAccount id
3176
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3177
+ * @returns ReconciliationRecordDto Reconciliation history
1957
3178
  * @throws ApiError
1958
3179
  */
1959
- public static propertyControllerGetByKey(
1960
- data: PropertyControllerGetByKeyData
1961
- ): CancelablePromise<PropertyControllerGetByKeyResponse> {
3180
+ public static reconciliationControllerHistory(
3181
+ data: ReconciliationControllerHistoryData
3182
+ ): CancelablePromise<ReconciliationControllerHistoryResponse> {
1962
3183
  return __request(OpenAPI, {
1963
3184
  method: 'GET',
1964
- url: '/api/v1/admin/properties/{key}',
3185
+ url: '/api/v1/{region}/bean/accounts/{accountId}/reconciliations',
1965
3186
  path: {
1966
- key: data.key
3187
+ accountId: data.accountId,
3188
+ region: data.region
1967
3189
  },
1968
3190
  errors: {
1969
- 401: 'Unauthorized',
1970
- 403: 'Forbidden - insufficient permissions',
1971
- 404: 'Property not found'
3191
+ 404: 'Account not found'
1972
3192
  }
1973
3193
  });
1974
3194
  }
3195
+ }
1975
3196
 
3197
+ export class BeanExportService {
1976
3198
  /**
3199
+ * Export Beancount ledger as ZIP
3200
+ * Export all user Beancount data as a ZIP file containing ledger.beancount and yearly files in community format.
1977
3201
  * @returns unknown
1978
3202
  * @throws ApiError
1979
3203
  */
1980
- public static propertyController(): CancelablePromise<PropertyControllerResponse> {
3204
+ public static exportControllerExportBeancount(): CancelablePromise<ExportControllerExportBeancountResponse> {
1981
3205
  return __request(OpenAPI, {
1982
- method: 'PUT',
1983
- url: '/api/v1/admin/properties/{key}'
1984
- });
1985
- }
1986
-
1987
- /**
1988
- * @returns void
1989
- * @throws ApiError
1990
- */
1991
- public static propertyController1(): CancelablePromise<PropertyController1Response> {
1992
- return __request(OpenAPI, {
1993
- method: 'DELETE',
1994
- url: '/api/v1/admin/properties/{key}'
3206
+ method: 'GET',
3207
+ url: '/api/v1/{region}/bean/export/beancount'
1995
3208
  });
1996
3209
  }
1997
3210
  }
@@ -2001,6 +3214,7 @@ export class BeanImportService {
2001
3214
  * Import a bill file
2002
3215
  * Upload and process a bill file (CSV, PDF, OFX, etc.). The system automatically identifies the file type, extracts transactions, validates them, and stores only validated transactions to the database. Maximum file size: 50MB. Only 1 import per user at a time (concurrent imports rejected with 429).
2003
3216
  * @param data The data for the request.
3217
+ * @param data.region Region code for tenant context
2004
3218
  * @param data.formData Bill file to import
2005
3219
  * @returns ImportResultDto File imported successfully
2006
3220
  * @throws ApiError
@@ -2011,6 +3225,9 @@ export class BeanImportService {
2011
3225
  return __request(OpenAPI, {
2012
3226
  method: 'POST',
2013
3227
  url: '/api/v1/{region}/bean/import/file',
3228
+ path: {
3229
+ region: data.region
3230
+ },
2014
3231
  formData: data.formData,
2015
3232
  mediaType: 'multipart/form-data',
2016
3233
  errors: {
@@ -2026,6 +3243,7 @@ export class BeanImportService {
2026
3243
  * Identify file type
2027
3244
  * Upload a file to check if it can be processed by any registered importer. Does not perform actual import - useful for pre-validation. Uses user-specific importer configuration.
2028
3245
  * @param data The data for the request.
3246
+ * @param data.region Region code for tenant context
2029
3247
  * @param data.formData File to identify
2030
3248
  * @returns IdentifyResultDto File identification result
2031
3249
  * @throws ApiError
@@ -2036,6 +3254,9 @@ export class BeanImportService {
2036
3254
  return __request(OpenAPI, {
2037
3255
  method: 'POST',
2038
3256
  url: '/api/v1/{region}/bean/import/identify',
3257
+ path: {
3258
+ region: data.region
3259
+ },
2039
3260
  formData: data.formData,
2040
3261
  mediaType: 'multipart/form-data',
2041
3262
  errors: {
@@ -2044,6 +3265,32 @@ export class BeanImportService {
2044
3265
  });
2045
3266
  }
2046
3267
 
3268
+ /**
3269
+ * Import a Beancount file in community format
3270
+ * Upload a .beancount file to import. The system parses community-format paths, converts to internal format using category metadata, auto-creates accounts, and imports transactions with deduplication. Maximum file size: 50MB. Only 1 import per user at a time.
3271
+ * @param data The data for the request.
3272
+ * @param data.region Region code for tenant context
3273
+ * @param data.formData Beancount file to import
3274
+ * @returns unknown Beancount file imported successfully
3275
+ * @throws ApiError
3276
+ */
3277
+ public static fileImportControllerImportBeancount(
3278
+ data: FileImportControllerImportBeancountData
3279
+ ): CancelablePromise<FileImportControllerImportBeancountResponse> {
3280
+ return __request(OpenAPI, {
3281
+ method: 'POST',
3282
+ url: '/api/v1/{region}/bean/import/beancount',
3283
+ path: {
3284
+ region: data.region
3285
+ },
3286
+ formData: data.formData,
3287
+ mediaType: 'multipart/form-data',
3288
+ errors: {
3289
+ 400: 'Bad request - invalid file or no file uploaded'
3290
+ }
3291
+ });
3292
+ }
3293
+
2047
3294
  /**
2048
3295
  * Get importer configuration
2049
3296
  * Returns the current configuration for the specified importer. Creates default configuration if none exists.
@@ -2071,37 +3318,55 @@ export class BeanImportService {
2071
3318
  }
2072
3319
 
2073
3320
  /**
3321
+ * Update importer configuration
3322
+ * Updates the configuration for the specified importer. Partial updates are supported.
2074
3323
  * @param data The data for the request.
3324
+ * @param data.importerId Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
2075
3325
  * @param data.region Region code for tenant context
2076
- * @returns unknown
3326
+ * @param data.requestBody Partial configuration update. Only provided fields will be updated.
3327
+ * @returns ImporterConfigDto Configuration updated successfully
2077
3328
  * @throws ApiError
2078
3329
  */
2079
- public static importerConfigController(
2080
- data: ImporterConfigControllerData
2081
- ): CancelablePromise<ImporterConfigControllerResponse> {
3330
+ public static importerConfigControllerUpdateConfig(
3331
+ data: ImporterConfigControllerUpdateConfigData
3332
+ ): CancelablePromise<ImporterConfigControllerUpdateConfigResponse> {
2082
3333
  return __request(OpenAPI, {
2083
3334
  method: 'PUT',
2084
3335
  url: '/api/v1/{region}/bean/import/config/{importerId}',
2085
3336
  path: {
3337
+ importerId: data.importerId,
2086
3338
  region: data.region
3339
+ },
3340
+ body: data.requestBody,
3341
+ mediaType: 'application/json',
3342
+ errors: {
3343
+ 400: 'Invalid input - Validation failed',
3344
+ 404: 'Configuration not found'
2087
3345
  }
2088
3346
  });
2089
3347
  }
2090
3348
 
2091
3349
  /**
3350
+ * Reset configuration to default
3351
+ * Resets the configuration for the specified importer to default values. This operation overwrites all existing configuration.
2092
3352
  * @param data The data for the request.
3353
+ * @param data.importerId Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
2093
3354
  * @param data.region Region code for tenant context
2094
- * @returns unknown
3355
+ * @returns ImporterConfigDto Configuration reset successfully
2095
3356
  * @throws ApiError
2096
3357
  */
2097
- public static importerConfigController1(
2098
- data: ImporterConfigController1Data
2099
- ): CancelablePromise<ImporterConfigController1Response> {
3358
+ public static importerConfigControllerResetConfig(
3359
+ data: ImporterConfigControllerResetConfigData
3360
+ ): CancelablePromise<ImporterConfigControllerResetConfigResponse> {
2100
3361
  return __request(OpenAPI, {
2101
3362
  method: 'POST',
2102
3363
  url: '/api/v1/{region}/bean/import/config/{importerId}/reset',
2103
3364
  path: {
3365
+ importerId: data.importerId,
2104
3366
  region: data.region
3367
+ },
3368
+ errors: {
3369
+ 400: 'Invalid input - Unsupported importer'
2105
3370
  }
2106
3371
  });
2107
3372
  }
@@ -2133,7 +3398,7 @@ export class ProviderSyncService {
2133
3398
  *
2134
3399
  * @param data The data for the request.
2135
3400
  * @param data.providerName Provider name
2136
- * @param data.region Region code
3401
+ * @param data.region Region code for tenant context
2137
3402
  * @param data.requestBody
2138
3403
  * @returns ProviderSyncResponseDto Sync completed successfully
2139
3404
  * @throws ApiError
@@ -2161,13 +3426,20 @@ export class ProviderSyncService {
2161
3426
  /**
2162
3427
  * Get supported providers
2163
3428
  * Returns a list of all providers supported by the sync endpoint.
3429
+ * @param data The data for the request.
3430
+ * @param data.region Region code for tenant context
2164
3431
  * @returns SupportedProvidersResponseDto List of supported providers
2165
3432
  * @throws ApiError
2166
3433
  */
2167
- public static providerSyncControllerGetSupportedProviders(): CancelablePromise<ProviderSyncControllerGetSupportedProvidersResponse> {
3434
+ public static providerSyncControllerGetSupportedProviders(
3435
+ data: ProviderSyncControllerGetSupportedProvidersData
3436
+ ): CancelablePromise<ProviderSyncControllerGetSupportedProvidersResponse> {
2168
3437
  return __request(OpenAPI, {
2169
3438
  method: 'GET',
2170
3439
  url: '/api/v1/{region}/bean/import/provider/supported',
3440
+ path: {
3441
+ region: data.region
3442
+ },
2171
3443
  errors: {
2172
3444
  401: 'Missing or invalid authentication'
2173
3445
  }
@@ -2179,6 +3451,7 @@ export class ProviderSyncService {
2179
3451
  * Returns whether a specific provider is supported.
2180
3452
  * @param data The data for the request.
2181
3453
  * @param data.providerName Provider name to check
3454
+ * @param data.region Region code for tenant context
2182
3455
  * @returns unknown Provider support status
2183
3456
  * @throws ApiError
2184
3457
  */
@@ -2189,7 +3462,8 @@ export class ProviderSyncService {
2189
3462
  method: 'GET',
2190
3463
  url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
2191
3464
  path: {
2192
- providerName: data.providerName
3465
+ providerName: data.providerName,
3466
+ region: data.region
2193
3467
  },
2194
3468
  errors: {
2195
3469
  401: 'Missing or invalid authentication'
@@ -2198,10 +3472,106 @@ export class ProviderSyncService {
2198
3472
  }
2199
3473
  }
2200
3474
 
3475
+ export class ExternalAccountLinksService {
3476
+ /**
3477
+ * Create an external account → BeanAccount mapping (ADR-0113)
3478
+ * @param data The data for the request.
3479
+ * @param data.region Region code for tenant context
3480
+ * @param data.requestBody
3481
+ * @returns ExternalAccountLinkResponseDto Link created.
3482
+ * @throws ApiError
3483
+ */
3484
+ public static externalAccountLinkControllerCreate(
3485
+ data: ExternalAccountLinkControllerCreateData
3486
+ ): CancelablePromise<ExternalAccountLinkControllerCreateResponse> {
3487
+ return __request(OpenAPI, {
3488
+ method: 'POST',
3489
+ url: '/api/v1/{region}/bean/external-account-links',
3490
+ path: {
3491
+ region: data.region
3492
+ },
3493
+ body: data.requestBody,
3494
+ mediaType: 'application/json',
3495
+ errors: {
3496
+ 422: 'beanAccountId not owned, or an active link already exists.'
3497
+ }
3498
+ });
3499
+ }
3500
+
3501
+ /**
3502
+ * List the user's active external account links
3503
+ * @param data The data for the request.
3504
+ * @param data.provider
3505
+ * @param data.region Region code for tenant context
3506
+ * @returns ExternalAccountLinkListResponseDto Links retrieved.
3507
+ * @throws ApiError
3508
+ */
3509
+ public static externalAccountLinkControllerFindAll(
3510
+ data: ExternalAccountLinkControllerFindAllData
3511
+ ): CancelablePromise<ExternalAccountLinkControllerFindAllResponse> {
3512
+ return __request(OpenAPI, {
3513
+ method: 'GET',
3514
+ url: '/api/v1/{region}/bean/external-account-links',
3515
+ path: {
3516
+ region: data.region
3517
+ },
3518
+ query: {
3519
+ provider: data.provider
3520
+ }
3521
+ });
3522
+ }
3523
+
3524
+ /**
3525
+ * Get a single external account link
3526
+ * @param data The data for the request.
3527
+ * @param data.id
3528
+ * @param data.region Region code for tenant context
3529
+ * @returns ExternalAccountLinkResponseDto Link retrieved.
3530
+ * @throws ApiError
3531
+ */
3532
+ public static externalAccountLinkControllerFindOne(
3533
+ data: ExternalAccountLinkControllerFindOneData
3534
+ ): CancelablePromise<ExternalAccountLinkControllerFindOneResponse> {
3535
+ return __request(OpenAPI, {
3536
+ method: 'GET',
3537
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3538
+ path: {
3539
+ id: data.id,
3540
+ region: data.region
3541
+ },
3542
+ errors: {
3543
+ 422: 'Link not found or not owned by the user.'
3544
+ }
3545
+ });
3546
+ }
3547
+
3548
+ /**
3549
+ * Soft-delete (disconnect) an external account link
3550
+ * @param data The data for the request.
3551
+ * @param data.id
3552
+ * @param data.region Region code for tenant context
3553
+ * @returns void Link soft-deleted; historical transactions are unaffected.
3554
+ * @throws ApiError
3555
+ */
3556
+ public static externalAccountLinkControllerRemove(
3557
+ data: ExternalAccountLinkControllerRemoveData
3558
+ ): CancelablePromise<ExternalAccountLinkControllerRemoveResponse> {
3559
+ return __request(OpenAPI, {
3560
+ method: 'DELETE',
3561
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3562
+ path: {
3563
+ id: data.id,
3564
+ region: data.region
3565
+ }
3566
+ });
3567
+ }
3568
+ }
3569
+
2201
3570
  export class ImportTelemetryService {
2202
3571
  /**
2203
3572
  * Receive anonymous parser failure telemetry
2204
3573
  * @param data The data for the request.
3574
+ * @param data.region Region code for tenant context
2205
3575
  * @param data.requestBody
2206
3576
  * @returns unknown Telemetry report received
2207
3577
  * @throws ApiError
@@ -2212,6 +3582,34 @@ export class ImportTelemetryService {
2212
3582
  return __request(OpenAPI, {
2213
3583
  method: 'POST',
2214
3584
  url: '/api/v1/{region}/bean/import/parser-telemetry',
3585
+ path: {
3586
+ region: data.region
3587
+ },
3588
+ body: data.requestBody,
3589
+ mediaType: 'application/json',
3590
+ errors: {
3591
+ 401: 'Unauthorized'
3592
+ }
3593
+ });
3594
+ }
3595
+
3596
+ /**
3597
+ * Receive anonymous zero-hit coverage miss report
3598
+ * @param data The data for the request.
3599
+ * @param data.region Region code for tenant context
3600
+ * @param data.requestBody
3601
+ * @returns unknown Coverage miss report received
3602
+ * @throws ApiError
3603
+ */
3604
+ public static telemetryControllerReportCoverageMiss(
3605
+ data: TelemetryControllerReportCoverageMissData
3606
+ ): CancelablePromise<TelemetryControllerReportCoverageMissResponse> {
3607
+ return __request(OpenAPI, {
3608
+ method: 'POST',
3609
+ url: '/api/v1/{region}/bean/import/parser-coverage-miss',
3610
+ path: {
3611
+ region: data.region
3612
+ },
2215
3613
  body: data.requestBody,
2216
3614
  mediaType: 'application/json',
2217
3615
  errors: {
@@ -2219,6 +3617,29 @@ export class ImportTelemetryService {
2219
3617
  }
2220
3618
  });
2221
3619
  }
3620
+
3621
+ /**
3622
+ * Coverage metrics (uncovered format aggregation)
3623
+ * @param data The data for the request.
3624
+ * @param data.region Region code for tenant context
3625
+ * @param data.topN Top-N uncovered formats (default 10)
3626
+ * @returns unknown Coverage metrics
3627
+ * @throws ApiError
3628
+ */
3629
+ public static telemetryControllerGetCoverageMetrics(
3630
+ data: TelemetryControllerGetCoverageMetricsData
3631
+ ): CancelablePromise<TelemetryControllerGetCoverageMetricsResponse> {
3632
+ return __request(OpenAPI, {
3633
+ method: 'GET',
3634
+ url: '/api/v1/{region}/bean/import/parser-coverage-metrics',
3635
+ path: {
3636
+ region: data.region
3637
+ },
3638
+ query: {
3639
+ topN: data.topN
3640
+ }
3641
+ });
3642
+ }
2222
3643
  }
2223
3644
 
2224
3645
  export class BeanNlpService {
@@ -2226,6 +3647,7 @@ export class BeanNlpService {
2226
3647
  * Process natural language input
2227
3648
  * Parse natural language text (Chinese/English) describing a transaction. Supports multi-turn dialogue for collecting missing information. When confidence < 0.75, returns "confirm" action requiring user verification. User can reply with confirmation words (确认/yes/ok) or provide corrections. Examples: "yesterday Starbucks spent 35 yuan", "today lunch 28 yuan", "spent $50 at Walmart"
2228
3649
  * @param data The data for the request.
3650
+ * @param data.region Region code for tenant context
2229
3651
  * @param data.requestBody Natural language transaction input with optional session ID
2230
3652
  * @returns NlpResponseDto NLP processing result - either created transaction or asking for more info
2231
3653
  * @throws ApiError
@@ -2236,6 +3658,9 @@ export class BeanNlpService {
2236
3658
  return __request(OpenAPI, {
2237
3659
  method: 'POST',
2238
3660
  url: '/api/v1/{region}/bean/nlp/process',
3661
+ path: {
3662
+ region: data.region
3663
+ },
2239
3664
  body: data.requestBody,
2240
3665
  mediaType: 'application/json',
2241
3666
  errors: {
@@ -2249,16 +3674,20 @@ export class BeanNlpService {
2249
3674
  * Clear dialogue session
2250
3675
  * Clear the current NLP dialogue session. Use this to cancel an ongoing multi-turn dialogue.
2251
3676
  * @param data The data for the request.
3677
+ * @param data.region Region code for tenant context
2252
3678
  * @param data.sessionId Specific session ID to clear (defaults to user session)
2253
3679
  * @returns void Session cleared successfully
2254
3680
  * @throws ApiError
2255
3681
  */
2256
3682
  public static nlpControllerClearSession(
2257
- data: NlpControllerClearSessionData = {}
3683
+ data: NlpControllerClearSessionData
2258
3684
  ): CancelablePromise<NlpControllerClearSessionResponse> {
2259
3685
  return __request(OpenAPI, {
2260
3686
  method: 'DELETE',
2261
3687
  url: '/api/v1/{region}/bean/nlp/session',
3688
+ path: {
3689
+ region: data.region
3690
+ },
2262
3691
  query: {
2263
3692
  sessionId: data.sessionId
2264
3693
  },
@@ -2272,16 +3701,20 @@ export class BeanNlpService {
2272
3701
  * Get current session state
2273
3702
  * Get the current NLP dialogue session state. Useful for debugging and displaying session context in UI.
2274
3703
  * @param data The data for the request.
3704
+ * @param data.region Region code for tenant context
2275
3705
  * @param data.sessionId Specific session ID to get (defaults to user session)
2276
3706
  * @returns unknown Current session state (or null if no active session)
2277
3707
  * @throws ApiError
2278
3708
  */
2279
3709
  public static nlpControllerGetSession(
2280
- data: NlpControllerGetSessionData = {}
3710
+ data: NlpControllerGetSessionData
2281
3711
  ): CancelablePromise<NlpControllerGetSessionResponse> {
2282
3712
  return __request(OpenAPI, {
2283
3713
  method: 'GET',
2284
3714
  url: '/api/v1/{region}/bean/nlp/session',
3715
+ path: {
3716
+ region: data.region
3717
+ },
2285
3718
  query: {
2286
3719
  sessionId: data.sessionId
2287
3720
  },
@@ -2306,162 +3739,110 @@ export class BeanPlatformsService {
2306
3739
  }
2307
3740
 
2308
3741
  /**
2309
- * @returns unknown
2310
- * @throws ApiError
2311
- */
2312
- public static platformController(): CancelablePromise<PlatformControllerResponse> {
2313
- return __request(OpenAPI, {
2314
- method: 'POST',
2315
- url: '/api/v1/bean/platforms'
2316
- });
2317
- }
2318
-
2319
- /**
2320
- * Get platform list for current user
2321
- * @returns unknown List of platforms with user binding status
2322
- * @throws ApiError
2323
- */
2324
- public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
2325
- return __request(OpenAPI, {
2326
- method: 'GET',
2327
- url: '/api/v1/bean/platforms/list'
2328
- });
2329
- }
2330
-
2331
- /**
2332
- * @returns unknown
2333
- * @throws ApiError
2334
- */
2335
- public static platformController1(): CancelablePromise<PlatformController1Response> {
2336
- return __request(OpenAPI, {
2337
- method: 'PUT',
2338
- url: '/api/v1/bean/platforms/{id}'
2339
- });
2340
- }
2341
-
2342
- /**
2343
- * @returns void
2344
- * @throws ApiError
2345
- */
2346
- public static platformController2(): CancelablePromise<PlatformController2Response> {
2347
- return __request(OpenAPI, {
2348
- method: 'DELETE',
2349
- url: '/api/v1/bean/platforms/{id}'
2350
- });
2351
- }
2352
- }
2353
-
2354
- export class SymbolsService {
2355
- /**
2356
- * Search for symbols
2357
- * Search symbols by query with optional filters for asset class, area, and indices
3742
+ * Create a new platform
2358
3743
  * @param data The data for the request.
2359
- * @param data.includeIndices Include index symbols in results
2360
- * @param data.assetSubClass Asset sub-class filter
2361
- * @param data.assetClass Asset class filter
2362
- * @param data.area Geographic area filter (e.g., CN, US)
2363
- * @param data.query Search query string
2364
- * @returns unknown Symbols found successfully
3744
+ * @param data.requestBody
3745
+ * @returns unknown Platform created successfully
2365
3746
  * @throws ApiError
2366
3747
  */
2367
- public static symbolControllerLookupSymbol(
2368
- data: SymbolControllerLookupSymbolData = {}
2369
- ): CancelablePromise<SymbolControllerLookupSymbolResponse> {
3748
+ public static platformControllerCreate(
3749
+ data: PlatformControllerCreateData
3750
+ ): CancelablePromise<PlatformControllerCreateResponse> {
2370
3751
  return __request(OpenAPI, {
2371
- method: 'GET',
2372
- url: '/api/v1/market/symbols/lookup',
2373
- query: {
2374
- includeIndices: data.includeIndices,
2375
- assetSubClass: data.assetSubClass,
2376
- assetClass: data.assetClass,
2377
- area: data.area,
2378
- query: data.query
2379
- },
3752
+ method: 'POST',
3753
+ url: '/api/v1/bean/platforms',
3754
+ body: data.requestBody,
3755
+ mediaType: 'application/json',
2380
3756
  errors: {
2381
- 400: 'Invalid query parameters'
3757
+ 409: 'Platform already exists'
2382
3758
  }
2383
3759
  });
2384
3760
  }
2385
3761
 
2386
3762
  /**
2387
- * Get symbol data
2388
- * Retrieve detailed symbol information including optional historical data
3763
+ * Get platform list for current user
2389
3764
  * @param data The data for the request.
2390
- * @param data.dataSource Data source provider
2391
- * @param data.symbol Symbol identifier (e.g., ticker code)
2392
- * @param data.includeHistoricalData Include historical price data (0 or 1)
2393
- * @returns unknown Symbol data retrieved successfully
3765
+ * @param data.region Region code (ISO 3166-1 alpha-2) that biases within-type-bucket ordering (local-region platforms first). Case-insensitive — stored/compared UPPERCASE ("cn" == "CN").
3766
+ * @returns PlatformListItemDto List of platforms with user binding status
2394
3767
  * @throws ApiError
2395
3768
  */
2396
- public static symbolControllerGetSymbolData(
2397
- data: SymbolControllerGetSymbolDataData
2398
- ): CancelablePromise<SymbolControllerGetSymbolDataResponse> {
3769
+ public static platformControllerGetPlatformList(
3770
+ data: PlatformControllerGetPlatformListData = {}
3771
+ ): CancelablePromise<PlatformControllerGetPlatformListResponse> {
2399
3772
  return __request(OpenAPI, {
2400
3773
  method: 'GET',
2401
- url: '/api/v1/market/symbols/{dataSource}/{symbol}',
2402
- path: {
2403
- dataSource: data.dataSource,
2404
- symbol: data.symbol
2405
- },
3774
+ url: '/api/v1/bean/platforms/list',
2406
3775
  query: {
2407
- includeHistoricalData: data.includeHistoricalData
2408
- },
2409
- errors: {
2410
- 400: 'Invalid data source',
2411
- 404: 'Symbol not found'
3776
+ region: data.region
2412
3777
  }
2413
3778
  });
2414
3779
  }
2415
3780
 
2416
3781
  /**
2417
- * Gather symbol data for specific date
2418
- * Retrieve historical symbol data for a specific date
3782
+ * Match platforms by name or alias
2419
3783
  * @param data The data for the request.
2420
- * @param data.dataSource Data source provider
2421
- * @param data.dateString Date in ISO 8601 format (YYYY-MM-DD)
2422
- * @param data.symbol Symbol identifier (e.g., ticker code)
2423
- * @returns unknown Historical data retrieved successfully
3784
+ * @param data.q Search query — Chinese name, English name, or abbreviation
3785
+ * @param data.region Region code (ISO 3166-1 alpha-2) that biases within-tier ordering (local-region platforms first); also the intended categoryOverrides key. Case-insensitive — stored/compared UPPERCASE ("cn" == "CN").
3786
+ * @returns PlatformMatchResponseDto Matching platforms with overall match type and truncation flag
2424
3787
  * @throws ApiError
2425
3788
  */
2426
- public static symbolControllerGatherSymbolForDate(
2427
- data: SymbolControllerGatherSymbolForDateData
2428
- ): CancelablePromise<SymbolControllerGatherSymbolForDateResponse> {
3789
+ public static platformControllerMatchPlatforms(
3790
+ data: PlatformControllerMatchPlatformsData
3791
+ ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
2429
3792
  return __request(OpenAPI, {
2430
3793
  method: 'GET',
2431
- url: '/api/v1/market/symbols/{dataSource}/{symbol}/{dateString}',
2432
- path: {
2433
- dataSource: data.dataSource,
2434
- dateString: data.dateString,
2435
- symbol: data.symbol
2436
- },
2437
- errors: {
2438
- 400: 'Invalid date format',
2439
- 404: 'Symbol data not found for specified date'
3794
+ url: '/api/v1/bean/platforms/match',
3795
+ query: {
3796
+ q: data.q,
3797
+ region: data.region
2440
3798
  }
2441
3799
  });
2442
3800
  }
2443
3801
 
2444
3802
  /**
2445
- * @returns unknown
3803
+ * Update a platform
3804
+ * @param data The data for the request.
3805
+ * @param data.id Platform ID
3806
+ * @param data.requestBody
3807
+ * @returns unknown Platform updated successfully
2446
3808
  * @throws ApiError
2447
3809
  */
2448
- public static symbolController(): CancelablePromise<SymbolControllerResponse> {
3810
+ public static platformControllerUpdate(
3811
+ data: PlatformControllerUpdateData
3812
+ ): CancelablePromise<PlatformControllerUpdateResponse> {
2449
3813
  return __request(OpenAPI, {
2450
3814
  method: 'PUT',
2451
- url: '/api/v1/market/symbols/yahoo/batch-update'
3815
+ url: '/api/v1/bean/platforms/{id}',
3816
+ path: {
3817
+ id: data.id
3818
+ },
3819
+ body: data.requestBody,
3820
+ mediaType: 'application/json',
3821
+ errors: {
3822
+ 404: 'Platform not found'
3823
+ }
2452
3824
  });
2453
3825
  }
2454
- }
2455
3826
 
2456
- export class DefaultService {
2457
3827
  /**
2458
- * @returns unknown
3828
+ * Delete a platform
3829
+ * @param data The data for the request.
3830
+ * @param data.id Platform ID
3831
+ * @returns void Platform deleted successfully
2459
3832
  * @throws ApiError
2460
3833
  */
2461
- public static cacheControllerFlushCache(): CancelablePromise<CacheControllerFlushCacheResponse> {
3834
+ public static platformControllerDelete(
3835
+ data: PlatformControllerDeleteData
3836
+ ): CancelablePromise<PlatformControllerDeleteResponse> {
2462
3837
  return __request(OpenAPI, {
2463
- method: 'POST',
2464
- url: '/api/v1/cache/flush'
3838
+ method: 'DELETE',
3839
+ url: '/api/v1/bean/platforms/{id}',
3840
+ path: {
3841
+ id: data.id
3842
+ },
3843
+ errors: {
3844
+ 404: 'Platform not found'
3845
+ }
2465
3846
  });
2466
3847
  }
2467
3848
  }
@@ -2471,16 +3852,20 @@ export class DashboardService {
2471
3852
  * Get net worth overview
2472
3853
  * Returns total net worth with breakdown of assets and liabilities
2473
3854
  * @param data The data for the request.
3855
+ * @param data.region Region code for tenant context
2474
3856
  * @param data.date Date for balance calculation (ISO 8601 format)
2475
3857
  * @returns NetWorthResponseDto Net worth retrieved successfully
2476
3858
  * @throws ApiError
2477
3859
  */
2478
3860
  public static dashboardControllerGetNetWorth(
2479
- data: DashboardControllerGetNetWorthData = {}
3861
+ data: DashboardControllerGetNetWorthData
2480
3862
  ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
2481
3863
  return __request(OpenAPI, {
2482
3864
  method: 'GET',
2483
3865
  url: '/api/v1/{region}/dashboard/net-worth',
3866
+ path: {
3867
+ region: data.region
3868
+ },
2484
3869
  query: {
2485
3870
  date: data.date
2486
3871
  },
@@ -2494,20 +3879,26 @@ export class DashboardService {
2494
3879
  * Get accounts grouped by platform
2495
3880
  * Returns accounts with balances grouped by financial platform
2496
3881
  * @param data The data for the request.
3882
+ * @param data.region Region code for tenant context
2497
3883
  * @param data.groupBy Grouping strategy
2498
3884
  * @param data.date Date for balance calculation (ISO 8601 format)
3885
+ * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
2499
3886
  * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
2500
3887
  * @throws ApiError
2501
3888
  */
2502
3889
  public static dashboardControllerGetAccounts(
2503
- data: DashboardControllerGetAccountsData = {}
3890
+ data: DashboardControllerGetAccountsData
2504
3891
  ): CancelablePromise<DashboardControllerGetAccountsResponse> {
2505
3892
  return __request(OpenAPI, {
2506
3893
  method: 'GET',
2507
3894
  url: '/api/v1/{region}/dashboard/accounts',
3895
+ path: {
3896
+ region: data.region
3897
+ },
2508
3898
  query: {
2509
3899
  groupBy: data.groupBy,
2510
- date: data.date
3900
+ date: data.date,
3901
+ accountId: data.accountId
2511
3902
  },
2512
3903
  errors: {
2513
3904
  401: 'User not authenticated'
@@ -2520,6 +3911,7 @@ export class DashboardService {
2520
3911
  * Returns income, expenses, and savings for a monthly period
2521
3912
  * @param data The data for the request.
2522
3913
  * @param data.period Period in YYYY-MM format
3914
+ * @param data.region Region code for tenant context
2523
3915
  * @returns CashFlowResponseDto Cash flow retrieved successfully
2524
3916
  * @throws ApiError
2525
3917
  */
@@ -2529,6 +3921,9 @@ export class DashboardService {
2529
3921
  return __request(OpenAPI, {
2530
3922
  method: 'GET',
2531
3923
  url: '/api/v1/{region}/dashboard/cash-flow',
3924
+ path: {
3925
+ region: data.region
3926
+ },
2532
3927
  query: {
2533
3928
  period: data.period
2534
3929
  },
@@ -2538,126 +3933,88 @@ export class DashboardService {
2538
3933
  }
2539
3934
  });
2540
3935
  }
2541
- }
2542
3936
 
2543
- export class ReportingService {
2544
3937
  /**
2545
- * Get portfolio value trends
2546
- *
2547
- * Returns time series data of portfolio net worth.
2548
- *
2549
- * **Multi-currency Support:**
2550
- * - `series[].byCurrency` - Currency breakdown for each data point
2551
- * - `byCurrency` - Separate time series grouped by currency
2552
- * - `warnings` - Exchange rate warnings if conversion failed
2553
- *
2554
- * **Parameters:**
2555
- * - `period`: Time period (1m, 3m, 6m, 1y)
2556
- * - `granularity`: Data granularity (day, week, month)
2557
- *
3938
+ * Get expenses/income grouped by functional category
3939
+ * Returns amounts pre-aggregated by functional category (account-path Group segment) with server-side multi-currency conversion. flow=expense (default) aggregates ^Expenses: accounts; flow=income aggregates ^Income: accounts (issue #518)
2558
3940
  * @param data The data for the request.
2559
- * @param data.period Time period
2560
- * @param data.granularity Data granularity
2561
- * @returns PortfolioTrendsResponseDto Trends retrieved successfully
3941
+ * @param data.region Region code for tenant context
3942
+ * @param data.groupBy Grouping strategy
3943
+ * @param data.period Time window (1m = current calendar month)
3944
+ * @param data.flow Account root to aggregate (expense → ^Expenses:, income → ^Income:)
3945
+ * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
2562
3946
  * @throws ApiError
2563
3947
  */
2564
- public static reportingControllerGetPortfolioTrends(
2565
- data: ReportingControllerGetPortfolioTrendsData = {}
2566
- ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
3948
+ public static dashboardControllerGetExpenses(
3949
+ data: DashboardControllerGetExpensesData
3950
+ ): CancelablePromise<DashboardControllerGetExpensesResponse> {
2567
3951
  return __request(OpenAPI, {
2568
3952
  method: 'GET',
2569
- url: '/api/v1/{region}/reporting/portfolio/trends',
3953
+ url: '/api/v1/{region}/dashboard/expenses',
3954
+ path: {
3955
+ region: data.region
3956
+ },
2570
3957
  query: {
3958
+ groupBy: data.groupBy,
2571
3959
  period: data.period,
2572
- granularity: data.granularity
3960
+ flow: data.flow
2573
3961
  },
2574
3962
  errors: {
3963
+ 400: 'Invalid groupBy or period',
2575
3964
  401: 'User not authenticated'
2576
3965
  }
2577
3966
  });
2578
3967
  }
3968
+ }
2579
3969
 
3970
+ export class InvestmentService {
2580
3971
  /**
2581
- * Generate portfolio snapshot
2582
- *
2583
- * Manually generate a portfolio snapshot for a specific date.
2584
- *
2585
- * **Multi-currency Support:**
2586
- * - Fetches balances grouped by currency
2587
- * - Uses user's baseCurrency setting for conversion
2588
- * - Stores exchange rates and warnings
2589
- *
2590
- * **Use Cases:**
2591
- * - Testing snapshot generation
2592
- * - Force regeneration after data correction
2593
- * - Initial setup for new users
2594
- *
3972
+ * Get per-holding unrealized + realized P&L
3973
+ * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
2595
3974
  * @param data The data for the request.
2596
- * @param data.requestBody Optional date (defaults to today)
2597
- * @returns GenerateSnapshotResponse Snapshot generated successfully
3975
+ * @param data.region Region code for tenant context
3976
+ * @param data.asOf As-of date (ISO 8601), defaults to today
3977
+ * @param data.accountId Scope to a single account
3978
+ * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
3979
+ * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
2598
3980
  * @throws ApiError
2599
3981
  */
2600
- public static reportingControllerGenerateSnapshot(
2601
- data: ReportingControllerGenerateSnapshotData
2602
- ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
3982
+ public static holdingPnlControllerGetHoldingPnl(
3983
+ data: HoldingPnlControllerGetHoldingPnlData
3984
+ ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
2603
3985
  return __request(OpenAPI, {
2604
- method: 'POST',
2605
- url: '/api/v1/{region}/reporting/snapshots/generate',
2606
- body: data.requestBody,
2607
- mediaType: 'application/json',
3986
+ method: 'GET',
3987
+ url: '/api/v1/{region}/investment/holdings/pnl',
3988
+ path: {
3989
+ region: data.region
3990
+ },
3991
+ query: {
3992
+ asOf: data.asOf,
3993
+ accountId: data.accountId,
3994
+ method: data.method
3995
+ },
2608
3996
  errors: {
2609
- 400: 'Invalid date format',
3997
+ 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
2610
3998
  401: 'User not authenticated'
2611
3999
  }
2612
4000
  });
2613
4001
  }
2614
-
2615
- /**
2616
- * Backfill portfolio snapshots
2617
- *
2618
- * Generate snapshots for a date range (historical data backfill).
2619
- *
2620
- * **Multi-currency Support:**
2621
- * - Each snapshot includes multi-currency data
2622
- * - Uses exchange rates available at generation time
2623
- * - Warnings stored for missing exchange rates
2624
- *
2625
- * **Best Practices:**
2626
- * - Use for initial setup after account configuration
2627
- * - Run during low-traffic periods for large date ranges
2628
- * - Existing snapshots are skipped (not regenerated)
2629
- *
2630
- * @param data The data for the request.
2631
- * @param data.requestBody
2632
- * @returns BackfillSnapshotsResponse Backfill completed successfully
2633
- * @throws ApiError
2634
- */
2635
- public static reportingControllerBackfillSnapshots(
2636
- data: ReportingControllerBackfillSnapshotsData
2637
- ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
2638
- return __request(OpenAPI, {
2639
- method: 'POST',
2640
- url: '/api/v1/{region}/reporting/snapshots/backfill',
2641
- body: data.requestBody,
2642
- mediaType: 'application/json',
2643
- errors: {
2644
- 400: 'Invalid date format or range',
2645
- 401: 'User not authenticated',
2646
- 409: 'Backfill already in progress for this user'
2647
- }
2648
- });
2649
- }
2650
4002
  }
2651
4003
 
2652
4004
  export class ApiKeysService {
2653
4005
  /**
2654
- * @returns unknown
4006
+ * Create API key
4007
+ * Generates a new API key for the authenticated user
4008
+ * @returns unknown API key created successfully
2655
4009
  * @throws ApiError
2656
4010
  */
2657
- public static apiKeysController(): CancelablePromise<ApiKeysControllerResponse> {
4011
+ public static apiKeysControllerCreateApiKey(): CancelablePromise<ApiKeysControllerCreateApiKeyResponse> {
2658
4012
  return __request(OpenAPI, {
2659
4013
  method: 'POST',
2660
- url: '/api/v1/auth/api-keys'
4014
+ url: '/api/v1/auth/api-keys',
4015
+ errors: {
4016
+ 403: 'Insufficient permissions to create API key'
4017
+ }
2661
4018
  });
2662
4019
  }
2663
4020
  }
@@ -2667,7 +4024,7 @@ export class AuthService {
2667
4024
  * Anonymous login with access token
2668
4025
  * @param data The data for the request.
2669
4026
  * @param data.requestBody
2670
- * @returns unknown Login successful
4027
+ * @returns AnonymousLoginResponseDto Login successful
2671
4028
  * @throws ApiError
2672
4029
  */
2673
4030
  public static authControllerAccessTokenLogin(
@@ -2685,6 +4042,19 @@ export class AuthService {
2685
4042
  }
2686
4043
  }
2687
4044
 
4045
+ export class DefaultService {
4046
+ /**
4047
+ * @returns unknown
4048
+ * @throws ApiError
4049
+ */
4050
+ public static cacheControllerFlushCache(): CancelablePromise<CacheControllerFlushCacheResponse> {
4051
+ return __request(OpenAPI, {
4052
+ method: 'POST',
4053
+ url: '/api/v1/cache/flush'
4054
+ });
4055
+ }
4056
+ }
4057
+
2688
4058
  export class ExchangeRateService {
2689
4059
  /**
2690
4060
  * Get exchange rate for currency pair
@@ -2743,6 +4113,21 @@ export class HealthService {
2743
4113
  });
2744
4114
  }
2745
4115
 
4116
+ /**
4117
+ * Check OpenBB schema status
4118
+ * @returns unknown OpenBB status
4119
+ * @throws ApiError
4120
+ */
4121
+ public static healthControllerCheckOpenBb(): CancelablePromise<HealthControllerCheckOpenBbResponse> {
4122
+ return __request(OpenAPI, {
4123
+ method: 'GET',
4124
+ url: '/api/v1/health/openbb',
4125
+ errors: {
4126
+ 503: 'OpenBB unavailable'
4127
+ }
4128
+ });
4129
+ }
4130
+
2746
4131
  /**
2747
4132
  * Check Redis connection health
2748
4133
  * @returns unknown Redis is healthy
@@ -2811,69 +4196,6 @@ export class HealthService {
2811
4196
  }
2812
4197
  });
2813
4198
  }
2814
-
2815
- /**
2816
- * Check health of a specific data enhancer
2817
- * @param data The data for the request.
2818
- * @param data.name Data enhancer name
2819
- * @returns unknown Data enhancer is healthy
2820
- * @throws ApiError
2821
- */
2822
- public static healthControllerGetHealthOfDataEnhancer(
2823
- data: HealthControllerGetHealthOfDataEnhancerData
2824
- ): CancelablePromise<HealthControllerGetHealthOfDataEnhancerResponse> {
2825
- return __request(OpenAPI, {
2826
- method: 'GET',
2827
- url: '/api/v1/health/data-enhancer/{name}',
2828
- path: {
2829
- name: data.name
2830
- },
2831
- errors: {
2832
- 401: 'Unauthorized',
2833
- 503: 'Data enhancer unavailable'
2834
- }
2835
- });
2836
- }
2837
-
2838
- /**
2839
- * Check health of all data providers
2840
- * @returns unknown Data providers health status
2841
- * @throws ApiError
2842
- */
2843
- public static healthControllerCheckDataProviders(): CancelablePromise<HealthControllerCheckDataProvidersResponse> {
2844
- return __request(OpenAPI, {
2845
- method: 'GET',
2846
- url: '/api/v1/health/data-providers',
2847
- errors: {
2848
- 401: 'Unauthorized',
2849
- 503: 'Data providers check failed'
2850
- }
2851
- });
2852
- }
2853
-
2854
- /**
2855
- * Check health of a specific data provider
2856
- * @param data The data for the request.
2857
- * @param data.dataSource Data source identifier
2858
- * @returns unknown Data provider is healthy
2859
- * @throws ApiError
2860
- */
2861
- public static healthControllerGetHealthOfDataProvider(
2862
- data: HealthControllerGetHealthOfDataProviderData
2863
- ): CancelablePromise<HealthControllerGetHealthOfDataProviderResponse> {
2864
- return __request(OpenAPI, {
2865
- method: 'GET',
2866
- url: '/api/v1/health/data-provider/{dataSource}',
2867
- path: {
2868
- dataSource: data.dataSource
2869
- },
2870
- errors: {
2871
- 400: 'Invalid data source',
2872
- 401: 'Unauthorized',
2873
- 503: 'Data provider unavailable'
2874
- }
2875
- });
2876
- }
2877
4199
  }
2878
4200
 
2879
4201
  export class InfoService {
@@ -2890,92 +4212,52 @@ export class InfoService {
2890
4212
  }
2891
4213
  }
2892
4214
 
2893
- export class LogosService {
2894
- /**
2895
- * Get asset logo by data source and symbol
2896
- * @param data The data for the request.
2897
- * @param data.dataSource Data source identifier (e.g., YAHOO, COINGECKO)
2898
- * @param data.symbol Asset symbol (e.g., AAPL, BTC)
2899
- * @returns unknown Logo image stream (favicon)
2900
- * @throws ApiError
2901
- */
2902
- public static logoControllerGetLogoByDataSourceAndSymbol(
2903
- data: LogoControllerGetLogoByDataSourceAndSymbolData
2904
- ): CancelablePromise<LogoControllerGetLogoByDataSourceAndSymbolResponse> {
2905
- return __request(OpenAPI, {
2906
- method: 'GET',
2907
- url: '/api/v1/market/logos/{dataSource}/{symbol}',
2908
- path: {
2909
- dataSource: data.dataSource,
2910
- symbol: data.symbol
2911
- },
2912
- errors: {
2913
- 401: 'Unauthorized',
2914
- 404: 'Logo not found for the specified asset',
2915
- 503: 'Service unavailable'
2916
- }
2917
- });
2918
- }
2919
-
4215
+ export class MarketDataService {
2920
4216
  /**
2921
- * Get website favicon by URL
4217
+ * Search market symbols by name or code
4218
+ * Ranked search over the openbb catalog. Empty `q` returns [].
2922
4219
  * @param data The data for the request.
2923
- * @param data.url Website URL to fetch favicon from
2924
- * @returns unknown Logo image stream (favicon)
4220
+ * @param data.q Search term — matched against symbol and instrument name. Empty string returns [].
4221
+ * @param data.limit Maximum number of results (clamped 1..50)
4222
+ * @param data.exchange Filter by exchange code (e.g. US, HK, SS, SZ)
4223
+ * @param data.assetType Filter by OpenBB asset_type (e.g. stock, etf)
4224
+ * @returns SymbolSearchResultDto Ranked search results
2925
4225
  * @throws ApiError
2926
4226
  */
2927
- public static logoControllerGetLogoByUrl(
2928
- data: LogoControllerGetLogoByUrlData
2929
- ): CancelablePromise<LogoControllerGetLogoByUrlResponse> {
4227
+ public static symbolControllerSearch(
4228
+ data: SymbolControllerSearchData
4229
+ ): CancelablePromise<SymbolControllerSearchResponse> {
2930
4230
  return __request(OpenAPI, {
2931
4231
  method: 'GET',
2932
- url: '/api/v1/market/logos',
4232
+ url: '/api/v1/market/symbols/search',
2933
4233
  query: {
2934
- url: data.url
2935
- },
2936
- errors: {
2937
- 401: 'Unauthorized',
2938
- 503: 'Service unavailable'
4234
+ q: data.q,
4235
+ limit: data.limit,
4236
+ exchange: data.exchange,
4237
+ assetType: data.assetType
2939
4238
  }
2940
4239
  });
2941
4240
  }
2942
- }
2943
4241
 
2944
- export class MarketDataService {
2945
4242
  /**
2946
- * Get market data by symbol
2947
- * Retrieves market data and asset profile for a given symbol and data source
4243
+ * Get a market symbol quote
2948
4244
  * @param data The data for the request.
2949
- * @param data.dataSource Data source provider
2950
- * @param data.symbol Symbol code
2951
- * @returns unknown Market data retrieved successfully
4245
+ * @param data.symbol
4246
+ * @returns SymbolQuoteDto Symbol quote
2952
4247
  * @throws ApiError
2953
4248
  */
2954
- public static marketDataControllerGetMarketDataBySymbol(
2955
- data: MarketDataControllerGetMarketDataBySymbolData
2956
- ): CancelablePromise<MarketDataControllerGetMarketDataBySymbolResponse> {
4249
+ public static symbolControllerGetQuote(
4250
+ data: SymbolControllerGetQuoteData
4251
+ ): CancelablePromise<SymbolControllerGetQuoteResponse> {
2957
4252
  return __request(OpenAPI, {
2958
4253
  method: 'GET',
2959
- url: '/api/v1/market-data/{dataSource}/{symbol}',
4254
+ url: '/api/v1/market/symbols/{symbol}/quote',
2960
4255
  path: {
2961
- dataSource: data.dataSource,
2962
4256
  symbol: data.symbol
2963
4257
  },
2964
4258
  errors: {
2965
- 403: 'Insufficient permissions to read market data',
2966
- 404: 'Market data not found'
4259
+ 404: 'Symbol not found in the openbb catalog'
2967
4260
  }
2968
4261
  });
2969
4262
  }
2970
-
2971
- /**
2972
- * @returns unknown
2973
- * @throws ApiError
2974
- */
2975
- public static marketDataController(): CancelablePromise<MarketDataControllerResponse> {
2976
- return __request(OpenAPI, {
2977
- method: 'POST',
2978
- url: '/api/v1/market-data/{dataSource}/{symbol}'
2979
- });
2980
- }
2981
4263
  }