@firela/api-types 0.0.0-canary.285599dd → 0.0.0-canary.2b1dadc1

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,6 +17,8 @@ import type {
17
17
  AccountControllerCloseResponse,
18
18
  AccountControllerReopenData,
19
19
  AccountControllerReopenResponse,
20
+ AccountControllerAddOpeningBalanceData,
21
+ AccountControllerAddOpeningBalanceResponse,
20
22
  AccountStandardsControllerGetTemplatesData,
21
23
  AccountStandardsControllerGetTemplatesResponse,
22
24
  AccountStandardsControllerGetTemplateMetadataData,
@@ -97,6 +99,48 @@ import type {
97
99
  CommodityControllerGetOrCreateResponse,
98
100
  CommodityControllerBulkCreateData,
99
101
  CommodityControllerBulkCreateResponse,
102
+ ReportingControllerGetPortfolioTrendsData,
103
+ ReportingControllerGetPortfolioTrendsResponse,
104
+ ReportingControllerGetCashFlowTrendsData,
105
+ ReportingControllerGetCashFlowTrendsResponse,
106
+ ReportingControllerGenerateSnapshotData,
107
+ ReportingControllerGenerateSnapshotResponse,
108
+ ReportingControllerBackfillSnapshotsData,
109
+ ReportingControllerBackfillSnapshotsResponse,
110
+ PriceControllerCreateData,
111
+ PriceControllerCreateResponse,
112
+ PriceControllerFindAllData,
113
+ PriceControllerFindAllResponse,
114
+ PriceControllerFindOneData,
115
+ PriceControllerFindOneResponse,
116
+ PriceControllerUpdateData,
117
+ PriceControllerUpdateResponse,
118
+ PriceControllerDeleteData,
119
+ PriceControllerDeleteResponse,
120
+ PriceControllerBulkCreateData,
121
+ PriceControllerBulkCreateResponse,
122
+ UserControllerDeleteOwnUserData,
123
+ UserControllerDeleteOwnUserResponse,
124
+ UserControllerGetUserData,
125
+ UserControllerGetUserResponse,
126
+ UserControllerSignupUserData,
127
+ UserControllerSignupUserResponse,
128
+ UserControllerDeleteUserData,
129
+ UserControllerDeleteUserResponse,
130
+ UserControllerGetUserInfoData,
131
+ UserControllerGetUserInfoResponse,
132
+ UserControllerUpdateUserSettingData,
133
+ UserControllerUpdateUserSettingResponse,
134
+ UserControllerGetAllUserSettingsByPageData,
135
+ UserControllerGetAllUserSettingsByPageResponse,
136
+ UserControllerGetAssetLiabilitySummaryResponse,
137
+ PropertyControllerGetAllResponse,
138
+ PropertyControllerGetByKeyData,
139
+ PropertyControllerGetByKeyResponse,
140
+ PropertyControllerUpdateData,
141
+ PropertyControllerUpdateResponse,
142
+ PropertyControllerDeleteData,
143
+ PropertyControllerDeleteResponse,
100
144
  RecurringRuleControllerCreateData,
101
145
  RecurringRuleControllerCreateResponse,
102
146
  RecurringRuleControllerFindAllData,
@@ -149,28 +193,8 @@ import type {
149
193
  TransactionRuleControllerDeleteResponse,
150
194
  TransactionRuleControllerTestData,
151
195
  TransactionRuleControllerTestResponse,
152
- UserControllerDeleteOwnUserData,
153
- UserControllerDeleteOwnUserResponse,
154
- UserControllerGetUserData,
155
- UserControllerGetUserResponse,
156
- UserControllerSignupUserData,
157
- UserControllerSignupUserResponse,
158
- UserControllerDeleteUserData,
159
- UserControllerDeleteUserResponse,
160
- UserControllerGetUserInfoData,
161
- UserControllerGetUserInfoResponse,
162
- UserControllerUpdateUserSettingData,
163
- UserControllerUpdateUserSettingResponse,
164
- UserControllerGetAllUserSettingsByPageData,
165
- UserControllerGetAllUserSettingsByPageResponse,
166
- UserControllerGetAssetLiabilitySummaryResponse,
167
- PropertyControllerGetAllResponse,
168
- PropertyControllerGetByKeyData,
169
- PropertyControllerGetByKeyResponse,
170
- PropertyControllerUpdateData,
171
- PropertyControllerUpdateResponse,
172
- PropertyControllerDeleteData,
173
- PropertyControllerDeleteResponse,
196
+ CategoryCatalogControllerListData,
197
+ CategoryCatalogControllerListResponse,
174
198
  EventControllerCreateData,
175
199
  EventControllerCreateResponse,
176
200
  EventControllerFindAllData,
@@ -183,6 +207,16 @@ import type {
183
207
  EventControllerDeleteResponse,
184
208
  EventControllerGetSliceData,
185
209
  EventControllerGetSliceResponse,
210
+ OnboardingControllerBootstrapData,
211
+ OnboardingControllerBootstrapResponse,
212
+ ReconciliationControllerComputeData,
213
+ ReconciliationControllerComputeResponse,
214
+ ReconciliationControllerAssertData,
215
+ ReconciliationControllerAssertResponse,
216
+ ReconciliationControllerPadData,
217
+ ReconciliationControllerPadResponse,
218
+ ReconciliationControllerHistoryData,
219
+ ReconciliationControllerHistoryResponse,
186
220
  ExportControllerExportBeancountResponse,
187
221
  FileImportControllerImportFileData,
188
222
  FileImportControllerImportFileResponse,
@@ -196,22 +230,20 @@ import type {
196
230
  ImporterConfigControllerUpdateConfigResponse,
197
231
  ImporterConfigControllerResetConfigData,
198
232
  ImporterConfigControllerResetConfigResponse,
199
- PlatformControllerFindAllResponse,
200
- PlatformControllerCreateData,
201
- PlatformControllerCreateResponse,
202
- PlatformControllerGetPlatformListResponse,
203
- PlatformControllerMatchPlatformsData,
204
- PlatformControllerMatchPlatformsResponse,
205
- PlatformControllerUpdateData,
206
- PlatformControllerUpdateResponse,
207
- PlatformControllerDeleteData,
208
- PlatformControllerDeleteResponse,
209
233
  ProviderSyncControllerSyncData,
210
234
  ProviderSyncControllerSyncResponse,
211
235
  ProviderSyncControllerGetSupportedProvidersData,
212
236
  ProviderSyncControllerGetSupportedProvidersResponse,
213
237
  ProviderSyncControllerIsProviderSupportedData,
214
238
  ProviderSyncControllerIsProviderSupportedResponse,
239
+ ExternalAccountLinkControllerCreateData,
240
+ ExternalAccountLinkControllerCreateResponse,
241
+ ExternalAccountLinkControllerFindAllData,
242
+ ExternalAccountLinkControllerFindAllResponse,
243
+ ExternalAccountLinkControllerFindOneData,
244
+ ExternalAccountLinkControllerFindOneResponse,
245
+ ExternalAccountLinkControllerRemoveData,
246
+ ExternalAccountLinkControllerRemoveResponse,
215
247
  TelemetryControllerReportTelemetryData,
216
248
  TelemetryControllerReportTelemetryResponse,
217
249
  TelemetryControllerReportCoverageMissData,
@@ -224,6 +256,19 @@ import type {
224
256
  NlpControllerClearSessionResponse,
225
257
  NlpControllerGetSessionData,
226
258
  NlpControllerGetSessionResponse,
259
+ PlatformControllerFindAllResponse,
260
+ PlatformControllerCreateData,
261
+ PlatformControllerCreateResponse,
262
+ PlatformControllerGetPlatformListData,
263
+ PlatformControllerGetPlatformListResponse,
264
+ PlatformControllerMatchPlatformsData,
265
+ PlatformControllerMatchPlatformsResponse,
266
+ PlatformControllerGetPlatformStandardsData,
267
+ PlatformControllerGetPlatformStandardsResponse,
268
+ PlatformControllerUpdateData,
269
+ PlatformControllerUpdateResponse,
270
+ PlatformControllerDeleteData,
271
+ PlatformControllerDeleteResponse,
227
272
  DashboardControllerGetNetWorthData,
228
273
  DashboardControllerGetNetWorthResponse,
229
274
  DashboardControllerGetAccountsData,
@@ -234,29 +279,11 @@ import type {
234
279
  DashboardControllerGetExpensesResponse,
235
280
  HoldingPnlControllerGetHoldingPnlData,
236
281
  HoldingPnlControllerGetHoldingPnlResponse,
237
- PriceControllerCreateData,
238
- PriceControllerCreateResponse,
239
- PriceControllerFindAllData,
240
- PriceControllerFindAllResponse,
241
- PriceControllerFindOneData,
242
- PriceControllerFindOneResponse,
243
- PriceControllerUpdateData,
244
- PriceControllerUpdateResponse,
245
- PriceControllerDeleteData,
246
- PriceControllerDeleteResponse,
247
- PriceControllerBulkCreateData,
248
- PriceControllerBulkCreateResponse,
249
- ReportingControllerGetPortfolioTrendsData,
250
- ReportingControllerGetPortfolioTrendsResponse,
251
- ReportingControllerGetCashFlowTrendsData,
252
- ReportingControllerGetCashFlowTrendsResponse,
253
- ReportingControllerGenerateSnapshotData,
254
- ReportingControllerGenerateSnapshotResponse,
255
- ReportingControllerBackfillSnapshotsData,
256
- ReportingControllerBackfillSnapshotsResponse,
257
282
  ApiKeysControllerCreateApiKeyResponse,
258
283
  AuthControllerAccessTokenLoginData,
259
284
  AuthControllerAccessTokenLoginResponse,
285
+ ParserContributionControllerCreateData,
286
+ ParserContributionControllerCreateResponse,
260
287
  CacheControllerFlushCacheResponse,
261
288
  ExchangeRateControllerGetExchangeRateData,
262
289
  ExchangeRateControllerGetExchangeRateResponse,
@@ -268,7 +295,11 @@ import type {
268
295
  HealthControllerResetCircuitBreakerData,
269
296
  HealthControllerResetCircuitBreakerResponse,
270
297
  HealthControllerGetMetricsResponse,
271
- InfoControllerGetInfoResponse
298
+ InfoControllerGetInfoResponse,
299
+ SymbolControllerSearchData,
300
+ SymbolControllerSearchResponse,
301
+ SymbolControllerGetQuoteData,
302
+ SymbolControllerGetQuoteResponse
272
303
  } from './types.gen';
273
304
 
274
305
  export class BeanAccountsService {
@@ -306,7 +337,7 @@ export class BeanAccountsService {
306
337
  * @param data.type Filter by account type
307
338
  * @param data.status Filter by status
308
339
  * @param data.isCustom Filter by custom (user-created) accounts only
309
- * @param data.search Search term for path or i18nKey
340
+ * @param data.search Search term matched against account path and user-set display name (case-insensitive)
310
341
  * @param data.limit Maximum number of results
311
342
  * @param data.offset Number of results to skip
312
343
  * @returns AccountListResponseDto Accounts retrieved successfully
@@ -387,7 +418,7 @@ export class BeanAccountsService {
387
418
 
388
419
  /**
389
420
  * Delete account
390
- * Deletes an account (only if no transactions)
421
+ * Deletes an account (only if no active transactions; voided/superseded residual postings are cleaned up)
391
422
  * @param data The data for the request.
392
423
  * @param data.id Account UUID
393
424
  * @param data.region Region code for tenant context
@@ -406,7 +437,7 @@ export class BeanAccountsService {
406
437
  },
407
438
  errors: {
408
439
  404: 'Account not found',
409
- 409: 'Account has transactions and cannot be deleted'
440
+ 409: 'Account has active transactions and cannot be deleted'
410
441
  }
411
442
  });
412
443
  }
@@ -468,16 +499,45 @@ export class BeanAccountsService {
468
499
  }
469
500
  });
470
501
  }
502
+
503
+ /**
504
+ * Post an opening-balance transaction
505
+ * 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.
506
+ * @param data The data for the request.
507
+ * @param data.id Account UUID
508
+ * @param data.region Region code for tenant context
509
+ * @param data.requestBody
510
+ * @returns OpeningBalanceResultDto Opening-balance transaction created
511
+ * @throws ApiError
512
+ */
513
+ public static accountControllerAddOpeningBalance(
514
+ data: AccountControllerAddOpeningBalanceData
515
+ ): CancelablePromise<AccountControllerAddOpeningBalanceResponse> {
516
+ return __request(OpenAPI, {
517
+ method: 'POST',
518
+ url: '/api/v1/{region}/bean/accounts/{id}/opening-balance',
519
+ path: {
520
+ id: data.id,
521
+ region: data.region
522
+ },
523
+ body: data.requestBody,
524
+ mediaType: 'application/json',
525
+ errors: {
526
+ 404: 'Account not found',
527
+ 409: 'An opening balance already exists for this account'
528
+ }
529
+ });
530
+ }
471
531
  }
472
532
 
473
533
  export class BeanAccountStandardsService {
474
534
  /**
475
535
  * Get account templates
476
- * Returns predefined account templates for a region. Supports filtering by account type and search term.
536
+ * Returns predefined account templates for a region. Supports filtering by account type and search term. Not-yet-open region codes return the universal-only catalog (#759).
477
537
  * @param data The data for the request.
478
- * @param data.region Region code (cn, us, de)
538
+ * @param data.region Region code (any ISO alpha-2; not-yet-open codes return the universal-only catalog)
479
539
  * @param data.type Filter by account type
480
- * @param data.search Search term for path or description
540
+ * @param data.search Search term for path, description, aliases, or localized display name
481
541
  * @returns AccountStandardListResponseDto Account templates retrieved successfully
482
542
  * @throws ApiError
483
543
  */
@@ -499,9 +559,9 @@ export class BeanAccountStandardsService {
499
559
 
500
560
  /**
501
561
  * Get template metadata for an account path
502
- * Returns extendable status and root type for a template path.
562
+ * Returns root type for a template path.
503
563
  * @param data The data for the request.
504
- * @param data.region Region code for tenant context
564
+ * @param data.region Region code for tenant context. Not-yet-open codes degrade to the universal-only catalog (#759)
505
565
  * @param data.path Account path to check
506
566
  * @returns TemplateMetadataResponseDto Template metadata retrieved successfully
507
567
  * @throws ApiError
@@ -523,9 +583,9 @@ export class BeanAccountStandardsService {
523
583
 
524
584
  /**
525
585
  * Get available regions with hierarchy
526
- * Returns supported regions with inheritance metadata
586
+ * Returns the full region catalog (every ISO 3166-1 entry) with an 'open' flag and inheritance metadata (#759)
527
587
  * @param data The data for the request.
528
- * @param data.region Region code for tenant context
588
+ * @param data.region Region code for tenant context. Not-yet-open codes degrade to the universal-only catalog (#759)
529
589
  * @returns RegionsMetadataResponseDto Regions metadata retrieved successfully
530
590
  * @throws ApiError
531
591
  */
@@ -582,9 +642,11 @@ export class BeanTransactionsService {
582
642
  * @param data.offset Number of items to skip (default: 0)
583
643
  * @param data.dateFrom Filter by start date (inclusive), format: YYYY-MM-DD
584
644
  * @param data.dateTo Filter by end date (inclusive), format: YYYY-MM-DD
585
- * @param data.status Filter by transaction status
645
+ * @param data.status Filter by transaction status: single value, comma-separated multi-value (e.g. VOIDED,SUPERSEDED), or ALL to include audit rows. Defaults to ACTIVE-only (ADR-0128; previously unfiltered — breaking change).
586
646
  * @param data.search Search in narration and payee fields (max 200 chars)
587
647
  * @param data.accountId Filter by account ID (transactions with postings to this account)
648
+ * @param data.category Filter by ADR-0075 functional category (Group segment); matches any posting to an account whose derived Group segment equals this value. Must be accompanied by flow (ADR-0126).
649
+ * @param data.flow Required when category is present (400 otherwise) and vice versa (ADR-0126). Restricts the category account set to the flow root (income → Income:, expense → Expenses:) and drives the per-leg sign normalization of row viewpointAmount and the summary. OpenAPI cannot express conditional requiredness — the pairing is enforced at runtime.
588
650
  * @returns TransactionListResponseDto Transaction list
589
651
  * @throws ApiError
590
652
  */
@@ -604,7 +666,9 @@ export class BeanTransactionsService {
604
666
  dateTo: data.dateTo,
605
667
  status: data.status,
606
668
  search: data.search,
607
- accountId: data.accountId
669
+ accountId: data.accountId,
670
+ category: data.category,
671
+ flow: data.flow
608
672
  },
609
673
  errors: {
610
674
  400: 'Validation failed',
@@ -792,7 +856,7 @@ export class BeanBalancesService {
792
856
  * Query account balance
793
857
  * Calculate account balance at a specific date for a single currency
794
858
  * @param data The data for the request.
795
- * @param data.account Account name (e.g., "Assets:Bank:Checking")
859
+ * @param data.account Account name (e.g., "Assets:Checking")
796
860
  * @param data.region Region code for tenant context
797
861
  * @param data.date Date to calculate balance at (ISO 8601 format)
798
862
  * @param data.currency Currency to query (e.g., "USD", "CNY")
@@ -1317,7 +1381,7 @@ export class AdminPayeeProfilesService {
1317
1381
  * Removes verification status by setting verifiedAt to null.
1318
1382
  * @param data The data for the request.
1319
1383
  * @param data.id Payee profile ID (UUID)
1320
- * @returns PayeeProfileResponseDto Payee profile unverified successfully
1384
+ * @returns void Payee profile unverified successfully
1321
1385
  * @throws ApiError
1322
1386
  */
1323
1387
  public static payeeProfileAdminControllerUnverify(
@@ -1513,96 +1577,675 @@ export class BeanCommoditiesService {
1513
1577
  }
1514
1578
  }
1515
1579
 
1516
- export class RecurringRulesService {
1580
+ export class ReportingService {
1517
1581
  /**
1518
- * Create a new recurring rule
1519
- * Creates a new recurring transaction rule for the authenticated user
1582
+ * Get portfolio value trends
1583
+ *
1584
+ * Returns time series data of portfolio net worth.
1585
+ *
1586
+ * **Multi-currency Support:**
1587
+ * - `series[].byCurrency` - Currency breakdown for each data point
1588
+ * - `byCurrency` - Separate time series grouped by currency
1589
+ * - `warnings` - Exchange rate warnings if conversion failed
1590
+ *
1591
+ * **Parameters:**
1592
+ * - `period`: Time period (1m, 3m, 6m, 1y)
1593
+ * - `granularity`: Data granularity (day, week, month)
1594
+ *
1520
1595
  * @param data The data for the request.
1521
1596
  * @param data.region Region code for tenant context
1522
- * @param data.requestBody
1523
- * @returns RecurringRuleResponseDto Rule created successfully
1597
+ * @param data.period Time period
1598
+ * @param data.granularity Data granularity
1599
+ * @returns PortfolioTrendsResponseDto Trends retrieved successfully
1524
1600
  * @throws ApiError
1525
1601
  */
1526
- public static recurringRuleControllerCreate(
1527
- data: RecurringRuleControllerCreateData
1528
- ): CancelablePromise<RecurringRuleControllerCreateResponse> {
1602
+ public static reportingControllerGetPortfolioTrends(
1603
+ data: ReportingControllerGetPortfolioTrendsData
1604
+ ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
1529
1605
  return __request(OpenAPI, {
1530
- method: 'POST',
1531
- url: '/api/v1/{region}/bean/recurring-rules',
1606
+ method: 'GET',
1607
+ url: '/api/v1/{region}/reporting/portfolio/trends',
1532
1608
  path: {
1533
1609
  region: data.region
1534
1610
  },
1535
- body: data.requestBody,
1536
- mediaType: 'application/json',
1611
+ query: {
1612
+ period: data.period,
1613
+ granularity: data.granularity
1614
+ },
1537
1615
  errors: {
1538
- 400: 'Invalid input data (e.g., autoCreate without accounts)',
1539
- 409: 'Rule with same name already exists'
1616
+ 401: 'User not authenticated'
1540
1617
  }
1541
1618
  });
1542
1619
  }
1543
1620
 
1544
1621
  /**
1545
- * List recurring rules
1546
- * Returns all recurring rules for the authenticated user with optional filtering
1622
+ * Get cash-flow trends
1623
+ *
1624
+ * Monthly income / expense / netSavings over a fixed N-month window
1625
+ * (current month + N−1 prior). Missing months are zero-filled (flow metric).
1626
+ *
1627
+ * **Parameters:**
1628
+ * - `period`: 1m | 3m | 6m | 1y (default 6m)
1629
+ * - `granularity`: accepted for API symmetry; v1 returns month buckets
1630
+ *
1547
1631
  * @param data The data for the request.
1548
1632
  * @param data.region Region code for tenant context
1549
- * @param data.isActive Filter by active status
1550
- * @param data.frequency Filter by frequency (WEEKLY, MONTHLY, etc.)
1551
- * @param data.hasAutoCreate Filter by autoCreate enabled
1552
- * @returns RecurringRuleResponseDto Rules retrieved successfully
1633
+ * @param data.period Time period
1634
+ * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
1635
+ * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
1553
1636
  * @throws ApiError
1554
1637
  */
1555
- public static recurringRuleControllerFindAll(
1556
- data: RecurringRuleControllerFindAllData
1557
- ): CancelablePromise<RecurringRuleControllerFindAllResponse> {
1638
+ public static reportingControllerGetCashFlowTrends(
1639
+ data: ReportingControllerGetCashFlowTrendsData
1640
+ ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
1558
1641
  return __request(OpenAPI, {
1559
1642
  method: 'GET',
1560
- url: '/api/v1/{region}/bean/recurring-rules',
1643
+ url: '/api/v1/{region}/reporting/cash-flow/trends',
1561
1644
  path: {
1562
1645
  region: data.region
1563
1646
  },
1564
1647
  query: {
1565
- isActive: data.isActive,
1566
- frequency: data.frequency,
1567
- hasAutoCreate: data.hasAutoCreate
1648
+ period: data.period,
1649
+ granularity: data.granularity
1650
+ },
1651
+ errors: {
1652
+ 401: 'User not authenticated'
1568
1653
  }
1569
1654
  });
1570
1655
  }
1571
1656
 
1572
1657
  /**
1573
- * Create recurring rule from transaction
1574
- * Auto-creates a recurring rule using transaction data. User only confirms frequency.
1658
+ * Generate portfolio snapshot
1659
+ *
1660
+ * Manually generate a portfolio snapshot for a specific date.
1661
+ *
1662
+ * **Multi-currency Support:**
1663
+ * - Fetches balances grouped by currency
1664
+ * - Uses user's baseCurrency setting for conversion
1665
+ * - Stores exchange rates and warnings
1666
+ *
1667
+ * **Use Cases:**
1668
+ * - Testing snapshot generation
1669
+ * - Force regeneration after data correction
1670
+ * - Initial setup for new users
1671
+ *
1575
1672
  * @param data The data for the request.
1576
- * @param data.transactionId Source transaction ID
1577
1673
  * @param data.region Region code for tenant context
1578
- * @param data.requestBody
1579
- * @returns RecurringRuleResponseDto Rule created successfully
1674
+ * @param data.requestBody Optional date (defaults to today)
1675
+ * @returns GenerateSnapshotResponse Snapshot generated successfully
1580
1676
  * @throws ApiError
1581
1677
  */
1582
- public static recurringRuleControllerCreateFromTransaction(
1583
- data: RecurringRuleControllerCreateFromTransactionData
1584
- ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
1678
+ public static reportingControllerGenerateSnapshot(
1679
+ data: ReportingControllerGenerateSnapshotData
1680
+ ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
1585
1681
  return __request(OpenAPI, {
1586
1682
  method: 'POST',
1587
- url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
1683
+ url: '/api/v1/{region}/reporting/snapshots/generate',
1588
1684
  path: {
1589
- transactionId: data.transactionId,
1590
1685
  region: data.region
1591
1686
  },
1592
1687
  body: data.requestBody,
1593
1688
  mediaType: 'application/json',
1594
1689
  errors: {
1595
- 404: 'Transaction not found',
1596
- 409: 'Rule with same name already exists or transaction already linked'
1690
+ 400: 'Invalid date format',
1691
+ 401: 'User not authenticated'
1597
1692
  }
1598
1693
  });
1599
1694
  }
1600
1695
 
1601
1696
  /**
1602
- * Get recurring rule by ID
1603
- * Returns a specific recurring rule with its details
1697
+ * Backfill portfolio snapshots
1698
+ *
1699
+ * Generate snapshots for a date range (historical data backfill).
1700
+ *
1701
+ * **Multi-currency Support:**
1702
+ * - Each snapshot includes multi-currency data
1703
+ * - Uses exchange rates available at generation time
1704
+ * - Warnings stored for missing exchange rates
1705
+ *
1706
+ * **Best Practices:**
1707
+ * - Use for initial setup after account configuration
1708
+ * - Run during low-traffic periods for large date ranges
1709
+ * - Existing snapshots are skipped (not regenerated)
1710
+ *
1604
1711
  * @param data The data for the request.
1605
- * @param data.id Rule ID
1712
+ * @param data.region Region code for tenant context
1713
+ * @param data.requestBody
1714
+ * @returns BackfillSnapshotsResponse Backfill completed successfully
1715
+ * @throws ApiError
1716
+ */
1717
+ public static reportingControllerBackfillSnapshots(
1718
+ data: ReportingControllerBackfillSnapshotsData
1719
+ ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
1720
+ return __request(OpenAPI, {
1721
+ method: 'POST',
1722
+ url: '/api/v1/{region}/reporting/snapshots/backfill',
1723
+ path: {
1724
+ region: data.region
1725
+ },
1726
+ body: data.requestBody,
1727
+ mediaType: 'application/json',
1728
+ errors: {
1729
+ 400: 'Invalid date format or range',
1730
+ 401: 'User not authenticated',
1731
+ 409: 'Backfill already in progress for this user'
1732
+ }
1733
+ });
1734
+ }
1735
+ }
1736
+
1737
+ export class BeanPricesService {
1738
+ /**
1739
+ * Create a new price
1740
+ * Creates a new price entry for the authenticated user
1741
+ * @param data The data for the request.
1742
+ * @param data.region Region code for tenant context
1743
+ * @param data.requestBody
1744
+ * @returns PriceResponseDto Price created successfully
1745
+ * @throws ApiError
1746
+ */
1747
+ public static priceControllerCreate(
1748
+ data: PriceControllerCreateData
1749
+ ): CancelablePromise<PriceControllerCreateResponse> {
1750
+ return __request(OpenAPI, {
1751
+ method: 'POST',
1752
+ url: '/api/v1/{region}/bean/prices',
1753
+ path: {
1754
+ region: data.region
1755
+ },
1756
+ body: data.requestBody,
1757
+ mediaType: 'application/json',
1758
+ errors: {
1759
+ 404: 'Currency or quoteCurrency commodity not found',
1760
+ 409: 'Price already exists for this currency pair and date'
1761
+ }
1762
+ });
1763
+ }
1764
+
1765
+ /**
1766
+ * List user prices
1767
+ * Returns all price entries for the authenticated user with optional filtering
1768
+ * @param data The data for the request.
1769
+ * @param data.region Region code for tenant context
1770
+ * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
1771
+ * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
1772
+ * @param data.dateFrom Filter prices from this date (ISO 8601 format)
1773
+ * @param data.dateTo Filter prices to this date (ISO 8601 format)
1774
+ * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
1775
+ * @param data.page Page number for pagination (default: 1)
1776
+ * @param data.limit Number of items per page (default: 20, max: 100)
1777
+ * @returns PriceListResponseDto Prices retrieved successfully
1778
+ * @throws ApiError
1779
+ */
1780
+ public static priceControllerFindAll(
1781
+ data: PriceControllerFindAllData
1782
+ ): CancelablePromise<PriceControllerFindAllResponse> {
1783
+ return __request(OpenAPI, {
1784
+ method: 'GET',
1785
+ url: '/api/v1/{region}/bean/prices',
1786
+ path: {
1787
+ region: data.region
1788
+ },
1789
+ query: {
1790
+ currency: data.currency,
1791
+ quoteCurrency: data.quoteCurrency,
1792
+ dateFrom: data.dateFrom,
1793
+ dateTo: data.dateTo,
1794
+ search: data.search,
1795
+ page: data.page,
1796
+ limit: data.limit
1797
+ }
1798
+ });
1799
+ }
1800
+
1801
+ /**
1802
+ * Get price by ID
1803
+ * Returns a single price entry by its ID
1804
+ * @param data The data for the request.
1805
+ * @param data.id Price ID
1806
+ * @param data.region Region code for tenant context
1807
+ * @returns PriceResponseDto Price retrieved successfully
1808
+ * @throws ApiError
1809
+ */
1810
+ public static priceControllerFindOne(
1811
+ data: PriceControllerFindOneData
1812
+ ): CancelablePromise<PriceControllerFindOneResponse> {
1813
+ return __request(OpenAPI, {
1814
+ method: 'GET',
1815
+ url: '/api/v1/{region}/bean/prices/{id}',
1816
+ path: {
1817
+ id: data.id,
1818
+ region: data.region
1819
+ },
1820
+ errors: {
1821
+ 404: 'Price not found'
1822
+ }
1823
+ });
1824
+ }
1825
+
1826
+ /**
1827
+ * Update a price
1828
+ * Updates an existing price entry
1829
+ * @param data The data for the request.
1830
+ * @param data.id Price ID
1831
+ * @param data.region Region code for tenant context
1832
+ * @param data.requestBody
1833
+ * @returns PriceResponseDto Price updated successfully
1834
+ * @throws ApiError
1835
+ */
1836
+ public static priceControllerUpdate(
1837
+ data: PriceControllerUpdateData
1838
+ ): CancelablePromise<PriceControllerUpdateResponse> {
1839
+ return __request(OpenAPI, {
1840
+ method: 'PUT',
1841
+ url: '/api/v1/{region}/bean/prices/{id}',
1842
+ path: {
1843
+ id: data.id,
1844
+ region: data.region
1845
+ },
1846
+ body: data.requestBody,
1847
+ mediaType: 'application/json',
1848
+ errors: {
1849
+ 404: 'Price not found',
1850
+ 409: 'Updated price conflicts with existing price'
1851
+ }
1852
+ });
1853
+ }
1854
+
1855
+ /**
1856
+ * Delete a price
1857
+ * Deletes a price entry (hard delete)
1858
+ * @param data The data for the request.
1859
+ * @param data.id Price ID
1860
+ * @param data.region Region code for tenant context
1861
+ * @returns void Price deleted successfully
1862
+ * @throws ApiError
1863
+ */
1864
+ public static priceControllerDelete(
1865
+ data: PriceControllerDeleteData
1866
+ ): CancelablePromise<PriceControllerDeleteResponse> {
1867
+ return __request(OpenAPI, {
1868
+ method: 'DELETE',
1869
+ url: '/api/v1/{region}/bean/prices/{id}',
1870
+ path: {
1871
+ id: data.id,
1872
+ region: data.region
1873
+ },
1874
+ errors: {
1875
+ 404: 'Price not found'
1876
+ }
1877
+ });
1878
+ }
1879
+
1880
+ /**
1881
+ * Bulk create prices
1882
+ * Creates multiple price entries at once (skips duplicates)
1883
+ * @param data The data for the request.
1884
+ * @param data.region Region code for tenant context
1885
+ * @param data.requestBody
1886
+ * @returns PriceResponseDto Prices created successfully
1887
+ * @throws ApiError
1888
+ */
1889
+ public static priceControllerBulkCreate(
1890
+ data: PriceControllerBulkCreateData
1891
+ ): CancelablePromise<PriceControllerBulkCreateResponse> {
1892
+ return __request(OpenAPI, {
1893
+ method: 'POST',
1894
+ url: '/api/v1/{region}/bean/prices/bulk',
1895
+ path: {
1896
+ region: data.region
1897
+ },
1898
+ body: data.requestBody,
1899
+ mediaType: 'application/json'
1900
+ });
1901
+ }
1902
+ }
1903
+
1904
+ export class UsersService {
1905
+ /**
1906
+ * Delete own user account
1907
+ * @param data The data for the request.
1908
+ * @param data.requestBody
1909
+ * @returns void User deleted successfully
1910
+ * @throws ApiError
1911
+ */
1912
+ public static userControllerDeleteOwnUser(
1913
+ data: UserControllerDeleteOwnUserData
1914
+ ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
1915
+ return __request(OpenAPI, {
1916
+ method: 'DELETE',
1917
+ url: '/api/v1/users',
1918
+ body: data.requestBody,
1919
+ mediaType: 'application/json',
1920
+ errors: {
1921
+ 403: 'Invalid access token'
1922
+ }
1923
+ });
1924
+ }
1925
+
1926
+ /**
1927
+ * Get current authenticated user
1928
+ * @param data The data for the request.
1929
+ * @param data.acceptLanguage
1930
+ * @returns UserResponseDto User retrieved successfully
1931
+ * @throws ApiError
1932
+ */
1933
+ public static userControllerGetUser(
1934
+ data: UserControllerGetUserData
1935
+ ): CancelablePromise<UserControllerGetUserResponse> {
1936
+ return __request(OpenAPI, {
1937
+ method: 'GET',
1938
+ url: '/api/v1/users',
1939
+ headers: {
1940
+ 'accept-language': data.acceptLanguage
1941
+ }
1942
+ });
1943
+ }
1944
+
1945
+ /**
1946
+ * Sign up new user
1947
+ * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
1948
+ * @param data The data for the request.
1949
+ * @param data.requestBody
1950
+ * @returns SignupResponseDto User created successfully
1951
+ * @throws ApiError
1952
+ */
1953
+ public static userControllerSignupUser(
1954
+ data: UserControllerSignupUserData
1955
+ ): CancelablePromise<UserControllerSignupUserResponse> {
1956
+ return __request(OpenAPI, {
1957
+ method: 'POST',
1958
+ url: '/api/v1/users',
1959
+ body: data.requestBody,
1960
+ mediaType: 'application/json',
1961
+ errors: {
1962
+ 400: 'Invalid Turnstile token (when Turnstile is enabled)',
1963
+ 403: 'User signup is disabled'
1964
+ }
1965
+ });
1966
+ }
1967
+
1968
+ /**
1969
+ * Delete user by ID (admin only)
1970
+ * @param data The data for the request.
1971
+ * @param data.id User ID to delete
1972
+ * @returns void User deleted successfully
1973
+ * @throws ApiError
1974
+ */
1975
+ public static userControllerDeleteUser(
1976
+ data: UserControllerDeleteUserData
1977
+ ): CancelablePromise<UserControllerDeleteUserResponse> {
1978
+ return __request(OpenAPI, {
1979
+ method: 'DELETE',
1980
+ url: '/api/v1/users/{id}',
1981
+ path: {
1982
+ id: data.id
1983
+ },
1984
+ errors: {
1985
+ 403: 'Cannot delete own account or insufficient permissions'
1986
+ }
1987
+ });
1988
+ }
1989
+
1990
+ /**
1991
+ * Get user info by user ID
1992
+ * @param data The data for the request.
1993
+ * @param data.id User ID
1994
+ * @returns unknown User info retrieved successfully
1995
+ * @throws ApiError
1996
+ */
1997
+ public static userControllerGetUserInfo(
1998
+ data: UserControllerGetUserInfoData
1999
+ ): CancelablePromise<UserControllerGetUserInfoResponse> {
2000
+ return __request(OpenAPI, {
2001
+ method: 'GET',
2002
+ url: '/api/v1/users/{id}/info',
2003
+ path: {
2004
+ id: data.id
2005
+ },
2006
+ errors: {
2007
+ 403: 'Cannot access other user info without admin permission'
2008
+ }
2009
+ });
2010
+ }
2011
+
2012
+ /**
2013
+ * Update user settings
2014
+ * @param data The data for the request.
2015
+ * @param data.requestBody
2016
+ * @returns unknown Settings updated successfully
2017
+ * @throws ApiError
2018
+ */
2019
+ public static userControllerUpdateUserSetting(
2020
+ data: UserControllerUpdateUserSettingData
2021
+ ): CancelablePromise<UserControllerUpdateUserSettingResponse> {
2022
+ return __request(OpenAPI, {
2023
+ method: 'PUT',
2024
+ url: '/api/v1/users/setting',
2025
+ body: data.requestBody,
2026
+ mediaType: 'application/json',
2027
+ errors: {
2028
+ 403: 'Insufficient permissions'
2029
+ }
2030
+ });
2031
+ }
2032
+
2033
+ /**
2034
+ * Get all user settings paginated (admin only)
2035
+ * @param data The data for the request.
2036
+ * @param data.pageNo Page number
2037
+ * @param data.pageSize Page size
2038
+ * @returns unknown Settings list retrieved successfully
2039
+ * @throws ApiError
2040
+ */
2041
+ public static userControllerGetAllUserSettingsByPage(
2042
+ data: UserControllerGetAllUserSettingsByPageData
2043
+ ): CancelablePromise<UserControllerGetAllUserSettingsByPageResponse> {
2044
+ return __request(OpenAPI, {
2045
+ method: 'GET',
2046
+ url: '/api/v1/users/settings-by-page',
2047
+ query: {
2048
+ pageNo: data.pageNo,
2049
+ pageSize: data.pageSize
2050
+ }
2051
+ });
2052
+ }
2053
+
2054
+ /**
2055
+ * Get asset and liability summary for current user
2056
+ * @returns unknown Summary retrieved successfully
2057
+ * @throws ApiError
2058
+ */
2059
+ public static userControllerGetAssetLiabilitySummary(): CancelablePromise<UserControllerGetAssetLiabilitySummaryResponse> {
2060
+ return __request(OpenAPI, {
2061
+ method: 'GET',
2062
+ url: '/api/v1/users/asset-liability-summary'
2063
+ });
2064
+ }
2065
+ }
2066
+
2067
+ export class PropertiesService {
2068
+ /**
2069
+ * Get all system properties
2070
+ * @returns unknown Properties retrieved successfully
2071
+ * @throws ApiError
2072
+ */
2073
+ public static propertyControllerGetAll(): CancelablePromise<PropertyControllerGetAllResponse> {
2074
+ return __request(OpenAPI, {
2075
+ method: 'GET',
2076
+ url: '/api/v1/admin/properties',
2077
+ errors: {
2078
+ 401: 'Unauthorized',
2079
+ 403: 'Forbidden - insufficient permissions'
2080
+ }
2081
+ });
2082
+ }
2083
+
2084
+ /**
2085
+ * Get property by key
2086
+ * @param data The data for the request.
2087
+ * @param data.key Property key
2088
+ * @returns unknown Property retrieved successfully
2089
+ * @throws ApiError
2090
+ */
2091
+ public static propertyControllerGetByKey(
2092
+ data: PropertyControllerGetByKeyData
2093
+ ): CancelablePromise<PropertyControllerGetByKeyResponse> {
2094
+ return __request(OpenAPI, {
2095
+ method: 'GET',
2096
+ url: '/api/v1/admin/properties/{key}',
2097
+ path: {
2098
+ key: data.key
2099
+ },
2100
+ errors: {
2101
+ 401: 'Unauthorized',
2102
+ 403: 'Forbidden - insufficient permissions',
2103
+ 404: 'Property not found'
2104
+ }
2105
+ });
2106
+ }
2107
+
2108
+ /**
2109
+ * Update a system property
2110
+ * @param data The data for the request.
2111
+ * @param data.key Property key
2112
+ * @param data.requestBody
2113
+ * @returns unknown Property updated successfully
2114
+ * @throws ApiError
2115
+ */
2116
+ public static propertyControllerUpdate(
2117
+ data: PropertyControllerUpdateData
2118
+ ): CancelablePromise<PropertyControllerUpdateResponse> {
2119
+ return __request(OpenAPI, {
2120
+ method: 'PUT',
2121
+ url: '/api/v1/admin/properties/{key}',
2122
+ path: {
2123
+ key: data.key
2124
+ },
2125
+ body: data.requestBody,
2126
+ mediaType: 'application/json',
2127
+ errors: {
2128
+ 401: 'Unauthorized',
2129
+ 403: 'Forbidden - insufficient permissions'
2130
+ }
2131
+ });
2132
+ }
2133
+
2134
+ /**
2135
+ * Delete a system property
2136
+ * @param data The data for the request.
2137
+ * @param data.key Property key
2138
+ * @returns void Property deleted successfully
2139
+ * @throws ApiError
2140
+ */
2141
+ public static propertyControllerDelete(
2142
+ data: PropertyControllerDeleteData
2143
+ ): CancelablePromise<PropertyControllerDeleteResponse> {
2144
+ return __request(OpenAPI, {
2145
+ method: 'DELETE',
2146
+ url: '/api/v1/admin/properties/{key}',
2147
+ path: {
2148
+ key: data.key
2149
+ },
2150
+ errors: {
2151
+ 401: 'Unauthorized',
2152
+ 403: 'Forbidden - insufficient permissions',
2153
+ 404: 'Property not found'
2154
+ }
2155
+ });
2156
+ }
2157
+ }
2158
+
2159
+ export class RecurringRulesService {
2160
+ /**
2161
+ * Create a new recurring rule
2162
+ * Creates a new recurring transaction rule for the authenticated user
2163
+ * @param data The data for the request.
2164
+ * @param data.region Region code for tenant context
2165
+ * @param data.requestBody
2166
+ * @returns RecurringRuleResponseDto Rule created successfully
2167
+ * @throws ApiError
2168
+ */
2169
+ public static recurringRuleControllerCreate(
2170
+ data: RecurringRuleControllerCreateData
2171
+ ): CancelablePromise<RecurringRuleControllerCreateResponse> {
2172
+ return __request(OpenAPI, {
2173
+ method: 'POST',
2174
+ url: '/api/v1/{region}/bean/recurring-rules',
2175
+ path: {
2176
+ region: data.region
2177
+ },
2178
+ body: data.requestBody,
2179
+ mediaType: 'application/json',
2180
+ errors: {
2181
+ 400: 'Invalid input data (e.g., autoCreate without accounts)',
2182
+ 409: 'Rule with same name already exists'
2183
+ }
2184
+ });
2185
+ }
2186
+
2187
+ /**
2188
+ * List recurring rules
2189
+ * Returns all recurring rules for the authenticated user with optional filtering
2190
+ * @param data The data for the request.
2191
+ * @param data.region Region code for tenant context
2192
+ * @param data.isActive Filter by active status
2193
+ * @param data.frequency Filter by frequency (WEEKLY, MONTHLY, etc.)
2194
+ * @param data.hasAutoCreate Filter by autoCreate enabled
2195
+ * @returns RecurringRuleResponseDto Rules retrieved successfully
2196
+ * @throws ApiError
2197
+ */
2198
+ public static recurringRuleControllerFindAll(
2199
+ data: RecurringRuleControllerFindAllData
2200
+ ): CancelablePromise<RecurringRuleControllerFindAllResponse> {
2201
+ return __request(OpenAPI, {
2202
+ method: 'GET',
2203
+ url: '/api/v1/{region}/bean/recurring-rules',
2204
+ path: {
2205
+ region: data.region
2206
+ },
2207
+ query: {
2208
+ isActive: data.isActive,
2209
+ frequency: data.frequency,
2210
+ hasAutoCreate: data.hasAutoCreate
2211
+ }
2212
+ });
2213
+ }
2214
+
2215
+ /**
2216
+ * Create recurring rule from transaction
2217
+ * Auto-creates a recurring rule using transaction data. User only confirms frequency.
2218
+ * @param data The data for the request.
2219
+ * @param data.transactionId Source transaction ID
2220
+ * @param data.region Region code for tenant context
2221
+ * @param data.requestBody
2222
+ * @returns RecurringRuleResponseDto Rule created successfully
2223
+ * @throws ApiError
2224
+ */
2225
+ public static recurringRuleControllerCreateFromTransaction(
2226
+ data: RecurringRuleControllerCreateFromTransactionData
2227
+ ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
2228
+ return __request(OpenAPI, {
2229
+ method: 'POST',
2230
+ url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
2231
+ path: {
2232
+ transactionId: data.transactionId,
2233
+ region: data.region
2234
+ },
2235
+ body: data.requestBody,
2236
+ mediaType: 'application/json',
2237
+ errors: {
2238
+ 404: 'Transaction not found',
2239
+ 409: 'Rule with same name already exists or transaction already linked'
2240
+ }
2241
+ });
2242
+ }
2243
+
2244
+ /**
2245
+ * Get recurring rule by ID
2246
+ * Returns a specific recurring rule with its details
2247
+ * @param data The data for the request.
2248
+ * @param data.id Rule ID
1606
2249
  * @param data.region Region code for tenant context
1607
2250
  * @returns RecurringRuleResponseDto Rule retrieved successfully
1608
2251
  * @throws ApiError
@@ -1811,7 +2454,7 @@ export class ExpectedTransactionsService {
1811
2454
  * @param data The data for the request.
1812
2455
  * @param data.id Expected transaction ID
1813
2456
  * @param data.region Region code for tenant context
1814
- * @returns ExpectedTransactionResponseDto Skip undone successfully
2457
+ * @returns void Skip undone successfully
1815
2458
  * @throws ApiError
1816
2459
  */
1817
2460
  public static expectedTransactionControllerUndoSkip(
@@ -1867,7 +2510,7 @@ export class ExpectedTransactionsService {
1867
2510
  * @param data The data for the request.
1868
2511
  * @param data.id Expected transaction ID
1869
2512
  * @param data.region Region code for tenant context
1870
- * @returns unknown Match removed successfully
2513
+ * @returns void Match removed successfully
1871
2514
  * @throws ApiError
1872
2515
  */
1873
2516
  public static expectedTransactionControllerUnmatch(
@@ -2221,256 +2864,29 @@ export class BeanTransactionRulesService {
2221
2864
  }
2222
2865
  }
2223
2866
 
2224
- export class UsersService {
2225
- /**
2226
- * Delete own user account
2227
- * @param data The data for the request.
2228
- * @param data.requestBody
2229
- * @returns void User deleted successfully
2230
- * @throws ApiError
2231
- */
2232
- public static userControllerDeleteOwnUser(
2233
- data: UserControllerDeleteOwnUserData
2234
- ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
2235
- return __request(OpenAPI, {
2236
- method: 'DELETE',
2237
- url: '/api/v1/users',
2238
- body: data.requestBody,
2239
- mediaType: 'application/json',
2240
- errors: {
2241
- 403: 'Invalid access token'
2242
- }
2243
- });
2244
- }
2245
-
2246
- /**
2247
- * Get current authenticated user
2248
- * @param data The data for the request.
2249
- * @param data.acceptLanguage
2250
- * @returns unknown User retrieved successfully
2251
- * @throws ApiError
2252
- */
2253
- public static userControllerGetUser(
2254
- data: UserControllerGetUserData
2255
- ): CancelablePromise<UserControllerGetUserResponse> {
2256
- return __request(OpenAPI, {
2257
- method: 'GET',
2258
- url: '/api/v1/users',
2259
- headers: {
2260
- 'accept-language': data.acceptLanguage
2261
- }
2262
- });
2263
- }
2264
-
2265
- /**
2266
- * Sign up new user
2267
- * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
2268
- * @param data The data for the request.
2269
- * @param data.requestBody
2270
- * @returns unknown User created successfully
2271
- * @throws ApiError
2272
- */
2273
- public static userControllerSignupUser(
2274
- data: UserControllerSignupUserData
2275
- ): CancelablePromise<UserControllerSignupUserResponse> {
2276
- return __request(OpenAPI, {
2277
- method: 'POST',
2278
- url: '/api/v1/users',
2279
- body: data.requestBody,
2280
- mediaType: 'application/json',
2281
- errors: {
2282
- 400: 'Invalid Turnstile token (when Turnstile is enabled)',
2283
- 403: 'User signup is disabled'
2284
- }
2285
- });
2286
- }
2287
-
2288
- /**
2289
- * Delete user by ID (admin only)
2290
- * @param data The data for the request.
2291
- * @param data.id User ID to delete
2292
- * @returns void User deleted successfully
2293
- * @throws ApiError
2294
- */
2295
- public static userControllerDeleteUser(
2296
- data: UserControllerDeleteUserData
2297
- ): CancelablePromise<UserControllerDeleteUserResponse> {
2298
- return __request(OpenAPI, {
2299
- method: 'DELETE',
2300
- url: '/api/v1/users/{id}',
2301
- path: {
2302
- id: data.id
2303
- },
2304
- errors: {
2305
- 403: 'Cannot delete own account or insufficient permissions'
2306
- }
2307
- });
2308
- }
2309
-
2310
- /**
2311
- * Get user info by user ID
2312
- * @param data The data for the request.
2313
- * @param data.id User ID
2314
- * @returns unknown User info retrieved successfully
2315
- * @throws ApiError
2316
- */
2317
- public static userControllerGetUserInfo(
2318
- data: UserControllerGetUserInfoData
2319
- ): CancelablePromise<UserControllerGetUserInfoResponse> {
2320
- return __request(OpenAPI, {
2321
- method: 'GET',
2322
- url: '/api/v1/users/{id}/info',
2323
- path: {
2324
- id: data.id
2325
- },
2326
- errors: {
2327
- 403: 'Cannot access other user info without admin permission'
2328
- }
2329
- });
2330
- }
2331
-
2332
- /**
2333
- * Update user settings
2334
- * @param data The data for the request.
2335
- * @param data.requestBody
2336
- * @returns unknown Settings updated successfully
2337
- * @throws ApiError
2338
- */
2339
- public static userControllerUpdateUserSetting(
2340
- data: UserControllerUpdateUserSettingData
2341
- ): CancelablePromise<UserControllerUpdateUserSettingResponse> {
2342
- return __request(OpenAPI, {
2343
- method: 'PUT',
2344
- url: '/api/v1/users/setting',
2345
- body: data.requestBody,
2346
- mediaType: 'application/json',
2347
- errors: {
2348
- 403: 'Insufficient permissions'
2349
- }
2350
- });
2351
- }
2352
-
2353
- /**
2354
- * Get all user settings paginated (admin only)
2355
- * @param data The data for the request.
2356
- * @param data.pageNo Page number
2357
- * @param data.pageSize Page size
2358
- * @returns unknown Settings list retrieved successfully
2359
- * @throws ApiError
2360
- */
2361
- public static userControllerGetAllUserSettingsByPage(
2362
- data: UserControllerGetAllUserSettingsByPageData
2363
- ): CancelablePromise<UserControllerGetAllUserSettingsByPageResponse> {
2364
- return __request(OpenAPI, {
2365
- method: 'GET',
2366
- url: '/api/v1/users/settings-by-page',
2367
- query: {
2368
- pageNo: data.pageNo,
2369
- pageSize: data.pageSize
2370
- }
2371
- });
2372
- }
2373
-
2374
- /**
2375
- * Get asset and liability summary for current user
2376
- * @returns unknown Summary retrieved successfully
2377
- * @throws ApiError
2378
- */
2379
- public static userControllerGetAssetLiabilitySummary(): CancelablePromise<UserControllerGetAssetLiabilitySummaryResponse> {
2380
- return __request(OpenAPI, {
2381
- method: 'GET',
2382
- url: '/api/v1/users/asset-liability-summary'
2383
- });
2384
- }
2385
- }
2386
-
2387
- export class PropertiesService {
2388
- /**
2389
- * Get all system properties
2390
- * @returns unknown Properties retrieved successfully
2391
- * @throws ApiError
2392
- */
2393
- public static propertyControllerGetAll(): CancelablePromise<PropertyControllerGetAllResponse> {
2394
- return __request(OpenAPI, {
2395
- method: 'GET',
2396
- url: '/api/v1/admin/properties',
2397
- errors: {
2398
- 401: 'Unauthorized',
2399
- 403: 'Forbidden - insufficient permissions'
2400
- }
2401
- });
2402
- }
2403
-
2867
+ export class BeanCategoryCatalogService {
2404
2868
  /**
2405
- * Get property by key
2869
+ * List category catalog for a region
2870
+ * Returns the region-scoped category slugs (expense/income/investment/banking/transfer/payment) for the NLP result picker, each with the categoryAccount paths the region-enabled system rules map it to (#816). CN-exclusive payment instruments (huabei/baitiao) appear only under /cn.
2406
2871
  * @param data The data for the request.
2407
- * @param data.key Property key
2408
- * @returns unknown Property retrieved successfully
2872
+ * @param data.region Region code for tenant context
2873
+ * @param data.scenario Filter by scenario
2874
+ * @param data.routeBearing Filter by routeBearing (entity-router route() consumes it)
2875
+ * @returns CategoryCatalogListResponseDto Category catalog retrieved successfully
2409
2876
  * @throws ApiError
2410
2877
  */
2411
- public static propertyControllerGetByKey(
2412
- data: PropertyControllerGetByKeyData
2413
- ): CancelablePromise<PropertyControllerGetByKeyResponse> {
2878
+ public static categoryCatalogControllerList(
2879
+ data: CategoryCatalogControllerListData
2880
+ ): CancelablePromise<CategoryCatalogControllerListResponse> {
2414
2881
  return __request(OpenAPI, {
2415
2882
  method: 'GET',
2416
- url: '/api/v1/admin/properties/{key}',
2417
- path: {
2418
- key: data.key
2419
- },
2420
- errors: {
2421
- 401: 'Unauthorized',
2422
- 403: 'Forbidden - insufficient permissions',
2423
- 404: 'Property not found'
2424
- }
2425
- });
2426
- }
2427
-
2428
- /**
2429
- * Update a system property
2430
- * @param data The data for the request.
2431
- * @param data.key Property key
2432
- * @param data.requestBody
2433
- * @returns unknown Property updated successfully
2434
- * @throws ApiError
2435
- */
2436
- public static propertyControllerUpdate(
2437
- data: PropertyControllerUpdateData
2438
- ): CancelablePromise<PropertyControllerUpdateResponse> {
2439
- return __request(OpenAPI, {
2440
- method: 'PUT',
2441
- url: '/api/v1/admin/properties/{key}',
2442
- path: {
2443
- key: data.key
2444
- },
2445
- body: data.requestBody,
2446
- mediaType: 'application/json',
2447
- errors: {
2448
- 401: 'Unauthorized',
2449
- 403: 'Forbidden - insufficient permissions'
2450
- }
2451
- });
2452
- }
2453
-
2454
- /**
2455
- * Delete a system property
2456
- * @param data The data for the request.
2457
- * @param data.key Property key
2458
- * @returns void Property deleted successfully
2459
- * @throws ApiError
2460
- */
2461
- public static propertyControllerDelete(
2462
- data: PropertyControllerDeleteData
2463
- ): CancelablePromise<PropertyControllerDeleteResponse> {
2464
- return __request(OpenAPI, {
2465
- method: 'DELETE',
2466
- url: '/api/v1/admin/properties/{key}',
2883
+ url: '/api/v1/{region}/bean/categories',
2467
2884
  path: {
2468
- key: data.key
2885
+ region: data.region
2469
2886
  },
2470
- errors: {
2471
- 401: 'Unauthorized',
2472
- 403: 'Forbidden - insufficient permissions',
2473
- 404: 'Property not found'
2887
+ query: {
2888
+ scenario: data.scenario,
2889
+ routeBearing: data.routeBearing
2474
2890
  }
2475
2891
  });
2476
2892
  }
@@ -2651,11 +3067,144 @@ export class LifeEventsService {
2651
3067
  }
2652
3068
  }
2653
3069
 
3070
+ export class OnboardingService {
3071
+ /**
3072
+ * Bootstrap core accounts + register asset accounts with opening balances (ADR-0113)
3073
+ * @param data The data for the request.
3074
+ * @param data.region Region code for tenant context. Not-yet-open codes are accepted: the universal catalog backs onboarding regardless of region (#759)
3075
+ * @param data.requestBody
3076
+ * @returns unknown Onboarding bootstrap result.
3077
+ * @throws ApiError
3078
+ */
3079
+ public static onboardingControllerBootstrap(
3080
+ data: OnboardingControllerBootstrapData
3081
+ ): CancelablePromise<OnboardingControllerBootstrapResponse> {
3082
+ return __request(OpenAPI, {
3083
+ method: 'POST',
3084
+ url: '/api/v1/{region}/bean/onboarding',
3085
+ path: {
3086
+ region: data.region
3087
+ },
3088
+ body: data.requestBody,
3089
+ mediaType: 'application/json',
3090
+ errors: {
3091
+ 422: 'Invalid region/account path/duplicate paths.'
3092
+ }
3093
+ });
3094
+ }
3095
+ }
3096
+
3097
+ export class BalanceReconciliationService {
3098
+ /**
3099
+ * Preview reconciliation (book vs actual)
3100
+ * Computes book balance, diff, Beancount-inferred tolerance, and suggested action without persisting.
3101
+ * @param data The data for the request.
3102
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3103
+ * @param data.requestBody
3104
+ * @returns ReconciliationComputeResultDto Reconciliation preview
3105
+ * @throws ApiError
3106
+ */
3107
+ public static reconciliationControllerCompute(
3108
+ data: ReconciliationControllerComputeData
3109
+ ): CancelablePromise<ReconciliationControllerComputeResponse> {
3110
+ return __request(OpenAPI, {
3111
+ method: 'POST',
3112
+ url: '/api/v1/{region}/bean/reconciliations',
3113
+ path: {
3114
+ region: data.region
3115
+ },
3116
+ body: data.requestBody,
3117
+ mediaType: 'application/json',
3118
+ errors: {
3119
+ 404: 'Account not found'
3120
+ }
3121
+ });
3122
+ }
3123
+
3124
+ /**
3125
+ * Record a balance assertion
3126
+ * Persists the reconciliation as a BeanBalance assertion (amount = actual, diffAmount = book − actual). Re-reconciling the same day/currency upserts.
3127
+ * @param data The data for the request.
3128
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3129
+ * @param data.requestBody
3130
+ * @returns ReconciliationRecordDto Balance assertion recorded
3131
+ * @throws ApiError
3132
+ */
3133
+ public static reconciliationControllerAssert(
3134
+ data: ReconciliationControllerAssertData
3135
+ ): CancelablePromise<ReconciliationControllerAssertResponse> {
3136
+ return __request(OpenAPI, {
3137
+ method: 'POST',
3138
+ url: '/api/v1/{region}/bean/reconciliations/assert',
3139
+ path: {
3140
+ region: data.region
3141
+ },
3142
+ body: data.requestBody,
3143
+ mediaType: 'application/json',
3144
+ errors: {
3145
+ 404: 'Account not found'
3146
+ }
3147
+ });
3148
+ }
3149
+
3150
+ /**
3151
+ * Generate a pad adjusting entry
3152
+ * 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.
3153
+ * @param data The data for the request.
3154
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3155
+ * @param data.requestBody
3156
+ * @returns PadResultDto Pad adjusting entry generated
3157
+ * @throws ApiError
3158
+ */
3159
+ public static reconciliationControllerPad(
3160
+ data: ReconciliationControllerPadData
3161
+ ): CancelablePromise<ReconciliationControllerPadResponse> {
3162
+ return __request(OpenAPI, {
3163
+ method: 'POST',
3164
+ url: '/api/v1/{region}/bean/reconciliations/pad',
3165
+ path: {
3166
+ region: data.region
3167
+ },
3168
+ body: data.requestBody,
3169
+ mediaType: 'application/json',
3170
+ errors: {
3171
+ 400: 'Book already within tolerance — no pad needed',
3172
+ 404: 'Account not found'
3173
+ }
3174
+ });
3175
+ }
3176
+
3177
+ /**
3178
+ * List reconciliation history for an account
3179
+ * Returns recorded balance assertions (most recent first). The latest drives the account-detail "Last <date>" badge.
3180
+ * @param data The data for the request.
3181
+ * @param data.accountId BeanAccount id
3182
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3183
+ * @returns ReconciliationRecordDto Reconciliation history
3184
+ * @throws ApiError
3185
+ */
3186
+ public static reconciliationControllerHistory(
3187
+ data: ReconciliationControllerHistoryData
3188
+ ): CancelablePromise<ReconciliationControllerHistoryResponse> {
3189
+ return __request(OpenAPI, {
3190
+ method: 'GET',
3191
+ url: '/api/v1/{region}/bean/accounts/{accountId}/reconciliations',
3192
+ path: {
3193
+ accountId: data.accountId,
3194
+ region: data.region
3195
+ },
3196
+ errors: {
3197
+ 404: 'Account not found'
3198
+ }
3199
+ });
3200
+ }
3201
+ }
3202
+
2654
3203
  export class BeanExportService {
2655
3204
  /**
2656
3205
  * Export Beancount ledger as ZIP
2657
3206
  * Export all user Beancount data as a ZIP file containing ledger.beancount and yearly files in community format.
2658
- * @returns unknown
3207
+ * @returns binary ZIP archive (application/zip) streamed as an attachment
2659
3208
  * @throws ApiError
2660
3209
  */
2661
3210
  public static exportControllerExportBeancount(): CancelablePromise<ExportControllerExportBeancountResponse> {
@@ -2829,216 +3378,196 @@ export class BeanImportService {
2829
3378
  }
2830
3379
  }
2831
3380
 
2832
- export class BeanPlatformsService {
2833
- /**
2834
- * Get all platforms with statistics
2835
- * @returns unknown List of platforms with binding and account counts
2836
- * @throws ApiError
2837
- */
2838
- public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
2839
- return __request(OpenAPI, {
2840
- method: 'GET',
2841
- url: '/api/v1/bean/platforms'
2842
- });
2843
- }
2844
-
3381
+ export class ProviderSyncService {
2845
3382
  /**
2846
- * Create a new platform
3383
+ * Sync transactions from financial data provider
3384
+ *
3385
+ * Accepts raw transactions from external financial data providers, transforms them to Beancount format, and processes them through the ingestion pipeline.
3386
+ *
3387
+ * **Supported Providers:**
3388
+ * - **plaid**: Plaid API (US, Canada, Europe)
3389
+ * - **teller**: Teller API (US)
3390
+ * - **truelayer**: TrueLayer Open Banking (UK, Europe)
3391
+ * - **gocardless**: GoCardless Bank Account Data (Europe)
3392
+ * - **simplefin**: SimpleFIN (Self-hosted)
3393
+ * - **yodlee**: Yodlee (Global)
3394
+ * - **beancount-direct**: Beancount format transactions
3395
+ * - **parsed-bill**: Client-side parsed bill transactions
3396
+ *
3397
+ * **Processing Flow:**
3398
+ * 1. Transform raw data via provider adapter
3399
+ * 2. Validate transaction format
3400
+ * 3. Deduplicate using originalId
3401
+ * 4. Classify using rule engine
3402
+ * 5. Route low-confidence to Review Center
3403
+ * 6. Persist validated transactions
3404
+ *
2847
3405
  * @param data The data for the request.
3406
+ * @param data.providerName Provider name
3407
+ * @param data.region Region code for tenant context
2848
3408
  * @param data.requestBody
2849
- * @returns unknown Platform created successfully
3409
+ * @returns ProviderSyncResponseDto Sync completed successfully
2850
3410
  * @throws ApiError
2851
3411
  */
2852
- public static platformControllerCreate(
2853
- data: PlatformControllerCreateData
2854
- ): CancelablePromise<PlatformControllerCreateResponse> {
3412
+ public static providerSyncControllerSync(
3413
+ data: ProviderSyncControllerSyncData
3414
+ ): CancelablePromise<ProviderSyncControllerSyncResponse> {
2855
3415
  return __request(OpenAPI, {
2856
3416
  method: 'POST',
2857
- url: '/api/v1/bean/platforms',
3417
+ url: '/api/v1/{region}/bean/import/provider/{providerName}/sync',
3418
+ path: {
3419
+ providerName: data.providerName,
3420
+ region: data.region
3421
+ },
2858
3422
  body: data.requestBody,
2859
3423
  mediaType: 'application/json',
2860
3424
  errors: {
2861
- 409: 'Platform already exists'
3425
+ 400: 'Invalid request data',
3426
+ 401: 'Missing or invalid authentication',
3427
+ 404: 'Provider not supported'
2862
3428
  }
2863
3429
  });
2864
3430
  }
2865
3431
 
2866
3432
  /**
2867
- * Get platform list for current user
2868
- * @returns unknown List of platforms with user binding status
2869
- * @throws ApiError
2870
- */
2871
- public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
2872
- return __request(OpenAPI, {
2873
- method: 'GET',
2874
- url: '/api/v1/bean/platforms/list'
2875
- });
2876
- }
2877
-
2878
- /**
2879
- * Match platforms by name or alias
3433
+ * Get supported providers
3434
+ * Returns a list of all providers supported by the sync endpoint.
2880
3435
  * @param data The data for the request.
2881
- * @param data.q Search query — Chinese name, English name, or abbreviation
2882
- * @param data.region Region code for category override lookup
2883
- * @returns unknown List of matching platforms with suggested segment names
3436
+ * @param data.region Region code for tenant context
3437
+ * @returns SupportedProvidersResponseDto List of supported providers
2884
3438
  * @throws ApiError
2885
3439
  */
2886
- public static platformControllerMatchPlatforms(
2887
- data: PlatformControllerMatchPlatformsData
2888
- ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3440
+ public static providerSyncControllerGetSupportedProviders(
3441
+ data: ProviderSyncControllerGetSupportedProvidersData
3442
+ ): CancelablePromise<ProviderSyncControllerGetSupportedProvidersResponse> {
2889
3443
  return __request(OpenAPI, {
2890
3444
  method: 'GET',
2891
- url: '/api/v1/bean/platforms/match',
2892
- query: {
2893
- q: data.q,
3445
+ url: '/api/v1/{region}/bean/import/provider/supported',
3446
+ path: {
2894
3447
  region: data.region
3448
+ },
3449
+ errors: {
3450
+ 401: 'Missing or invalid authentication'
2895
3451
  }
2896
3452
  });
2897
3453
  }
2898
3454
 
2899
3455
  /**
2900
- * Update a platform
3456
+ * Check if provider is supported
3457
+ * Returns whether a specific provider is supported.
2901
3458
  * @param data The data for the request.
2902
- * @param data.id Platform ID
2903
- * @param data.requestBody
2904
- * @returns unknown Platform updated successfully
3459
+ * @param data.providerName Provider name to check
3460
+ * @param data.region Region code for tenant context
3461
+ * @returns unknown Provider support status
2905
3462
  * @throws ApiError
2906
3463
  */
2907
- public static platformControllerUpdate(
2908
- data: PlatformControllerUpdateData
2909
- ): CancelablePromise<PlatformControllerUpdateResponse> {
3464
+ public static providerSyncControllerIsProviderSupported(
3465
+ data: ProviderSyncControllerIsProviderSupportedData
3466
+ ): CancelablePromise<ProviderSyncControllerIsProviderSupportedResponse> {
2910
3467
  return __request(OpenAPI, {
2911
- method: 'PUT',
2912
- url: '/api/v1/bean/platforms/{id}',
3468
+ method: 'GET',
3469
+ url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
2913
3470
  path: {
2914
- id: data.id
3471
+ providerName: data.providerName,
3472
+ region: data.region
2915
3473
  },
2916
- body: data.requestBody,
2917
- mediaType: 'application/json',
2918
3474
  errors: {
2919
- 404: 'Platform not found'
3475
+ 401: 'Missing or invalid authentication'
2920
3476
  }
2921
3477
  });
2922
3478
  }
3479
+ }
2923
3480
 
3481
+ export class ExternalAccountLinksService {
2924
3482
  /**
2925
- * Delete a platform
3483
+ * Create an external account → BeanAccount mapping (ADR-0113)
2926
3484
  * @param data The data for the request.
2927
- * @param data.id Platform ID
2928
- * @returns void Platform deleted successfully
3485
+ * @param data.region Region code for tenant context
3486
+ * @param data.requestBody
3487
+ * @returns ExternalAccountLinkResponseDto Link created.
2929
3488
  * @throws ApiError
2930
3489
  */
2931
- public static platformControllerDelete(
2932
- data: PlatformControllerDeleteData
2933
- ): CancelablePromise<PlatformControllerDeleteResponse> {
3490
+ public static externalAccountLinkControllerCreate(
3491
+ data: ExternalAccountLinkControllerCreateData
3492
+ ): CancelablePromise<ExternalAccountLinkControllerCreateResponse> {
2934
3493
  return __request(OpenAPI, {
2935
- method: 'DELETE',
2936
- url: '/api/v1/bean/platforms/{id}',
3494
+ method: 'POST',
3495
+ url: '/api/v1/{region}/bean/external-account-links',
2937
3496
  path: {
2938
- id: data.id
3497
+ region: data.region
2939
3498
  },
3499
+ body: data.requestBody,
3500
+ mediaType: 'application/json',
2940
3501
  errors: {
2941
- 404: 'Platform not found'
3502
+ 422: 'beanAccountId not owned, or an active link already exists.'
2942
3503
  }
2943
3504
  });
2944
3505
  }
2945
- }
2946
3506
 
2947
- export class ProviderSyncService {
2948
3507
  /**
2949
- * Sync transactions from financial data provider
2950
- *
2951
- * Accepts raw transactions from external financial data providers, transforms them to Beancount format, and processes them through the ingestion pipeline.
2952
- *
2953
- * **Supported Providers:**
2954
- * - **plaid**: Plaid API (US, Canada, Europe)
2955
- * - **teller**: Teller API (US)
2956
- * - **truelayer**: TrueLayer Open Banking (UK, Europe)
2957
- * - **gocardless**: GoCardless Bank Account Data (Europe)
2958
- * - **simplefin**: SimpleFIN (Self-hosted)
2959
- * - **yodlee**: Yodlee (Global)
2960
- * - **beancount-direct**: Beancount format transactions
2961
- * - **parsed-bill**: Client-side parsed bill transactions
2962
- *
2963
- * **Processing Flow:**
2964
- * 1. Transform raw data via provider adapter
2965
- * 2. Validate transaction format
2966
- * 3. Deduplicate using originalId
2967
- * 4. Classify using rule engine
2968
- * 5. Route low-confidence to Review Center
2969
- * 6. Persist validated transactions
2970
- *
3508
+ * List the user's active external account links
2971
3509
  * @param data The data for the request.
2972
- * @param data.providerName Provider name
3510
+ * @param data.provider
2973
3511
  * @param data.region Region code for tenant context
2974
- * @param data.requestBody
2975
- * @returns ProviderSyncResponseDto Sync completed successfully
3512
+ * @returns ExternalAccountLinkListResponseDto Links retrieved.
2976
3513
  * @throws ApiError
2977
3514
  */
2978
- public static providerSyncControllerSync(
2979
- data: ProviderSyncControllerSyncData
2980
- ): CancelablePromise<ProviderSyncControllerSyncResponse> {
2981
- return __request(OpenAPI, {
2982
- method: 'POST',
2983
- url: '/api/v1/{region}/bean/import/provider/{providerName}/sync',
3515
+ public static externalAccountLinkControllerFindAll(
3516
+ data: ExternalAccountLinkControllerFindAllData
3517
+ ): CancelablePromise<ExternalAccountLinkControllerFindAllResponse> {
3518
+ return __request(OpenAPI, {
3519
+ method: 'GET',
3520
+ url: '/api/v1/{region}/bean/external-account-links',
2984
3521
  path: {
2985
- providerName: data.providerName,
2986
3522
  region: data.region
2987
3523
  },
2988
- body: data.requestBody,
2989
- mediaType: 'application/json',
2990
- errors: {
2991
- 400: 'Invalid request data',
2992
- 401: 'Missing or invalid authentication',
2993
- 404: 'Provider not supported'
3524
+ query: {
3525
+ provider: data.provider
2994
3526
  }
2995
3527
  });
2996
3528
  }
2997
3529
 
2998
3530
  /**
2999
- * Get supported providers
3000
- * Returns a list of all providers supported by the sync endpoint.
3531
+ * Get a single external account link
3001
3532
  * @param data The data for the request.
3533
+ * @param data.id
3002
3534
  * @param data.region Region code for tenant context
3003
- * @returns SupportedProvidersResponseDto List of supported providers
3535
+ * @returns ExternalAccountLinkResponseDto Link retrieved.
3004
3536
  * @throws ApiError
3005
3537
  */
3006
- public static providerSyncControllerGetSupportedProviders(
3007
- data: ProviderSyncControllerGetSupportedProvidersData
3008
- ): CancelablePromise<ProviderSyncControllerGetSupportedProvidersResponse> {
3538
+ public static externalAccountLinkControllerFindOne(
3539
+ data: ExternalAccountLinkControllerFindOneData
3540
+ ): CancelablePromise<ExternalAccountLinkControllerFindOneResponse> {
3009
3541
  return __request(OpenAPI, {
3010
3542
  method: 'GET',
3011
- url: '/api/v1/{region}/bean/import/provider/supported',
3543
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3012
3544
  path: {
3545
+ id: data.id,
3013
3546
  region: data.region
3014
3547
  },
3015
3548
  errors: {
3016
- 401: 'Missing or invalid authentication'
3549
+ 422: 'Link not found or not owned by the user.'
3017
3550
  }
3018
3551
  });
3019
3552
  }
3020
3553
 
3021
3554
  /**
3022
- * Check if provider is supported
3023
- * Returns whether a specific provider is supported.
3555
+ * Soft-delete (disconnect) an external account link
3024
3556
  * @param data The data for the request.
3025
- * @param data.providerName Provider name to check
3557
+ * @param data.id
3026
3558
  * @param data.region Region code for tenant context
3027
- * @returns unknown Provider support status
3559
+ * @returns void Link soft-deleted; historical transactions are unaffected.
3028
3560
  * @throws ApiError
3029
3561
  */
3030
- public static providerSyncControllerIsProviderSupported(
3031
- data: ProviderSyncControllerIsProviderSupportedData
3032
- ): CancelablePromise<ProviderSyncControllerIsProviderSupportedResponse> {
3562
+ public static externalAccountLinkControllerRemove(
3563
+ data: ExternalAccountLinkControllerRemoveData
3564
+ ): CancelablePromise<ExternalAccountLinkControllerRemoveResponse> {
3033
3565
  return __request(OpenAPI, {
3034
- method: 'GET',
3035
- url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
3566
+ method: 'DELETE',
3567
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3036
3568
  path: {
3037
- providerName: data.providerName,
3569
+ id: data.id,
3038
3570
  region: data.region
3039
- },
3040
- errors: {
3041
- 401: 'Missing or invalid authentication'
3042
3571
  }
3043
3572
  });
3044
3573
  }
@@ -3202,359 +3731,205 @@ export class BeanNlpService {
3202
3731
  }
3203
3732
  }
3204
3733
 
3205
- export class DashboardService {
3734
+ export class BeanPlatformsService {
3206
3735
  /**
3207
- * Get net worth overview
3208
- * Returns total net worth with breakdown of assets and liabilities
3209
- * @param data The data for the request.
3210
- * @param data.region Region code for tenant context
3211
- * @param data.date Date for balance calculation (ISO 8601 format)
3212
- * @returns NetWorthResponseDto Net worth retrieved successfully
3736
+ * Get all platforms with statistics
3737
+ * @returns unknown List of platforms with binding and account counts
3213
3738
  * @throws ApiError
3214
3739
  */
3215
- public static dashboardControllerGetNetWorth(
3216
- data: DashboardControllerGetNetWorthData
3217
- ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
3740
+ public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
3218
3741
  return __request(OpenAPI, {
3219
3742
  method: 'GET',
3220
- url: '/api/v1/{region}/dashboard/net-worth',
3221
- path: {
3222
- region: data.region
3223
- },
3224
- query: {
3225
- date: data.date
3226
- },
3227
- errors: {
3228
- 401: 'User not authenticated'
3229
- }
3743
+ url: '/api/v1/bean/platforms'
3230
3744
  });
3231
3745
  }
3232
3746
 
3233
3747
  /**
3234
- * Get accounts grouped by platform
3235
- * Returns accounts with balances grouped by financial platform
3748
+ * Create a new platform
3236
3749
  * @param data The data for the request.
3237
- * @param data.region Region code for tenant context
3238
- * @param data.groupBy Grouping strategy
3239
- * @param data.date Date for balance calculation (ISO 8601 format)
3240
- * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
3241
- * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
3750
+ * @param data.requestBody
3751
+ * @returns unknown Platform created successfully
3242
3752
  * @throws ApiError
3243
3753
  */
3244
- public static dashboardControllerGetAccounts(
3245
- data: DashboardControllerGetAccountsData
3246
- ): CancelablePromise<DashboardControllerGetAccountsResponse> {
3754
+ public static platformControllerCreate(
3755
+ data: PlatformControllerCreateData
3756
+ ): CancelablePromise<PlatformControllerCreateResponse> {
3247
3757
  return __request(OpenAPI, {
3248
- method: 'GET',
3249
- url: '/api/v1/{region}/dashboard/accounts',
3250
- path: {
3251
- region: data.region
3252
- },
3253
- query: {
3254
- groupBy: data.groupBy,
3255
- date: data.date,
3256
- accountId: data.accountId
3257
- },
3758
+ method: 'POST',
3759
+ url: '/api/v1/bean/platforms',
3760
+ body: data.requestBody,
3761
+ mediaType: 'application/json',
3258
3762
  errors: {
3259
- 401: 'User not authenticated'
3763
+ 409: 'Platform already exists'
3260
3764
  }
3261
3765
  });
3262
3766
  }
3263
3767
 
3264
3768
  /**
3265
- * Get cash flow summary
3266
- * Returns income, expenses, and savings for a monthly period
3769
+ * Get platform list for current user
3267
3770
  * @param data The data for the request.
3268
- * @param data.period Period in YYYY-MM format
3269
- * @param data.region Region code for tenant context
3270
- * @returns CashFlowResponseDto Cash flow retrieved successfully
3771
+ * @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").
3772
+ * @returns PlatformListItemDto List of platforms with user binding status
3271
3773
  * @throws ApiError
3272
3774
  */
3273
- public static dashboardControllerGetCashFlow(
3274
- data: DashboardControllerGetCashFlowData
3275
- ): CancelablePromise<DashboardControllerGetCashFlowResponse> {
3775
+ public static platformControllerGetPlatformList(
3776
+ data: PlatformControllerGetPlatformListData = {}
3777
+ ): CancelablePromise<PlatformControllerGetPlatformListResponse> {
3276
3778
  return __request(OpenAPI, {
3277
3779
  method: 'GET',
3278
- url: '/api/v1/{region}/dashboard/cash-flow',
3279
- path: {
3280
- region: data.region
3281
- },
3780
+ url: '/api/v1/bean/platforms/list',
3282
3781
  query: {
3283
- period: data.period
3284
- },
3285
- errors: {
3286
- 400: 'Invalid period format',
3287
- 401: 'User not authenticated'
3288
- }
3289
- });
3290
- }
3291
-
3292
- /**
3293
- * Get expenses grouped by functional category
3294
- * Returns expenses pre-aggregated by functional category (account-path Group segment) with server-side multi-currency conversion
3295
- * @param data The data for the request.
3296
- * @param data.region Region code for tenant context
3297
- * @param data.groupBy Grouping strategy
3298
- * @param data.period Time window (1m = current calendar month)
3299
- * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
3300
- * @throws ApiError
3301
- */
3302
- public static dashboardControllerGetExpenses(
3303
- data: DashboardControllerGetExpensesData
3304
- ): CancelablePromise<DashboardControllerGetExpensesResponse> {
3305
- return __request(OpenAPI, {
3306
- method: 'GET',
3307
- url: '/api/v1/{region}/dashboard/expenses',
3308
- path: {
3309
3782
  region: data.region
3310
- },
3311
- query: {
3312
- groupBy: data.groupBy,
3313
- period: data.period
3314
- },
3315
- errors: {
3316
- 400: 'Invalid groupBy or period',
3317
- 401: 'User not authenticated'
3318
3783
  }
3319
3784
  });
3320
3785
  }
3321
- }
3322
3786
 
3323
- export class InvestmentService {
3324
3787
  /**
3325
- * Get per-holding unrealized + realized P&L
3326
- * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3788
+ * Match platforms by name or alias
3327
3789
  * @param data The data for the request.
3328
- * @param data.region Region code for tenant context
3329
- * @param data.asOf As-of date (ISO 8601), defaults to today
3330
- * @param data.accountId Scope to a single account
3331
- * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
3332
- * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3790
+ * @param data.q Search query — Chinese name, English name, or abbreviation
3791
+ * @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").
3792
+ * @returns PlatformMatchResponseDto Matching platforms with overall match type and truncation flag
3333
3793
  * @throws ApiError
3334
3794
  */
3335
- public static holdingPnlControllerGetHoldingPnl(
3336
- data: HoldingPnlControllerGetHoldingPnlData
3337
- ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3795
+ public static platformControllerMatchPlatforms(
3796
+ data: PlatformControllerMatchPlatformsData
3797
+ ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3338
3798
  return __request(OpenAPI, {
3339
3799
  method: 'GET',
3340
- url: '/api/v1/{region}/investment/holdings/pnl',
3341
- path: {
3342
- region: data.region
3343
- },
3800
+ url: '/api/v1/bean/platforms/match',
3344
3801
  query: {
3345
- asOf: data.asOf,
3346
- accountId: data.accountId,
3347
- method: data.method
3348
- },
3349
- errors: {
3350
- 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
3351
- 401: 'User not authenticated'
3352
- }
3353
- });
3354
- }
3355
- }
3356
-
3357
- export class BeanPricesService {
3358
- /**
3359
- * Create a new price
3360
- * Creates a new price entry for the authenticated user
3361
- * @param data The data for the request.
3362
- * @param data.region Region code for tenant context
3363
- * @param data.requestBody
3364
- * @returns PriceResponseDto Price created successfully
3365
- * @throws ApiError
3366
- */
3367
- public static priceControllerCreate(
3368
- data: PriceControllerCreateData
3369
- ): CancelablePromise<PriceControllerCreateResponse> {
3370
- return __request(OpenAPI, {
3371
- method: 'POST',
3372
- url: '/api/v1/{region}/bean/prices',
3373
- path: {
3802
+ q: data.q,
3374
3803
  region: data.region
3375
- },
3376
- body: data.requestBody,
3377
- mediaType: 'application/json',
3378
- errors: {
3379
- 404: 'Currency or quoteCurrency commodity not found',
3380
- 409: 'Price already exists for this currency pair and date'
3381
3804
  }
3382
3805
  });
3383
3806
  }
3384
3807
 
3385
3808
  /**
3386
- * List user prices
3387
- * Returns all price entries for the authenticated user with optional filtering
3809
+ * Get the region and candidate account standards for a platform
3388
3810
  * @param data The data for the request.
3389
- * @param data.region Region code for tenant context
3390
- * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
3391
- * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
3392
- * @param data.dateFrom Filter prices from this date (ISO 8601 format)
3393
- * @param data.dateTo Filter prices to this date (ISO 8601 format)
3394
- * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
3395
- * @param data.page Page number for pagination (default: 1)
3396
- * @param data.limit Number of items per page (default: 20, max: 100)
3397
- * @returns PriceListResponseDto Prices retrieved successfully
3811
+ * @param data.id Platform ID (from a match result)
3812
+ * @param data.region Region code (ISO 3166-1 alpha-2, case-insensitive). Required for global platforms (countryCode null) — resolved as their template region; ignored when the platform has its own countryCode.
3813
+ * @param data.type Filter templates by account type (path first segment)
3814
+ * @returns PlatformStandardsResponseDto Resolved region plus the merged account-standard catalog of that region (groupable by productCategory client-side)
3398
3815
  * @throws ApiError
3399
3816
  */
3400
- public static priceControllerFindAll(
3401
- data: PriceControllerFindAllData
3402
- ): CancelablePromise<PriceControllerFindAllResponse> {
3817
+ public static platformControllerGetPlatformStandards(
3818
+ data: PlatformControllerGetPlatformStandardsData
3819
+ ): CancelablePromise<PlatformControllerGetPlatformStandardsResponse> {
3403
3820
  return __request(OpenAPI, {
3404
3821
  method: 'GET',
3405
- url: '/api/v1/{region}/bean/prices',
3822
+ url: '/api/v1/bean/platforms/{id}/standards',
3406
3823
  path: {
3407
- region: data.region
3824
+ id: data.id
3408
3825
  },
3409
3826
  query: {
3410
- currency: data.currency,
3411
- quoteCurrency: data.quoteCurrency,
3412
- dateFrom: data.dateFrom,
3413
- dateTo: data.dateTo,
3414
- search: data.search,
3415
- page: data.page,
3416
- limit: data.limit
3417
- }
3418
- });
3419
- }
3420
-
3421
- /**
3422
- * Get price by ID
3423
- * Returns a single price entry by its ID
3424
- * @param data The data for the request.
3425
- * @param data.id Price ID
3426
- * @param data.region Region code for tenant context
3427
- * @returns PriceResponseDto Price retrieved successfully
3428
- * @throws ApiError
3429
- */
3430
- public static priceControllerFindOne(
3431
- data: PriceControllerFindOneData
3432
- ): CancelablePromise<PriceControllerFindOneResponse> {
3433
- return __request(OpenAPI, {
3434
- method: 'GET',
3435
- url: '/api/v1/{region}/bean/prices/{id}',
3436
- path: {
3437
- id: data.id,
3438
- region: data.region
3439
- },
3440
- errors: {
3441
- 404: 'Price not found'
3827
+ region: data.region,
3828
+ type: data.type
3442
3829
  }
3443
3830
  });
3444
3831
  }
3445
3832
 
3446
3833
  /**
3447
- * Update a price
3448
- * Updates an existing price entry
3834
+ * Update a platform
3449
3835
  * @param data The data for the request.
3450
- * @param data.id Price ID
3451
- * @param data.region Region code for tenant context
3836
+ * @param data.id Platform ID
3452
3837
  * @param data.requestBody
3453
- * @returns PriceResponseDto Price updated successfully
3838
+ * @returns unknown Platform updated successfully
3454
3839
  * @throws ApiError
3455
3840
  */
3456
- public static priceControllerUpdate(
3457
- data: PriceControllerUpdateData
3458
- ): CancelablePromise<PriceControllerUpdateResponse> {
3841
+ public static platformControllerUpdate(
3842
+ data: PlatformControllerUpdateData
3843
+ ): CancelablePromise<PlatformControllerUpdateResponse> {
3459
3844
  return __request(OpenAPI, {
3460
3845
  method: 'PUT',
3461
- url: '/api/v1/{region}/bean/prices/{id}',
3846
+ url: '/api/v1/bean/platforms/{id}',
3462
3847
  path: {
3463
- id: data.id,
3464
- region: data.region
3848
+ id: data.id
3465
3849
  },
3466
3850
  body: data.requestBody,
3467
3851
  mediaType: 'application/json',
3468
3852
  errors: {
3469
- 404: 'Price not found',
3470
- 409: 'Updated price conflicts with existing price'
3853
+ 404: 'Platform not found'
3471
3854
  }
3472
3855
  });
3473
3856
  }
3474
3857
 
3475
3858
  /**
3476
- * Delete a price
3477
- * Deletes a price entry (hard delete)
3859
+ * Delete a platform
3478
3860
  * @param data The data for the request.
3479
- * @param data.id Price ID
3480
- * @param data.region Region code for tenant context
3481
- * @returns void Price deleted successfully
3861
+ * @param data.id Platform ID
3862
+ * @returns void Platform deleted successfully
3482
3863
  * @throws ApiError
3483
3864
  */
3484
- public static priceControllerDelete(
3485
- data: PriceControllerDeleteData
3486
- ): CancelablePromise<PriceControllerDeleteResponse> {
3865
+ public static platformControllerDelete(
3866
+ data: PlatformControllerDeleteData
3867
+ ): CancelablePromise<PlatformControllerDeleteResponse> {
3487
3868
  return __request(OpenAPI, {
3488
3869
  method: 'DELETE',
3489
- url: '/api/v1/{region}/bean/prices/{id}',
3870
+ url: '/api/v1/bean/platforms/{id}',
3490
3871
  path: {
3491
- id: data.id,
3492
- region: data.region
3872
+ id: data.id
3493
3873
  },
3494
3874
  errors: {
3495
- 404: 'Price not found'
3875
+ 404: 'Platform not found'
3496
3876
  }
3497
3877
  });
3498
3878
  }
3879
+ }
3499
3880
 
3881
+ export class DashboardService {
3500
3882
  /**
3501
- * Bulk create prices
3502
- * Creates multiple price entries at once (skips duplicates)
3883
+ * Get net worth overview
3884
+ * Returns total net worth with breakdown of assets and liabilities
3503
3885
  * @param data The data for the request.
3504
3886
  * @param data.region Region code for tenant context
3505
- * @param data.requestBody
3506
- * @returns PriceResponseDto Prices created successfully
3887
+ * @param data.date Date for balance calculation (ISO 8601 format)
3888
+ * @returns NetWorthResponseDto Net worth retrieved successfully
3507
3889
  * @throws ApiError
3508
3890
  */
3509
- public static priceControllerBulkCreate(
3510
- data: PriceControllerBulkCreateData
3511
- ): CancelablePromise<PriceControllerBulkCreateResponse> {
3891
+ public static dashboardControllerGetNetWorth(
3892
+ data: DashboardControllerGetNetWorthData
3893
+ ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
3512
3894
  return __request(OpenAPI, {
3513
- method: 'POST',
3514
- url: '/api/v1/{region}/bean/prices/bulk',
3895
+ method: 'GET',
3896
+ url: '/api/v1/{region}/dashboard/net-worth',
3515
3897
  path: {
3516
3898
  region: data.region
3517
3899
  },
3518
- body: data.requestBody,
3519
- mediaType: 'application/json'
3900
+ query: {
3901
+ date: data.date
3902
+ },
3903
+ errors: {
3904
+ 401: 'User not authenticated'
3905
+ }
3520
3906
  });
3521
3907
  }
3522
- }
3523
3908
 
3524
- export class ReportingService {
3525
3909
  /**
3526
- * Get portfolio value trends
3527
- *
3528
- * Returns time series data of portfolio net worth.
3529
- *
3530
- * **Multi-currency Support:**
3531
- * - `series[].byCurrency` - Currency breakdown for each data point
3532
- * - `byCurrency` - Separate time series grouped by currency
3533
- * - `warnings` - Exchange rate warnings if conversion failed
3534
- *
3535
- * **Parameters:**
3536
- * - `period`: Time period (1m, 3m, 6m, 1y)
3537
- * - `granularity`: Data granularity (day, week, month)
3538
- *
3910
+ * Get accounts grouped by platform
3911
+ * Returns accounts with balances grouped by financial platform
3539
3912
  * @param data The data for the request.
3540
3913
  * @param data.region Region code for tenant context
3541
- * @param data.period Time period
3542
- * @param data.granularity Data granularity
3543
- * @returns PortfolioTrendsResponseDto Trends retrieved successfully
3914
+ * @param data.groupBy Grouping strategy
3915
+ * @param data.date Date for balance calculation (ISO 8601 format)
3916
+ * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
3917
+ * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
3544
3918
  * @throws ApiError
3545
3919
  */
3546
- public static reportingControllerGetPortfolioTrends(
3547
- data: ReportingControllerGetPortfolioTrendsData
3548
- ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
3920
+ public static dashboardControllerGetAccounts(
3921
+ data: DashboardControllerGetAccountsData
3922
+ ): CancelablePromise<DashboardControllerGetAccountsResponse> {
3549
3923
  return __request(OpenAPI, {
3550
3924
  method: 'GET',
3551
- url: '/api/v1/{region}/reporting/portfolio/trends',
3925
+ url: '/api/v1/{region}/dashboard/accounts',
3552
3926
  path: {
3553
3927
  region: data.region
3554
3928
  },
3555
3929
  query: {
3556
- period: data.period,
3557
- granularity: data.granularity
3930
+ groupBy: data.groupBy,
3931
+ date: data.date,
3932
+ accountId: data.accountId
3558
3933
  },
3559
3934
  errors: {
3560
3935
  401: 'User not authenticated'
@@ -3563,116 +3938,95 @@ export class ReportingService {
3563
3938
  }
3564
3939
 
3565
3940
  /**
3566
- * Get cash-flow trends
3567
- *
3568
- * Monthly income / expense / netSavings over a fixed N-month window
3569
- * (current month + N−1 prior). Missing months are zero-filled (flow metric).
3570
- *
3571
- * **Parameters:**
3572
- * - `period`: 1m | 3m | 6m | 1y (default 6m)
3573
- * - `granularity`: accepted for API symmetry; v1 returns month buckets
3574
- *
3941
+ * Get cash flow summary
3942
+ * Returns income, expenses, and savings for a monthly period
3575
3943
  * @param data The data for the request.
3944
+ * @param data.period Period in YYYY-MM format
3576
3945
  * @param data.region Region code for tenant context
3577
- * @param data.period Time period
3578
- * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
3579
- * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
3946
+ * @returns CashFlowResponseDto Cash flow retrieved successfully
3580
3947
  * @throws ApiError
3581
3948
  */
3582
- public static reportingControllerGetCashFlowTrends(
3583
- data: ReportingControllerGetCashFlowTrendsData
3584
- ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
3949
+ public static dashboardControllerGetCashFlow(
3950
+ data: DashboardControllerGetCashFlowData
3951
+ ): CancelablePromise<DashboardControllerGetCashFlowResponse> {
3585
3952
  return __request(OpenAPI, {
3586
3953
  method: 'GET',
3587
- url: '/api/v1/{region}/reporting/cash-flow/trends',
3954
+ url: '/api/v1/{region}/dashboard/cash-flow',
3588
3955
  path: {
3589
3956
  region: data.region
3590
3957
  },
3591
3958
  query: {
3592
- period: data.period,
3593
- granularity: data.granularity
3959
+ period: data.period
3594
3960
  },
3595
3961
  errors: {
3962
+ 400: 'Invalid period format',
3596
3963
  401: 'User not authenticated'
3597
3964
  }
3598
3965
  });
3599
3966
  }
3600
3967
 
3601
3968
  /**
3602
- * Generate portfolio snapshot
3603
- *
3604
- * Manually generate a portfolio snapshot for a specific date.
3605
- *
3606
- * **Multi-currency Support:**
3607
- * - Fetches balances grouped by currency
3608
- * - Uses user's baseCurrency setting for conversion
3609
- * - Stores exchange rates and warnings
3610
- *
3611
- * **Use Cases:**
3612
- * - Testing snapshot generation
3613
- * - Force regeneration after data correction
3614
- * - Initial setup for new users
3615
- *
3969
+ * Get expenses/income grouped by functional category
3970
+ * 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)
3616
3971
  * @param data The data for the request.
3617
3972
  * @param data.region Region code for tenant context
3618
- * @param data.requestBody Optional date (defaults to today)
3619
- * @returns GenerateSnapshotResponse Snapshot generated successfully
3973
+ * @param data.groupBy Grouping strategy
3974
+ * @param data.period Time window (1m = current calendar month)
3975
+ * @param data.flow Account root to aggregate (expense → ^Expenses:, income → ^Income:)
3976
+ * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
3620
3977
  * @throws ApiError
3621
3978
  */
3622
- public static reportingControllerGenerateSnapshot(
3623
- data: ReportingControllerGenerateSnapshotData
3624
- ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
3979
+ public static dashboardControllerGetExpenses(
3980
+ data: DashboardControllerGetExpensesData
3981
+ ): CancelablePromise<DashboardControllerGetExpensesResponse> {
3625
3982
  return __request(OpenAPI, {
3626
- method: 'POST',
3627
- url: '/api/v1/{region}/reporting/snapshots/generate',
3983
+ method: 'GET',
3984
+ url: '/api/v1/{region}/dashboard/expenses',
3628
3985
  path: {
3629
3986
  region: data.region
3630
3987
  },
3631
- body: data.requestBody,
3632
- mediaType: 'application/json',
3988
+ query: {
3989
+ groupBy: data.groupBy,
3990
+ period: data.period,
3991
+ flow: data.flow
3992
+ },
3633
3993
  errors: {
3634
- 400: 'Invalid date format',
3994
+ 400: 'Invalid groupBy or period',
3635
3995
  401: 'User not authenticated'
3636
3996
  }
3637
3997
  });
3638
3998
  }
3999
+ }
3639
4000
 
4001
+ export class InvestmentService {
3640
4002
  /**
3641
- * Backfill portfolio snapshots
3642
- *
3643
- * Generate snapshots for a date range (historical data backfill).
3644
- *
3645
- * **Multi-currency Support:**
3646
- * - Each snapshot includes multi-currency data
3647
- * - Uses exchange rates available at generation time
3648
- * - Warnings stored for missing exchange rates
3649
- *
3650
- * **Best Practices:**
3651
- * - Use for initial setup after account configuration
3652
- * - Run during low-traffic periods for large date ranges
3653
- * - Existing snapshots are skipped (not regenerated)
3654
- *
4003
+ * Get per-holding unrealized + realized P&L
4004
+ * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3655
4005
  * @param data The data for the request.
3656
4006
  * @param data.region Region code for tenant context
3657
- * @param data.requestBody
3658
- * @returns BackfillSnapshotsResponse Backfill completed successfully
4007
+ * @param data.asOf As-of date (ISO 8601), defaults to today
4008
+ * @param data.accountId Scope to a single account
4009
+ * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
4010
+ * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3659
4011
  * @throws ApiError
3660
4012
  */
3661
- public static reportingControllerBackfillSnapshots(
3662
- data: ReportingControllerBackfillSnapshotsData
3663
- ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
4013
+ public static holdingPnlControllerGetHoldingPnl(
4014
+ data: HoldingPnlControllerGetHoldingPnlData
4015
+ ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3664
4016
  return __request(OpenAPI, {
3665
- method: 'POST',
3666
- url: '/api/v1/{region}/reporting/snapshots/backfill',
4017
+ method: 'GET',
4018
+ url: '/api/v1/{region}/investment/holdings/pnl',
3667
4019
  path: {
3668
4020
  region: data.region
3669
4021
  },
3670
- body: data.requestBody,
3671
- mediaType: 'application/json',
4022
+ query: {
4023
+ asOf: data.asOf,
4024
+ accountId: data.accountId,
4025
+ method: data.method
4026
+ },
3672
4027
  errors: {
3673
- 400: 'Invalid date format or range',
3674
- 401: 'User not authenticated',
3675
- 409: 'Backfill already in progress for this user'
4028
+ 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
4029
+ 401: 'User not authenticated'
3676
4030
  }
3677
4031
  });
3678
4032
  }
@@ -3701,7 +4055,7 @@ export class AuthService {
3701
4055
  * Anonymous login with access token
3702
4056
  * @param data The data for the request.
3703
4057
  * @param data.requestBody
3704
- * @returns unknown Login successful
4058
+ * @returns AnonymousLoginResponseDto Login successful
3705
4059
  * @throws ApiError
3706
4060
  */
3707
4061
  public static authControllerAccessTokenLogin(
@@ -3719,15 +4073,52 @@ export class AuthService {
3719
4073
  }
3720
4074
  }
3721
4075
 
3722
- export class DefaultService {
4076
+ export class CommunityService {
4077
+ /**
4078
+ * Relay a sanitized parser-contribution payload
4079
+ * A server-side bot re-sanitizes the payload and opens an issue on the target repository; the issue URL is returned. The payload is never persisted or logged (forward-and-drop).
4080
+ * @param data The data for the request.
4081
+ * @param data.region Region code for tenant context (routing only; the institution region rides in the payload meta)
4082
+ * @param data.requestBody
4083
+ * @returns ParserContributionRelayResponseDto Issue created by the bot
4084
+ * @throws ApiError
4085
+ */
4086
+ public static parserContributionControllerCreate(
4087
+ data: ParserContributionControllerCreateData
4088
+ ): CancelablePromise<ParserContributionControllerCreateResponse> {
4089
+ return __request(OpenAPI, {
4090
+ method: 'POST',
4091
+ url: '/api/v1/{region}/community/parser-contributions',
4092
+ path: {
4093
+ region: data.region
4094
+ },
4095
+ body: data.requestBody,
4096
+ mediaType: 'application/json',
4097
+ errors: {
4098
+ 401: 'Unauthorized',
4099
+ 422: 'Validation failed (institution slug, empty samples, row/cell size limits)',
4100
+ 429: 'Rate limited (5 submissions per user per hour)',
4101
+ 501: 'Relay not configured on this deployment — clients fall back to the clipboard flow',
4102
+ 502: 'GitHub bot failure (upstream), safe to retry'
4103
+ }
4104
+ });
4105
+ }
4106
+ }
4107
+
4108
+ export class AdminCacheService {
3723
4109
  /**
3724
- * @returns unknown
4110
+ * Flush entire cache (L1 + L2)
4111
+ * Clears ALL cache entries across ALL namespaces and users. Use only for emergency cache corruption recovery, maintenance-window refresh, or development resets.
4112
+ * @returns unknown Cache flushed successfully
3725
4113
  * @throws ApiError
3726
4114
  */
3727
4115
  public static cacheControllerFlushCache(): CancelablePromise<CacheControllerFlushCacheResponse> {
3728
4116
  return __request(OpenAPI, {
3729
4117
  method: 'POST',
3730
- url: '/api/v1/cache/flush'
4118
+ url: '/api/v1/cache/flush',
4119
+ errors: {
4120
+ 403: 'Admin access required'
4121
+ }
3731
4122
  });
3732
4123
  }
3733
4124
  }
@@ -3888,3 +4279,53 @@ export class InfoService {
3888
4279
  });
3889
4280
  }
3890
4281
  }
4282
+
4283
+ export class MarketDataService {
4284
+ /**
4285
+ * Search market symbols by name or code
4286
+ * Ranked search over the openbb catalog. Empty `q` returns [].
4287
+ * @param data The data for the request.
4288
+ * @param data.q Search term — matched against symbol and instrument name. Empty string returns [].
4289
+ * @param data.limit Maximum number of results (clamped 1..50)
4290
+ * @param data.exchange Filter by exchange code (e.g. US, HK, SS, SZ)
4291
+ * @param data.assetType Filter by OpenBB asset_type (e.g. stock, etf)
4292
+ * @returns SymbolSearchResultDto Ranked search results
4293
+ * @throws ApiError
4294
+ */
4295
+ public static symbolControllerSearch(
4296
+ data: SymbolControllerSearchData
4297
+ ): CancelablePromise<SymbolControllerSearchResponse> {
4298
+ return __request(OpenAPI, {
4299
+ method: 'GET',
4300
+ url: '/api/v1/market/symbols/search',
4301
+ query: {
4302
+ q: data.q,
4303
+ limit: data.limit,
4304
+ exchange: data.exchange,
4305
+ assetType: data.assetType
4306
+ }
4307
+ });
4308
+ }
4309
+
4310
+ /**
4311
+ * Get a market symbol quote
4312
+ * @param data The data for the request.
4313
+ * @param data.symbol
4314
+ * @returns SymbolQuoteDto Symbol quote
4315
+ * @throws ApiError
4316
+ */
4317
+ public static symbolControllerGetQuote(
4318
+ data: SymbolControllerGetQuoteData
4319
+ ): CancelablePromise<SymbolControllerGetQuoteResponse> {
4320
+ return __request(OpenAPI, {
4321
+ method: 'GET',
4322
+ url: '/api/v1/market/symbols/{symbol}/quote',
4323
+ path: {
4324
+ symbol: data.symbol
4325
+ },
4326
+ errors: {
4327
+ 404: 'Symbol not found in the openbb catalog'
4328
+ }
4329
+ });
4330
+ }
4331
+ }