@firela/api-types 0.0.0-canary.a4e21680 → 0.0.0-canary.a5198363

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,18 @@ import type {
97
99
  CommodityControllerGetOrCreateResponse,
98
100
  CommodityControllerBulkCreateData,
99
101
  CommodityControllerBulkCreateResponse,
102
+ PriceControllerCreateData,
103
+ PriceControllerCreateResponse,
104
+ PriceControllerFindAllData,
105
+ PriceControllerFindAllResponse,
106
+ PriceControllerFindOneData,
107
+ PriceControllerFindOneResponse,
108
+ PriceControllerUpdateData,
109
+ PriceControllerUpdateResponse,
110
+ PriceControllerDeleteData,
111
+ PriceControllerDeleteResponse,
112
+ PriceControllerBulkCreateData,
113
+ PriceControllerBulkCreateResponse,
100
114
  RecurringRuleControllerCreateData,
101
115
  RecurringRuleControllerCreateResponse,
102
116
  RecurringRuleControllerFindAllData,
@@ -129,26 +143,14 @@ import type {
129
143
  ExpectedTransactionControllerEnterNowResponse,
130
144
  ForecastControllerGetForecastData,
131
145
  ForecastControllerGetForecastResponse,
132
- TransactionRuleControllerCreateData,
133
- TransactionRuleControllerCreateResponse,
134
- TransactionRuleControllerListData,
135
- TransactionRuleControllerListResponse,
136
- TransactionRuleControllerValidateData,
137
- TransactionRuleControllerValidateResponse,
138
- TransactionRuleControllerBulkCreateData,
139
- TransactionRuleControllerBulkCreateResponse,
140
- TransactionRuleControllerExportData,
141
- TransactionRuleControllerExportResponse,
142
- TransactionRuleControllerGetStatisticsData,
143
- TransactionRuleControllerGetStatisticsResponse,
144
- TransactionRuleControllerGetDetailData,
145
- TransactionRuleControllerGetDetailResponse,
146
- TransactionRuleControllerUpdateData,
147
- TransactionRuleControllerUpdateResponse,
148
- TransactionRuleControllerDeleteData,
149
- TransactionRuleControllerDeleteResponse,
150
- TransactionRuleControllerTestData,
151
- TransactionRuleControllerTestResponse,
146
+ ReportingControllerGetPortfolioTrendsData,
147
+ ReportingControllerGetPortfolioTrendsResponse,
148
+ ReportingControllerGetCashFlowTrendsData,
149
+ ReportingControllerGetCashFlowTrendsResponse,
150
+ ReportingControllerGenerateSnapshotData,
151
+ ReportingControllerGenerateSnapshotResponse,
152
+ ReportingControllerBackfillSnapshotsData,
153
+ ReportingControllerBackfillSnapshotsResponse,
152
154
  UserControllerDeleteOwnUserData,
153
155
  UserControllerDeleteOwnUserResponse,
154
156
  UserControllerGetUserData,
@@ -171,6 +173,26 @@ import type {
171
173
  PropertyControllerUpdateResponse,
172
174
  PropertyControllerDeleteData,
173
175
  PropertyControllerDeleteResponse,
176
+ TransactionRuleControllerCreateData,
177
+ TransactionRuleControllerCreateResponse,
178
+ TransactionRuleControllerListData,
179
+ TransactionRuleControllerListResponse,
180
+ TransactionRuleControllerValidateData,
181
+ TransactionRuleControllerValidateResponse,
182
+ TransactionRuleControllerBulkCreateData,
183
+ TransactionRuleControllerBulkCreateResponse,
184
+ TransactionRuleControllerExportData,
185
+ TransactionRuleControllerExportResponse,
186
+ TransactionRuleControllerGetStatisticsData,
187
+ TransactionRuleControllerGetStatisticsResponse,
188
+ TransactionRuleControllerGetDetailData,
189
+ TransactionRuleControllerGetDetailResponse,
190
+ TransactionRuleControllerUpdateData,
191
+ TransactionRuleControllerUpdateResponse,
192
+ TransactionRuleControllerDeleteData,
193
+ TransactionRuleControllerDeleteResponse,
194
+ TransactionRuleControllerTestData,
195
+ TransactionRuleControllerTestResponse,
174
196
  EventControllerCreateData,
175
197
  EventControllerCreateResponse,
176
198
  EventControllerFindAllData,
@@ -183,6 +205,8 @@ import type {
183
205
  EventControllerDeleteResponse,
184
206
  EventControllerGetSliceData,
185
207
  EventControllerGetSliceResponse,
208
+ OnboardingControllerBootstrapData,
209
+ OnboardingControllerBootstrapResponse,
186
210
  ReconciliationControllerComputeData,
187
211
  ReconciliationControllerComputeResponse,
188
212
  ReconciliationControllerAssertData,
@@ -204,22 +228,20 @@ import type {
204
228
  ImporterConfigControllerUpdateConfigResponse,
205
229
  ImporterConfigControllerResetConfigData,
206
230
  ImporterConfigControllerResetConfigResponse,
207
- PlatformControllerFindAllResponse,
208
- PlatformControllerCreateData,
209
- PlatformControllerCreateResponse,
210
- PlatformControllerGetPlatformListResponse,
211
- PlatformControllerMatchPlatformsData,
212
- PlatformControllerMatchPlatformsResponse,
213
- PlatformControllerUpdateData,
214
- PlatformControllerUpdateResponse,
215
- PlatformControllerDeleteData,
216
- PlatformControllerDeleteResponse,
217
231
  ProviderSyncControllerSyncData,
218
232
  ProviderSyncControllerSyncResponse,
219
233
  ProviderSyncControllerGetSupportedProvidersData,
220
234
  ProviderSyncControllerGetSupportedProvidersResponse,
221
235
  ProviderSyncControllerIsProviderSupportedData,
222
236
  ProviderSyncControllerIsProviderSupportedResponse,
237
+ ExternalAccountLinkControllerCreateData,
238
+ ExternalAccountLinkControllerCreateResponse,
239
+ ExternalAccountLinkControllerFindAllData,
240
+ ExternalAccountLinkControllerFindAllResponse,
241
+ ExternalAccountLinkControllerFindOneData,
242
+ ExternalAccountLinkControllerFindOneResponse,
243
+ ExternalAccountLinkControllerRemoveData,
244
+ ExternalAccountLinkControllerRemoveResponse,
223
245
  TelemetryControllerReportTelemetryData,
224
246
  TelemetryControllerReportTelemetryResponse,
225
247
  TelemetryControllerReportCoverageMissData,
@@ -232,6 +254,16 @@ import type {
232
254
  NlpControllerClearSessionResponse,
233
255
  NlpControllerGetSessionData,
234
256
  NlpControllerGetSessionResponse,
257
+ PlatformControllerFindAllResponse,
258
+ PlatformControllerCreateData,
259
+ PlatformControllerCreateResponse,
260
+ PlatformControllerGetPlatformListResponse,
261
+ PlatformControllerMatchPlatformsData,
262
+ PlatformControllerMatchPlatformsResponse,
263
+ PlatformControllerUpdateData,
264
+ PlatformControllerUpdateResponse,
265
+ PlatformControllerDeleteData,
266
+ PlatformControllerDeleteResponse,
235
267
  DashboardControllerGetNetWorthData,
236
268
  DashboardControllerGetNetWorthResponse,
237
269
  DashboardControllerGetAccountsData,
@@ -242,26 +274,6 @@ import type {
242
274
  DashboardControllerGetExpensesResponse,
243
275
  HoldingPnlControllerGetHoldingPnlData,
244
276
  HoldingPnlControllerGetHoldingPnlResponse,
245
- PriceControllerCreateData,
246
- PriceControllerCreateResponse,
247
- PriceControllerFindAllData,
248
- PriceControllerFindAllResponse,
249
- PriceControllerFindOneData,
250
- PriceControllerFindOneResponse,
251
- PriceControllerUpdateData,
252
- PriceControllerUpdateResponse,
253
- PriceControllerDeleteData,
254
- PriceControllerDeleteResponse,
255
- PriceControllerBulkCreateData,
256
- PriceControllerBulkCreateResponse,
257
- ReportingControllerGetPortfolioTrendsData,
258
- ReportingControllerGetPortfolioTrendsResponse,
259
- ReportingControllerGetCashFlowTrendsData,
260
- ReportingControllerGetCashFlowTrendsResponse,
261
- ReportingControllerGenerateSnapshotData,
262
- ReportingControllerGenerateSnapshotResponse,
263
- ReportingControllerBackfillSnapshotsData,
264
- ReportingControllerBackfillSnapshotsResponse,
265
277
  ApiKeysControllerCreateApiKeyResponse,
266
278
  AuthControllerAccessTokenLoginData,
267
279
  AuthControllerAccessTokenLoginResponse,
@@ -276,7 +288,11 @@ import type {
276
288
  HealthControllerResetCircuitBreakerData,
277
289
  HealthControllerResetCircuitBreakerResponse,
278
290
  HealthControllerGetMetricsResponse,
279
- InfoControllerGetInfoResponse
291
+ InfoControllerGetInfoResponse,
292
+ SymbolControllerSearchData,
293
+ SymbolControllerSearchResponse,
294
+ SymbolControllerGetQuoteData,
295
+ SymbolControllerGetQuoteResponse
280
296
  } from './types.gen';
281
297
 
282
298
  export class BeanAccountsService {
@@ -314,7 +330,7 @@ export class BeanAccountsService {
314
330
  * @param data.type Filter by account type
315
331
  * @param data.status Filter by status
316
332
  * @param data.isCustom Filter by custom (user-created) accounts only
317
- * @param data.search Search term for path or i18nKey
333
+ * @param data.search Search term for account path
318
334
  * @param data.limit Maximum number of results
319
335
  * @param data.offset Number of results to skip
320
336
  * @returns AccountListResponseDto Accounts retrieved successfully
@@ -476,6 +492,35 @@ export class BeanAccountsService {
476
492
  }
477
493
  });
478
494
  }
495
+
496
+ /**
497
+ * Post an opening-balance transaction
498
+ * 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.
499
+ * @param data The data for the request.
500
+ * @param data.id Account UUID
501
+ * @param data.region Region code for tenant context
502
+ * @param data.requestBody
503
+ * @returns OpeningBalanceResultDto Opening-balance transaction created
504
+ * @throws ApiError
505
+ */
506
+ public static accountControllerAddOpeningBalance(
507
+ data: AccountControllerAddOpeningBalanceData
508
+ ): CancelablePromise<AccountControllerAddOpeningBalanceResponse> {
509
+ return __request(OpenAPI, {
510
+ method: 'POST',
511
+ url: '/api/v1/{region}/bean/accounts/{id}/opening-balance',
512
+ path: {
513
+ id: data.id,
514
+ region: data.region
515
+ },
516
+ body: data.requestBody,
517
+ mediaType: 'application/json',
518
+ errors: {
519
+ 404: 'Account not found',
520
+ 409: 'An opening balance already exists for this account'
521
+ }
522
+ });
523
+ }
479
524
  }
480
525
 
481
526
  export class BeanAccountStandardsService {
@@ -507,7 +552,7 @@ export class BeanAccountStandardsService {
507
552
 
508
553
  /**
509
554
  * Get template metadata for an account path
510
- * Returns extendable status and root type for a template path.
555
+ * Returns root type for a template path.
511
556
  * @param data The data for the request.
512
557
  * @param data.region Region code for tenant context
513
558
  * @param data.path Account path to check
@@ -802,7 +847,7 @@ export class BeanBalancesService {
802
847
  * Query account balance
803
848
  * Calculate account balance at a specific date for a single currency
804
849
  * @param data The data for the request.
805
- * @param data.account Account name (e.g., "Assets:Bank:Checking")
850
+ * @param data.account Account name (e.g., "Assets:Checking")
806
851
  * @param data.region Region code for tenant context
807
852
  * @param data.date Date to calculate balance at (ISO 8601 format)
808
853
  * @param data.currency Currency to query (e.g., "USD", "CNY")
@@ -1523,153 +1568,320 @@ export class BeanCommoditiesService {
1523
1568
  }
1524
1569
  }
1525
1570
 
1526
- export class RecurringRulesService {
1571
+ export class BeanPricesService {
1527
1572
  /**
1528
- * Create a new recurring rule
1529
- * Creates a new recurring transaction rule for the authenticated user
1573
+ * Create a new price
1574
+ * Creates a new price entry for the authenticated user
1530
1575
  * @param data The data for the request.
1531
1576
  * @param data.region Region code for tenant context
1532
1577
  * @param data.requestBody
1533
- * @returns RecurringRuleResponseDto Rule created successfully
1578
+ * @returns PriceResponseDto Price created successfully
1534
1579
  * @throws ApiError
1535
1580
  */
1536
- public static recurringRuleControllerCreate(
1537
- data: RecurringRuleControllerCreateData
1538
- ): CancelablePromise<RecurringRuleControllerCreateResponse> {
1581
+ public static priceControllerCreate(
1582
+ data: PriceControllerCreateData
1583
+ ): CancelablePromise<PriceControllerCreateResponse> {
1539
1584
  return __request(OpenAPI, {
1540
1585
  method: 'POST',
1541
- url: '/api/v1/{region}/bean/recurring-rules',
1586
+ url: '/api/v1/{region}/bean/prices',
1542
1587
  path: {
1543
1588
  region: data.region
1544
1589
  },
1545
1590
  body: data.requestBody,
1546
1591
  mediaType: 'application/json',
1547
1592
  errors: {
1548
- 400: 'Invalid input data (e.g., autoCreate without accounts)',
1549
- 409: 'Rule with same name already exists'
1593
+ 404: 'Currency or quoteCurrency commodity not found',
1594
+ 409: 'Price already exists for this currency pair and date'
1550
1595
  }
1551
1596
  });
1552
1597
  }
1553
1598
 
1554
1599
  /**
1555
- * List recurring rules
1556
- * Returns all recurring rules for the authenticated user with optional filtering
1600
+ * List user prices
1601
+ * Returns all price entries for the authenticated user with optional filtering
1557
1602
  * @param data The data for the request.
1558
1603
  * @param data.region Region code for tenant context
1559
- * @param data.isActive Filter by active status
1560
- * @param data.frequency Filter by frequency (WEEKLY, MONTHLY, etc.)
1561
- * @param data.hasAutoCreate Filter by autoCreate enabled
1562
- * @returns RecurringRuleResponseDto Rules retrieved successfully
1604
+ * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
1605
+ * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
1606
+ * @param data.dateFrom Filter prices from this date (ISO 8601 format)
1607
+ * @param data.dateTo Filter prices to this date (ISO 8601 format)
1608
+ * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
1609
+ * @param data.page Page number for pagination (default: 1)
1610
+ * @param data.limit Number of items per page (default: 20, max: 100)
1611
+ * @returns PriceListResponseDto Prices retrieved successfully
1563
1612
  * @throws ApiError
1564
1613
  */
1565
- public static recurringRuleControllerFindAll(
1566
- data: RecurringRuleControllerFindAllData
1567
- ): CancelablePromise<RecurringRuleControllerFindAllResponse> {
1614
+ public static priceControllerFindAll(
1615
+ data: PriceControllerFindAllData
1616
+ ): CancelablePromise<PriceControllerFindAllResponse> {
1568
1617
  return __request(OpenAPI, {
1569
1618
  method: 'GET',
1570
- url: '/api/v1/{region}/bean/recurring-rules',
1619
+ url: '/api/v1/{region}/bean/prices',
1571
1620
  path: {
1572
1621
  region: data.region
1573
1622
  },
1574
1623
  query: {
1575
- isActive: data.isActive,
1576
- frequency: data.frequency,
1577
- hasAutoCreate: data.hasAutoCreate
1624
+ currency: data.currency,
1625
+ quoteCurrency: data.quoteCurrency,
1626
+ dateFrom: data.dateFrom,
1627
+ dateTo: data.dateTo,
1628
+ search: data.search,
1629
+ page: data.page,
1630
+ limit: data.limit
1578
1631
  }
1579
1632
  });
1580
1633
  }
1581
1634
 
1582
1635
  /**
1583
- * Create recurring rule from transaction
1584
- * Auto-creates a recurring rule using transaction data. User only confirms frequency.
1636
+ * Get price by ID
1637
+ * Returns a single price entry by its ID
1585
1638
  * @param data The data for the request.
1586
- * @param data.transactionId Source transaction ID
1639
+ * @param data.id Price ID
1587
1640
  * @param data.region Region code for tenant context
1588
- * @param data.requestBody
1589
- * @returns RecurringRuleResponseDto Rule created successfully
1641
+ * @returns PriceResponseDto Price retrieved successfully
1590
1642
  * @throws ApiError
1591
1643
  */
1592
- public static recurringRuleControllerCreateFromTransaction(
1593
- data: RecurringRuleControllerCreateFromTransactionData
1594
- ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
1644
+ public static priceControllerFindOne(
1645
+ data: PriceControllerFindOneData
1646
+ ): CancelablePromise<PriceControllerFindOneResponse> {
1595
1647
  return __request(OpenAPI, {
1596
- method: 'POST',
1597
- url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
1648
+ method: 'GET',
1649
+ url: '/api/v1/{region}/bean/prices/{id}',
1598
1650
  path: {
1599
- transactionId: data.transactionId,
1651
+ id: data.id,
1600
1652
  region: data.region
1601
1653
  },
1602
- body: data.requestBody,
1603
- mediaType: 'application/json',
1604
1654
  errors: {
1605
- 404: 'Transaction not found',
1606
- 409: 'Rule with same name already exists or transaction already linked'
1655
+ 404: 'Price not found'
1607
1656
  }
1608
1657
  });
1609
1658
  }
1610
1659
 
1611
1660
  /**
1612
- * Get recurring rule by ID
1613
- * Returns a specific recurring rule with its details
1661
+ * Update a price
1662
+ * Updates an existing price entry
1614
1663
  * @param data The data for the request.
1615
- * @param data.id Rule ID
1664
+ * @param data.id Price ID
1616
1665
  * @param data.region Region code for tenant context
1617
- * @returns RecurringRuleResponseDto Rule retrieved successfully
1666
+ * @param data.requestBody
1667
+ * @returns PriceResponseDto Price updated successfully
1618
1668
  * @throws ApiError
1619
1669
  */
1620
- public static recurringRuleControllerFindOne(
1621
- data: RecurringRuleControllerFindOneData
1622
- ): CancelablePromise<RecurringRuleControllerFindOneResponse> {
1670
+ public static priceControllerUpdate(
1671
+ data: PriceControllerUpdateData
1672
+ ): CancelablePromise<PriceControllerUpdateResponse> {
1623
1673
  return __request(OpenAPI, {
1624
- method: 'GET',
1625
- url: '/api/v1/{region}/bean/recurring-rules/{id}',
1674
+ method: 'PUT',
1675
+ url: '/api/v1/{region}/bean/prices/{id}',
1626
1676
  path: {
1627
1677
  id: data.id,
1628
1678
  region: data.region
1629
1679
  },
1680
+ body: data.requestBody,
1681
+ mediaType: 'application/json',
1630
1682
  errors: {
1631
- 404: 'Rule not found'
1683
+ 404: 'Price not found',
1684
+ 409: 'Updated price conflicts with existing price'
1632
1685
  }
1633
1686
  });
1634
1687
  }
1635
1688
 
1636
1689
  /**
1637
- * Update recurring rule
1638
- * Updates an existing recurring rule
1690
+ * Delete a price
1691
+ * Deletes a price entry (hard delete)
1639
1692
  * @param data The data for the request.
1640
- * @param data.id Rule ID
1693
+ * @param data.id Price ID
1641
1694
  * @param data.region Region code for tenant context
1642
- * @param data.requestBody
1643
- * @returns RecurringRuleResponseDto Rule updated successfully
1695
+ * @returns void Price deleted successfully
1644
1696
  * @throws ApiError
1645
1697
  */
1646
- public static recurringRuleControllerUpdate(
1647
- data: RecurringRuleControllerUpdateData
1648
- ): CancelablePromise<RecurringRuleControllerUpdateResponse> {
1698
+ public static priceControllerDelete(
1699
+ data: PriceControllerDeleteData
1700
+ ): CancelablePromise<PriceControllerDeleteResponse> {
1649
1701
  return __request(OpenAPI, {
1650
- method: 'PATCH',
1651
- url: '/api/v1/{region}/bean/recurring-rules/{id}',
1702
+ method: 'DELETE',
1703
+ url: '/api/v1/{region}/bean/prices/{id}',
1652
1704
  path: {
1653
1705
  id: data.id,
1654
1706
  region: data.region
1655
1707
  },
1656
- body: data.requestBody,
1657
- mediaType: 'application/json',
1658
1708
  errors: {
1659
- 400: 'Invalid input data',
1660
- 404: 'Rule not found'
1709
+ 404: 'Price not found'
1661
1710
  }
1662
1711
  });
1663
1712
  }
1664
1713
 
1665
1714
  /**
1666
- * Delete recurring rule
1667
- * Soft deletes a recurring rule (sets isActive to false)
1715
+ * Bulk create prices
1716
+ * Creates multiple price entries at once (skips duplicates)
1668
1717
  * @param data The data for the request.
1669
- * @param data.id Rule ID
1670
1718
  * @param data.region Region code for tenant context
1671
- * @returns void Rule deleted successfully
1672
- * @throws ApiError
1719
+ * @param data.requestBody
1720
+ * @returns PriceResponseDto Prices created successfully
1721
+ * @throws ApiError
1722
+ */
1723
+ public static priceControllerBulkCreate(
1724
+ data: PriceControllerBulkCreateData
1725
+ ): CancelablePromise<PriceControllerBulkCreateResponse> {
1726
+ return __request(OpenAPI, {
1727
+ method: 'POST',
1728
+ url: '/api/v1/{region}/bean/prices/bulk',
1729
+ path: {
1730
+ region: data.region
1731
+ },
1732
+ body: data.requestBody,
1733
+ mediaType: 'application/json'
1734
+ });
1735
+ }
1736
+ }
1737
+
1738
+ export class RecurringRulesService {
1739
+ /**
1740
+ * Create a new recurring rule
1741
+ * Creates a new recurring transaction rule for the authenticated user
1742
+ * @param data The data for the request.
1743
+ * @param data.region Region code for tenant context
1744
+ * @param data.requestBody
1745
+ * @returns RecurringRuleResponseDto Rule created successfully
1746
+ * @throws ApiError
1747
+ */
1748
+ public static recurringRuleControllerCreate(
1749
+ data: RecurringRuleControllerCreateData
1750
+ ): CancelablePromise<RecurringRuleControllerCreateResponse> {
1751
+ return __request(OpenAPI, {
1752
+ method: 'POST',
1753
+ url: '/api/v1/{region}/bean/recurring-rules',
1754
+ path: {
1755
+ region: data.region
1756
+ },
1757
+ body: data.requestBody,
1758
+ mediaType: 'application/json',
1759
+ errors: {
1760
+ 400: 'Invalid input data (e.g., autoCreate without accounts)',
1761
+ 409: 'Rule with same name already exists'
1762
+ }
1763
+ });
1764
+ }
1765
+
1766
+ /**
1767
+ * List recurring rules
1768
+ * Returns all recurring rules for the authenticated user with optional filtering
1769
+ * @param data The data for the request.
1770
+ * @param data.region Region code for tenant context
1771
+ * @param data.isActive Filter by active status
1772
+ * @param data.frequency Filter by frequency (WEEKLY, MONTHLY, etc.)
1773
+ * @param data.hasAutoCreate Filter by autoCreate enabled
1774
+ * @returns RecurringRuleResponseDto Rules retrieved successfully
1775
+ * @throws ApiError
1776
+ */
1777
+ public static recurringRuleControllerFindAll(
1778
+ data: RecurringRuleControllerFindAllData
1779
+ ): CancelablePromise<RecurringRuleControllerFindAllResponse> {
1780
+ return __request(OpenAPI, {
1781
+ method: 'GET',
1782
+ url: '/api/v1/{region}/bean/recurring-rules',
1783
+ path: {
1784
+ region: data.region
1785
+ },
1786
+ query: {
1787
+ isActive: data.isActive,
1788
+ frequency: data.frequency,
1789
+ hasAutoCreate: data.hasAutoCreate
1790
+ }
1791
+ });
1792
+ }
1793
+
1794
+ /**
1795
+ * Create recurring rule from transaction
1796
+ * Auto-creates a recurring rule using transaction data. User only confirms frequency.
1797
+ * @param data The data for the request.
1798
+ * @param data.transactionId Source transaction ID
1799
+ * @param data.region Region code for tenant context
1800
+ * @param data.requestBody
1801
+ * @returns RecurringRuleResponseDto Rule created successfully
1802
+ * @throws ApiError
1803
+ */
1804
+ public static recurringRuleControllerCreateFromTransaction(
1805
+ data: RecurringRuleControllerCreateFromTransactionData
1806
+ ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
1807
+ return __request(OpenAPI, {
1808
+ method: 'POST',
1809
+ url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
1810
+ path: {
1811
+ transactionId: data.transactionId,
1812
+ region: data.region
1813
+ },
1814
+ body: data.requestBody,
1815
+ mediaType: 'application/json',
1816
+ errors: {
1817
+ 404: 'Transaction not found',
1818
+ 409: 'Rule with same name already exists or transaction already linked'
1819
+ }
1820
+ });
1821
+ }
1822
+
1823
+ /**
1824
+ * Get recurring rule by ID
1825
+ * Returns a specific recurring rule with its details
1826
+ * @param data The data for the request.
1827
+ * @param data.id Rule ID
1828
+ * @param data.region Region code for tenant context
1829
+ * @returns RecurringRuleResponseDto Rule retrieved successfully
1830
+ * @throws ApiError
1831
+ */
1832
+ public static recurringRuleControllerFindOne(
1833
+ data: RecurringRuleControllerFindOneData
1834
+ ): CancelablePromise<RecurringRuleControllerFindOneResponse> {
1835
+ return __request(OpenAPI, {
1836
+ method: 'GET',
1837
+ url: '/api/v1/{region}/bean/recurring-rules/{id}',
1838
+ path: {
1839
+ id: data.id,
1840
+ region: data.region
1841
+ },
1842
+ errors: {
1843
+ 404: 'Rule not found'
1844
+ }
1845
+ });
1846
+ }
1847
+
1848
+ /**
1849
+ * Update recurring rule
1850
+ * Updates an existing recurring rule
1851
+ * @param data The data for the request.
1852
+ * @param data.id Rule ID
1853
+ * @param data.region Region code for tenant context
1854
+ * @param data.requestBody
1855
+ * @returns RecurringRuleResponseDto Rule updated successfully
1856
+ * @throws ApiError
1857
+ */
1858
+ public static recurringRuleControllerUpdate(
1859
+ data: RecurringRuleControllerUpdateData
1860
+ ): CancelablePromise<RecurringRuleControllerUpdateResponse> {
1861
+ return __request(OpenAPI, {
1862
+ method: 'PATCH',
1863
+ url: '/api/v1/{region}/bean/recurring-rules/{id}',
1864
+ path: {
1865
+ id: data.id,
1866
+ region: data.region
1867
+ },
1868
+ body: data.requestBody,
1869
+ mediaType: 'application/json',
1870
+ errors: {
1871
+ 400: 'Invalid input data',
1872
+ 404: 'Rule not found'
1873
+ }
1874
+ });
1875
+ }
1876
+
1877
+ /**
1878
+ * Delete recurring rule
1879
+ * Soft deletes a recurring rule (sets isActive to false)
1880
+ * @param data The data for the request.
1881
+ * @param data.id Rule ID
1882
+ * @param data.region Region code for tenant context
1883
+ * @returns void Rule deleted successfully
1884
+ * @throws ApiError
1673
1885
  */
1674
1886
  public static recurringRuleControllerDelete(
1675
1887
  data: RecurringRuleControllerDeleteData
@@ -1953,279 +2165,158 @@ export class RecurringForecastService {
1953
2165
  }
1954
2166
  }
1955
2167
 
1956
- export class BeanTransactionRulesService {
2168
+ export class ReportingService {
1957
2169
  /**
1958
- * Create a new transaction rule (or upsert if upsertByPayee=true)
1959
- * Creates a new rule. If upsertByPayee=true, updates existing rule matching payeeKeywords[0] instead of creating duplicate.
2170
+ * Get portfolio value trends
2171
+ *
2172
+ * Returns time series data of portfolio net worth.
2173
+ *
2174
+ * **Multi-currency Support:**
2175
+ * - `series[].byCurrency` - Currency breakdown for each data point
2176
+ * - `byCurrency` - Separate time series grouped by currency
2177
+ * - `warnings` - Exchange rate warnings if conversion failed
2178
+ *
2179
+ * **Parameters:**
2180
+ * - `period`: Time period (1m, 3m, 6m, 1y)
2181
+ * - `granularity`: Data granularity (day, week, month)
2182
+ *
1960
2183
  * @param data The data for the request.
1961
2184
  * @param data.region Region code for tenant context
1962
- * @param data.requestBody
1963
- * @returns TransactionRuleResponseDto Rule updated successfully (upsert mode)
2185
+ * @param data.period Time period
2186
+ * @param data.granularity Data granularity
2187
+ * @returns PortfolioTrendsResponseDto Trends retrieved successfully
1964
2188
  * @throws ApiError
1965
2189
  */
1966
- public static transactionRuleControllerCreate(
1967
- data: TransactionRuleControllerCreateData
1968
- ): CancelablePromise<TransactionRuleControllerCreateResponse> {
2190
+ public static reportingControllerGetPortfolioTrends(
2191
+ data: ReportingControllerGetPortfolioTrendsData
2192
+ ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
1969
2193
  return __request(OpenAPI, {
1970
- method: 'POST',
1971
- url: '/api/v1/{region}/bean/transaction-rules',
2194
+ method: 'GET',
2195
+ url: '/api/v1/{region}/reporting/portfolio/trends',
1972
2196
  path: {
1973
2197
  region: data.region
1974
2198
  },
1975
- body: data.requestBody,
1976
- mediaType: 'application/json',
2199
+ query: {
2200
+ period: data.period,
2201
+ granularity: data.granularity
2202
+ },
1977
2203
  errors: {
1978
- 400: 'Validation failed',
1979
- 401: 'Unauthorized',
1980
- 409: 'Resource conflict - another process is updating this rule'
2204
+ 401: 'User not authenticated'
1981
2205
  }
1982
2206
  });
1983
2207
  }
1984
2208
 
1985
2209
  /**
1986
- * Get all transaction rules for user
2210
+ * Get cash-flow trends
2211
+ *
2212
+ * Monthly income / expense / netSavings over a fixed N-month window
2213
+ * (current month + N−1 prior). Missing months are zero-filled (flow metric).
2214
+ *
2215
+ * **Parameters:**
2216
+ * - `period`: 1m | 3m | 6m | 1y (default 6m)
2217
+ * - `granularity`: accepted for API symmetry; v1 returns month buckets
2218
+ *
1987
2219
  * @param data The data for the request.
1988
2220
  * @param data.region Region code for tenant context
1989
- * @param data.limit Max results per page (default: 20, max: 100)
1990
- * @param data.offset Pagination offset (default: 0)
1991
- * @param data.enabled Filter by enabled status
1992
- * @param data.learningSource Filter by learning source. Omit this parameter or pass empty string to get manually created rules (learningSource is null in database).
1993
- * @param data.autoApplyEnabled Filter by auto-apply status
1994
- * @returns TransactionRuleListResponseDto List of rules
2221
+ * @param data.period Time period
2222
+ * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
2223
+ * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
1995
2224
  * @throws ApiError
1996
2225
  */
1997
- public static transactionRuleControllerList(
1998
- data: TransactionRuleControllerListData
1999
- ): CancelablePromise<TransactionRuleControllerListResponse> {
2226
+ public static reportingControllerGetCashFlowTrends(
2227
+ data: ReportingControllerGetCashFlowTrendsData
2228
+ ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
2000
2229
  return __request(OpenAPI, {
2001
2230
  method: 'GET',
2002
- url: '/api/v1/{region}/bean/transaction-rules',
2231
+ url: '/api/v1/{region}/reporting/cash-flow/trends',
2003
2232
  path: {
2004
2233
  region: data.region
2005
2234
  },
2006
2235
  query: {
2007
- limit: data.limit,
2008
- offset: data.offset,
2009
- enabled: data.enabled,
2010
- learningSource: data.learningSource,
2011
- autoApplyEnabled: data.autoApplyEnabled
2236
+ period: data.period,
2237
+ granularity: data.granularity
2012
2238
  },
2013
2239
  errors: {
2014
- 401: 'Unauthorized'
2240
+ 401: 'User not authenticated'
2015
2241
  }
2016
2242
  });
2017
2243
  }
2018
2244
 
2019
2245
  /**
2020
- * Validate transaction rule configuration
2021
- * @param data The data for the request.
2022
- * @param data.region Region code for tenant context
2023
- * @param data.requestBody
2024
- * @returns ValidateRuleResponseDto Validation result
2025
- * @throws ApiError
2026
- */
2027
- public static transactionRuleControllerValidate(
2028
- data: TransactionRuleControllerValidateData
2029
- ): CancelablePromise<TransactionRuleControllerValidateResponse> {
2030
- return __request(OpenAPI, {
2031
- method: 'POST',
2032
- url: '/api/v1/{region}/bean/transaction-rules/validate',
2033
- path: {
2034
- region: data.region
2035
- },
2036
- body: data.requestBody,
2037
- mediaType: 'application/json',
2038
- errors: {
2039
- 400: 'Validation failed',
2040
- 401: 'Unauthorized'
2041
- }
2042
- });
2043
- }
2044
-
2045
- /**
2046
- * Bulk create transaction rules
2246
+ * Generate portfolio snapshot
2247
+ *
2248
+ * Manually generate a portfolio snapshot for a specific date.
2249
+ *
2250
+ * **Multi-currency Support:**
2251
+ * - Fetches balances grouped by currency
2252
+ * - Uses user's baseCurrency setting for conversion
2253
+ * - Stores exchange rates and warnings
2254
+ *
2255
+ * **Use Cases:**
2256
+ * - Testing snapshot generation
2257
+ * - Force regeneration after data correction
2258
+ * - Initial setup for new users
2259
+ *
2047
2260
  * @param data The data for the request.
2048
2261
  * @param data.region Region code for tenant context
2049
- * @param data.requestBody
2050
- * @returns BulkCreateRulesResponseDto Bulk create completed
2262
+ * @param data.requestBody Optional date (defaults to today)
2263
+ * @returns GenerateSnapshotResponse Snapshot generated successfully
2051
2264
  * @throws ApiError
2052
2265
  */
2053
- public static transactionRuleControllerBulkCreate(
2054
- data: TransactionRuleControllerBulkCreateData
2055
- ): CancelablePromise<TransactionRuleControllerBulkCreateResponse> {
2266
+ public static reportingControllerGenerateSnapshot(
2267
+ data: ReportingControllerGenerateSnapshotData
2268
+ ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
2056
2269
  return __request(OpenAPI, {
2057
2270
  method: 'POST',
2058
- url: '/api/v1/{region}/bean/transaction-rules/bulk',
2059
- path: {
2060
- region: data.region
2061
- },
2062
- body: data.requestBody,
2063
- mediaType: 'application/json',
2064
- errors: {
2065
- 400: 'Invalid bulk create data',
2066
- 401: 'Unauthorized'
2067
- }
2068
- });
2069
- }
2070
-
2071
- /**
2072
- * Export transaction rules
2073
- * @param data The data for the request.
2074
- * @param data.format Export format (currently only JSON supported)
2075
- * @param data.region Region code for tenant context
2076
- * @returns ExportRulesResponseDto Exported rules
2077
- * @throws ApiError
2078
- */
2079
- public static transactionRuleControllerExport(
2080
- data: TransactionRuleControllerExportData
2081
- ): CancelablePromise<TransactionRuleControllerExportResponse> {
2082
- return __request(OpenAPI, {
2083
- method: 'GET',
2084
- url: '/api/v1/{region}/bean/transaction-rules/export/{format}',
2085
- path: {
2086
- format: data.format,
2087
- region: data.region
2088
- },
2089
- errors: {
2090
- 400: 'Unsupported format',
2091
- 401: 'Unauthorized'
2092
- }
2093
- });
2094
- }
2095
-
2096
- /**
2097
- * Get transaction rule statistics
2098
- * @param data The data for the request.
2099
- * @param data.period Statistics time period
2100
- * @param data.region Region code for tenant context
2101
- * @returns RuleStatisticsResponseDto Rule statistics
2102
- * @throws ApiError
2103
- */
2104
- public static transactionRuleControllerGetStatistics(
2105
- data: TransactionRuleControllerGetStatisticsData
2106
- ): CancelablePromise<TransactionRuleControllerGetStatisticsResponse> {
2107
- return __request(OpenAPI, {
2108
- method: 'GET',
2109
- url: '/api/v1/{region}/bean/transaction-rules/statistics/{period}',
2110
- path: {
2111
- period: data.period,
2112
- region: data.region
2113
- },
2114
- errors: {
2115
- 401: 'Unauthorized'
2116
- }
2117
- });
2118
- }
2119
-
2120
- /**
2121
- * Get transaction rule detail
2122
- * @param data The data for the request.
2123
- * @param data.ruleId Rule ID
2124
- * @param data.region Region code for tenant context
2125
- * @returns TransactionRuleResponseDto Rule details
2126
- * @throws ApiError
2127
- */
2128
- public static transactionRuleControllerGetDetail(
2129
- data: TransactionRuleControllerGetDetailData
2130
- ): CancelablePromise<TransactionRuleControllerGetDetailResponse> {
2131
- return __request(OpenAPI, {
2132
- method: 'GET',
2133
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2134
- path: {
2135
- ruleId: data.ruleId,
2136
- region: data.region
2137
- },
2138
- errors: {
2139
- 401: 'Unauthorized',
2140
- 403: 'Forbidden - not owner of rule',
2141
- 404: 'Rule not found'
2142
- }
2143
- });
2144
- }
2145
-
2146
- /**
2147
- * Update a transaction rule
2148
- * @param data The data for the request.
2149
- * @param data.ruleId Rule ID to update
2150
- * @param data.region Region code for tenant context
2151
- * @param data.requestBody
2152
- * @returns TransactionRuleResponseDto Rule updated successfully
2153
- * @throws ApiError
2154
- */
2155
- public static transactionRuleControllerUpdate(
2156
- data: TransactionRuleControllerUpdateData
2157
- ): CancelablePromise<TransactionRuleControllerUpdateResponse> {
2158
- return __request(OpenAPI, {
2159
- method: 'PUT',
2160
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2271
+ url: '/api/v1/{region}/reporting/snapshots/generate',
2161
2272
  path: {
2162
- ruleId: data.ruleId,
2163
2273
  region: data.region
2164
2274
  },
2165
2275
  body: data.requestBody,
2166
2276
  mediaType: 'application/json',
2167
2277
  errors: {
2168
- 400: 'Validation failed',
2169
- 401: 'Unauthorized',
2170
- 403: 'Forbidden - not owner of rule',
2171
- 404: 'Rule not found',
2172
- 409: 'Resource conflict - rule is being modified by another process'
2173
- }
2174
- });
2175
- }
2176
-
2177
- /**
2178
- * Delete a transaction rule
2179
- * @param data The data for the request.
2180
- * @param data.ruleId Rule ID to delete
2181
- * @param data.region Region code for tenant context
2182
- * @returns void Rule deleted successfully
2183
- * @throws ApiError
2184
- */
2185
- public static transactionRuleControllerDelete(
2186
- data: TransactionRuleControllerDeleteData
2187
- ): CancelablePromise<TransactionRuleControllerDeleteResponse> {
2188
- return __request(OpenAPI, {
2189
- method: 'DELETE',
2190
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2191
- path: {
2192
- ruleId: data.ruleId,
2193
- region: data.region
2194
- },
2195
- errors: {
2196
- 401: 'Unauthorized',
2197
- 403: 'Forbidden - not owner of rule',
2198
- 404: 'Rule not found',
2199
- 409: 'Resource conflict - rule is being modified by another process'
2278
+ 400: 'Invalid date format',
2279
+ 401: 'User not authenticated'
2200
2280
  }
2201
2281
  });
2202
2282
  }
2203
2283
 
2204
2284
  /**
2205
- * Test rule matching
2285
+ * Backfill portfolio snapshots
2286
+ *
2287
+ * Generate snapshots for a date range (historical data backfill).
2288
+ *
2289
+ * **Multi-currency Support:**
2290
+ * - Each snapshot includes multi-currency data
2291
+ * - Uses exchange rates available at generation time
2292
+ * - Warnings stored for missing exchange rates
2293
+ *
2294
+ * **Best Practices:**
2295
+ * - Use for initial setup after account configuration
2296
+ * - Run during low-traffic periods for large date ranges
2297
+ * - Existing snapshots are skipped (not regenerated)
2298
+ *
2206
2299
  * @param data The data for the request.
2207
- * @param data.ruleId Rule ID to test
2208
2300
  * @param data.region Region code for tenant context
2209
2301
  * @param data.requestBody
2210
- * @returns TestRuleResponseDto Test result
2302
+ * @returns BackfillSnapshotsResponse Backfill completed successfully
2211
2303
  * @throws ApiError
2212
2304
  */
2213
- public static transactionRuleControllerTest(
2214
- data: TransactionRuleControllerTestData
2215
- ): CancelablePromise<TransactionRuleControllerTestResponse> {
2305
+ public static reportingControllerBackfillSnapshots(
2306
+ data: ReportingControllerBackfillSnapshotsData
2307
+ ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
2216
2308
  return __request(OpenAPI, {
2217
2309
  method: 'POST',
2218
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}/test',
2310
+ url: '/api/v1/{region}/reporting/snapshots/backfill',
2219
2311
  path: {
2220
- ruleId: data.ruleId,
2221
2312
  region: data.region
2222
2313
  },
2223
2314
  body: data.requestBody,
2224
2315
  mediaType: 'application/json',
2225
2316
  errors: {
2226
- 401: 'Unauthorized',
2227
- 403: 'Forbidden - not owner of rule',
2228
- 404: 'Rule not found'
2317
+ 400: 'Invalid date format or range',
2318
+ 401: 'User not authenticated',
2319
+ 409: 'Backfill already in progress for this user'
2229
2320
  }
2230
2321
  });
2231
2322
  }
@@ -2277,7 +2368,7 @@ export class UsersService {
2277
2368
  * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
2278
2369
  * @param data The data for the request.
2279
2370
  * @param data.requestBody
2280
- * @returns unknown User created successfully
2371
+ * @returns SignupResponseDto User created successfully
2281
2372
  * @throws ApiError
2282
2373
  */
2283
2374
  public static userControllerSignupUser(
@@ -2486,52 +2577,330 @@ export class PropertiesService {
2486
2577
  }
2487
2578
  }
2488
2579
 
2489
- export class LifeEventsService {
2580
+ export class BeanTransactionRulesService {
2490
2581
  /**
2491
- * Create a new life event
2492
- * Creates a new life event entry for the authenticated user. Returns ETag header carrying the row updatedAt.
2582
+ * Create a new transaction rule (or upsert if upsertByPayee=true)
2583
+ * Creates a new rule. If upsertByPayee=true, updates existing rule matching payeeKeywords[0] instead of creating duplicate.
2493
2584
  * @param data The data for the request.
2494
- * @param data.region Region code for tenant context (decorative for life events)
2585
+ * @param data.region Region code for tenant context
2495
2586
  * @param data.requestBody
2496
- * @returns EventResponseDto Life event created successfully
2587
+ * @returns TransactionRuleResponseDto Rule updated successfully (upsert mode)
2497
2588
  * @throws ApiError
2498
2589
  */
2499
- public static eventControllerCreate(
2500
- data: EventControllerCreateData
2501
- ): CancelablePromise<EventControllerCreateResponse> {
2590
+ public static transactionRuleControllerCreate(
2591
+ data: TransactionRuleControllerCreateData
2592
+ ): CancelablePromise<TransactionRuleControllerCreateResponse> {
2502
2593
  return __request(OpenAPI, {
2503
2594
  method: 'POST',
2504
- url: '/api/v1/{region}/bean/events',
2595
+ url: '/api/v1/{region}/bean/transaction-rules',
2505
2596
  path: {
2506
2597
  region: data.region
2507
2598
  },
2508
2599
  body: data.requestBody,
2509
2600
  mediaType: 'application/json',
2510
2601
  errors: {
2511
- 409: 'Life event already exists for this (userId, type, date) combination'
2602
+ 400: 'Validation failed',
2603
+ 401: 'Unauthorized',
2604
+ 409: 'Resource conflict - another process is updating this rule'
2512
2605
  }
2513
2606
  });
2514
2607
  }
2515
2608
 
2516
2609
  /**
2517
- * List user life events
2518
- * Returns life events for the authenticated user with optional filtering by type, description search, and date range.
2610
+ * Get all transaction rules for user
2519
2611
  * @param data The data for the request.
2520
- * @param data.region Region code for tenant context (decorative for life events)
2521
- * @param data.type Filter by life event type (exact match)
2522
- * @param data.q Search term for description (case-insensitive partial match)
2523
- * @param data.from Filter life events from this date (ISO 8601 format)
2524
- * @param data.to Filter life events to this date (ISO 8601 format)
2525
- * @param data.page Page number for pagination (default: 1)
2526
- * @param data.limit Number of items per page (default: 20, max: 100)
2527
- * @returns EventListResponseDto Life events retrieved successfully
2612
+ * @param data.region Region code for tenant context
2613
+ * @param data.limit Max results per page (default: 20, max: 100)
2614
+ * @param data.offset Pagination offset (default: 0)
2615
+ * @param data.enabled Filter by enabled status
2616
+ * @param data.learningSource Filter by learning source. Omit this parameter or pass empty string to get manually created rules (learningSource is null in database).
2617
+ * @param data.autoApplyEnabled Filter by auto-apply status
2618
+ * @returns TransactionRuleListResponseDto List of rules
2528
2619
  * @throws ApiError
2529
2620
  */
2530
- public static eventControllerFindAll(
2531
- data: EventControllerFindAllData
2532
- ): CancelablePromise<EventControllerFindAllResponse> {
2533
- return __request(OpenAPI, {
2534
- method: 'GET',
2621
+ public static transactionRuleControllerList(
2622
+ data: TransactionRuleControllerListData
2623
+ ): CancelablePromise<TransactionRuleControllerListResponse> {
2624
+ return __request(OpenAPI, {
2625
+ method: 'GET',
2626
+ url: '/api/v1/{region}/bean/transaction-rules',
2627
+ path: {
2628
+ region: data.region
2629
+ },
2630
+ query: {
2631
+ limit: data.limit,
2632
+ offset: data.offset,
2633
+ enabled: data.enabled,
2634
+ learningSource: data.learningSource,
2635
+ autoApplyEnabled: data.autoApplyEnabled
2636
+ },
2637
+ errors: {
2638
+ 401: 'Unauthorized'
2639
+ }
2640
+ });
2641
+ }
2642
+
2643
+ /**
2644
+ * Validate transaction rule configuration
2645
+ * @param data The data for the request.
2646
+ * @param data.region Region code for tenant context
2647
+ * @param data.requestBody
2648
+ * @returns ValidateRuleResponseDto Validation result
2649
+ * @throws ApiError
2650
+ */
2651
+ public static transactionRuleControllerValidate(
2652
+ data: TransactionRuleControllerValidateData
2653
+ ): CancelablePromise<TransactionRuleControllerValidateResponse> {
2654
+ return __request(OpenAPI, {
2655
+ method: 'POST',
2656
+ url: '/api/v1/{region}/bean/transaction-rules/validate',
2657
+ path: {
2658
+ region: data.region
2659
+ },
2660
+ body: data.requestBody,
2661
+ mediaType: 'application/json',
2662
+ errors: {
2663
+ 400: 'Validation failed',
2664
+ 401: 'Unauthorized'
2665
+ }
2666
+ });
2667
+ }
2668
+
2669
+ /**
2670
+ * Bulk create transaction rules
2671
+ * @param data The data for the request.
2672
+ * @param data.region Region code for tenant context
2673
+ * @param data.requestBody
2674
+ * @returns BulkCreateRulesResponseDto Bulk create completed
2675
+ * @throws ApiError
2676
+ */
2677
+ public static transactionRuleControllerBulkCreate(
2678
+ data: TransactionRuleControllerBulkCreateData
2679
+ ): CancelablePromise<TransactionRuleControllerBulkCreateResponse> {
2680
+ return __request(OpenAPI, {
2681
+ method: 'POST',
2682
+ url: '/api/v1/{region}/bean/transaction-rules/bulk',
2683
+ path: {
2684
+ region: data.region
2685
+ },
2686
+ body: data.requestBody,
2687
+ mediaType: 'application/json',
2688
+ errors: {
2689
+ 400: 'Invalid bulk create data',
2690
+ 401: 'Unauthorized'
2691
+ }
2692
+ });
2693
+ }
2694
+
2695
+ /**
2696
+ * Export transaction rules
2697
+ * @param data The data for the request.
2698
+ * @param data.format Export format (currently only JSON supported)
2699
+ * @param data.region Region code for tenant context
2700
+ * @returns ExportRulesResponseDto Exported rules
2701
+ * @throws ApiError
2702
+ */
2703
+ public static transactionRuleControllerExport(
2704
+ data: TransactionRuleControllerExportData
2705
+ ): CancelablePromise<TransactionRuleControllerExportResponse> {
2706
+ return __request(OpenAPI, {
2707
+ method: 'GET',
2708
+ url: '/api/v1/{region}/bean/transaction-rules/export/{format}',
2709
+ path: {
2710
+ format: data.format,
2711
+ region: data.region
2712
+ },
2713
+ errors: {
2714
+ 400: 'Unsupported format',
2715
+ 401: 'Unauthorized'
2716
+ }
2717
+ });
2718
+ }
2719
+
2720
+ /**
2721
+ * Get transaction rule statistics
2722
+ * @param data The data for the request.
2723
+ * @param data.period Statistics time period
2724
+ * @param data.region Region code for tenant context
2725
+ * @returns RuleStatisticsResponseDto Rule statistics
2726
+ * @throws ApiError
2727
+ */
2728
+ public static transactionRuleControllerGetStatistics(
2729
+ data: TransactionRuleControllerGetStatisticsData
2730
+ ): CancelablePromise<TransactionRuleControllerGetStatisticsResponse> {
2731
+ return __request(OpenAPI, {
2732
+ method: 'GET',
2733
+ url: '/api/v1/{region}/bean/transaction-rules/statistics/{period}',
2734
+ path: {
2735
+ period: data.period,
2736
+ region: data.region
2737
+ },
2738
+ errors: {
2739
+ 401: 'Unauthorized'
2740
+ }
2741
+ });
2742
+ }
2743
+
2744
+ /**
2745
+ * Get transaction rule detail
2746
+ * @param data The data for the request.
2747
+ * @param data.ruleId Rule ID
2748
+ * @param data.region Region code for tenant context
2749
+ * @returns TransactionRuleResponseDto Rule details
2750
+ * @throws ApiError
2751
+ */
2752
+ public static transactionRuleControllerGetDetail(
2753
+ data: TransactionRuleControllerGetDetailData
2754
+ ): CancelablePromise<TransactionRuleControllerGetDetailResponse> {
2755
+ return __request(OpenAPI, {
2756
+ method: 'GET',
2757
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2758
+ path: {
2759
+ ruleId: data.ruleId,
2760
+ region: data.region
2761
+ },
2762
+ errors: {
2763
+ 401: 'Unauthorized',
2764
+ 403: 'Forbidden - not owner of rule',
2765
+ 404: 'Rule not found'
2766
+ }
2767
+ });
2768
+ }
2769
+
2770
+ /**
2771
+ * Update a transaction rule
2772
+ * @param data The data for the request.
2773
+ * @param data.ruleId Rule ID to update
2774
+ * @param data.region Region code for tenant context
2775
+ * @param data.requestBody
2776
+ * @returns TransactionRuleResponseDto Rule updated successfully
2777
+ * @throws ApiError
2778
+ */
2779
+ public static transactionRuleControllerUpdate(
2780
+ data: TransactionRuleControllerUpdateData
2781
+ ): CancelablePromise<TransactionRuleControllerUpdateResponse> {
2782
+ return __request(OpenAPI, {
2783
+ method: 'PUT',
2784
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2785
+ path: {
2786
+ ruleId: data.ruleId,
2787
+ region: data.region
2788
+ },
2789
+ body: data.requestBody,
2790
+ mediaType: 'application/json',
2791
+ errors: {
2792
+ 400: 'Validation failed',
2793
+ 401: 'Unauthorized',
2794
+ 403: 'Forbidden - not owner of rule',
2795
+ 404: 'Rule not found',
2796
+ 409: 'Resource conflict - rule is being modified by another process'
2797
+ }
2798
+ });
2799
+ }
2800
+
2801
+ /**
2802
+ * Delete a transaction rule
2803
+ * @param data The data for the request.
2804
+ * @param data.ruleId Rule ID to delete
2805
+ * @param data.region Region code for tenant context
2806
+ * @returns void Rule deleted successfully
2807
+ * @throws ApiError
2808
+ */
2809
+ public static transactionRuleControllerDelete(
2810
+ data: TransactionRuleControllerDeleteData
2811
+ ): CancelablePromise<TransactionRuleControllerDeleteResponse> {
2812
+ return __request(OpenAPI, {
2813
+ method: 'DELETE',
2814
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2815
+ path: {
2816
+ ruleId: data.ruleId,
2817
+ region: data.region
2818
+ },
2819
+ errors: {
2820
+ 401: 'Unauthorized',
2821
+ 403: 'Forbidden - not owner of rule',
2822
+ 404: 'Rule not found',
2823
+ 409: 'Resource conflict - rule is being modified by another process'
2824
+ }
2825
+ });
2826
+ }
2827
+
2828
+ /**
2829
+ * Test rule matching
2830
+ * @param data The data for the request.
2831
+ * @param data.ruleId Rule ID to test
2832
+ * @param data.region Region code for tenant context
2833
+ * @param data.requestBody
2834
+ * @returns TestRuleResponseDto Test result
2835
+ * @throws ApiError
2836
+ */
2837
+ public static transactionRuleControllerTest(
2838
+ data: TransactionRuleControllerTestData
2839
+ ): CancelablePromise<TransactionRuleControllerTestResponse> {
2840
+ return __request(OpenAPI, {
2841
+ method: 'POST',
2842
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}/test',
2843
+ path: {
2844
+ ruleId: data.ruleId,
2845
+ region: data.region
2846
+ },
2847
+ body: data.requestBody,
2848
+ mediaType: 'application/json',
2849
+ errors: {
2850
+ 401: 'Unauthorized',
2851
+ 403: 'Forbidden - not owner of rule',
2852
+ 404: 'Rule not found'
2853
+ }
2854
+ });
2855
+ }
2856
+ }
2857
+
2858
+ export class LifeEventsService {
2859
+ /**
2860
+ * Create a new life event
2861
+ * Creates a new life event entry for the authenticated user. Returns ETag header carrying the row updatedAt.
2862
+ * @param data The data for the request.
2863
+ * @param data.region Region code for tenant context (decorative for life events)
2864
+ * @param data.requestBody
2865
+ * @returns EventResponseDto Life event created successfully
2866
+ * @throws ApiError
2867
+ */
2868
+ public static eventControllerCreate(
2869
+ data: EventControllerCreateData
2870
+ ): CancelablePromise<EventControllerCreateResponse> {
2871
+ return __request(OpenAPI, {
2872
+ method: 'POST',
2873
+ url: '/api/v1/{region}/bean/events',
2874
+ path: {
2875
+ region: data.region
2876
+ },
2877
+ body: data.requestBody,
2878
+ mediaType: 'application/json',
2879
+ errors: {
2880
+ 409: 'Life event already exists for this (userId, type, date) combination'
2881
+ }
2882
+ });
2883
+ }
2884
+
2885
+ /**
2886
+ * List user life events
2887
+ * Returns life events for the authenticated user with optional filtering by type, description search, and date range.
2888
+ * @param data The data for the request.
2889
+ * @param data.region Region code for tenant context (decorative for life events)
2890
+ * @param data.type Filter by life event type (exact match)
2891
+ * @param data.q Search term for description (case-insensitive partial match)
2892
+ * @param data.from Filter life events from this date (ISO 8601 format)
2893
+ * @param data.to Filter life events to this date (ISO 8601 format)
2894
+ * @param data.page Page number for pagination (default: 1)
2895
+ * @param data.limit Number of items per page (default: 20, max: 100)
2896
+ * @returns EventListResponseDto Life events retrieved successfully
2897
+ * @throws ApiError
2898
+ */
2899
+ public static eventControllerFindAll(
2900
+ data: EventControllerFindAllData
2901
+ ): CancelablePromise<EventControllerFindAllResponse> {
2902
+ return __request(OpenAPI, {
2903
+ method: 'GET',
2535
2904
  url: '/api/v1/{region}/bean/events',
2536
2905
  path: {
2537
2906
  region: data.region
@@ -2661,6 +3030,33 @@ export class LifeEventsService {
2661
3030
  }
2662
3031
  }
2663
3032
 
3033
+ export class OnboardingService {
3034
+ /**
3035
+ * Bootstrap core accounts + register asset accounts with opening balances (ADR-0113)
3036
+ * @param data The data for the request.
3037
+ * @param data.region Region code for tenant context
3038
+ * @param data.requestBody
3039
+ * @returns unknown Onboarding bootstrap result.
3040
+ * @throws ApiError
3041
+ */
3042
+ public static onboardingControllerBootstrap(
3043
+ data: OnboardingControllerBootstrapData
3044
+ ): CancelablePromise<OnboardingControllerBootstrapResponse> {
3045
+ return __request(OpenAPI, {
3046
+ method: 'POST',
3047
+ url: '/api/v1/{region}/bean/onboarding',
3048
+ path: {
3049
+ region: data.region
3050
+ },
3051
+ body: data.requestBody,
3052
+ mediaType: 'application/json',
3053
+ errors: {
3054
+ 422: 'Invalid region/account path/duplicate paths.'
3055
+ }
3056
+ });
3057
+ }
3058
+ }
3059
+
2664
3060
  export class BalanceReconciliationService {
2665
3061
  /**
2666
3062
  * Preview reconciliation (book vs actual)
@@ -2945,216 +3341,196 @@ export class BeanImportService {
2945
3341
  }
2946
3342
  }
2947
3343
 
2948
- export class BeanPlatformsService {
2949
- /**
2950
- * Get all platforms with statistics
2951
- * @returns unknown List of platforms with binding and account counts
2952
- * @throws ApiError
2953
- */
2954
- public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
2955
- return __request(OpenAPI, {
2956
- method: 'GET',
2957
- url: '/api/v1/bean/platforms'
2958
- });
2959
- }
2960
-
3344
+ export class ProviderSyncService {
2961
3345
  /**
2962
- * Create a new platform
3346
+ * Sync transactions from financial data provider
3347
+ *
3348
+ * Accepts raw transactions from external financial data providers, transforms them to Beancount format, and processes them through the ingestion pipeline.
3349
+ *
3350
+ * **Supported Providers:**
3351
+ * - **plaid**: Plaid API (US, Canada, Europe)
3352
+ * - **teller**: Teller API (US)
3353
+ * - **truelayer**: TrueLayer Open Banking (UK, Europe)
3354
+ * - **gocardless**: GoCardless Bank Account Data (Europe)
3355
+ * - **simplefin**: SimpleFIN (Self-hosted)
3356
+ * - **yodlee**: Yodlee (Global)
3357
+ * - **beancount-direct**: Beancount format transactions
3358
+ * - **parsed-bill**: Client-side parsed bill transactions
3359
+ *
3360
+ * **Processing Flow:**
3361
+ * 1. Transform raw data via provider adapter
3362
+ * 2. Validate transaction format
3363
+ * 3. Deduplicate using originalId
3364
+ * 4. Classify using rule engine
3365
+ * 5. Route low-confidence to Review Center
3366
+ * 6. Persist validated transactions
3367
+ *
2963
3368
  * @param data The data for the request.
3369
+ * @param data.providerName Provider name
3370
+ * @param data.region Region code for tenant context
2964
3371
  * @param data.requestBody
2965
- * @returns unknown Platform created successfully
3372
+ * @returns ProviderSyncResponseDto Sync completed successfully
2966
3373
  * @throws ApiError
2967
3374
  */
2968
- public static platformControllerCreate(
2969
- data: PlatformControllerCreateData
2970
- ): CancelablePromise<PlatformControllerCreateResponse> {
3375
+ public static providerSyncControllerSync(
3376
+ data: ProviderSyncControllerSyncData
3377
+ ): CancelablePromise<ProviderSyncControllerSyncResponse> {
2971
3378
  return __request(OpenAPI, {
2972
3379
  method: 'POST',
2973
- url: '/api/v1/bean/platforms',
3380
+ url: '/api/v1/{region}/bean/import/provider/{providerName}/sync',
3381
+ path: {
3382
+ providerName: data.providerName,
3383
+ region: data.region
3384
+ },
2974
3385
  body: data.requestBody,
2975
3386
  mediaType: 'application/json',
2976
3387
  errors: {
2977
- 409: 'Platform already exists'
3388
+ 400: 'Invalid request data',
3389
+ 401: 'Missing or invalid authentication',
3390
+ 404: 'Provider not supported'
2978
3391
  }
2979
3392
  });
2980
3393
  }
2981
3394
 
2982
3395
  /**
2983
- * Get platform list for current user
2984
- * @returns unknown List of platforms with user binding status
2985
- * @throws ApiError
2986
- */
2987
- public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
2988
- return __request(OpenAPI, {
2989
- method: 'GET',
2990
- url: '/api/v1/bean/platforms/list'
2991
- });
2992
- }
2993
-
2994
- /**
2995
- * Match platforms by name or alias
3396
+ * Get supported providers
3397
+ * Returns a list of all providers supported by the sync endpoint.
2996
3398
  * @param data The data for the request.
2997
- * @param data.q Search query — Chinese name, English name, or abbreviation
2998
- * @param data.region Region code for category override lookup
2999
- * @returns unknown List of matching platforms with suggested segment names
3399
+ * @param data.region Region code for tenant context
3400
+ * @returns SupportedProvidersResponseDto List of supported providers
3000
3401
  * @throws ApiError
3001
3402
  */
3002
- public static platformControllerMatchPlatforms(
3003
- data: PlatformControllerMatchPlatformsData
3004
- ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3403
+ public static providerSyncControllerGetSupportedProviders(
3404
+ data: ProviderSyncControllerGetSupportedProvidersData
3405
+ ): CancelablePromise<ProviderSyncControllerGetSupportedProvidersResponse> {
3005
3406
  return __request(OpenAPI, {
3006
3407
  method: 'GET',
3007
- url: '/api/v1/bean/platforms/match',
3008
- query: {
3009
- q: data.q,
3408
+ url: '/api/v1/{region}/bean/import/provider/supported',
3409
+ path: {
3010
3410
  region: data.region
3411
+ },
3412
+ errors: {
3413
+ 401: 'Missing or invalid authentication'
3011
3414
  }
3012
3415
  });
3013
3416
  }
3014
3417
 
3015
3418
  /**
3016
- * Update a platform
3419
+ * Check if provider is supported
3420
+ * Returns whether a specific provider is supported.
3017
3421
  * @param data The data for the request.
3018
- * @param data.id Platform ID
3019
- * @param data.requestBody
3020
- * @returns unknown Platform updated successfully
3422
+ * @param data.providerName Provider name to check
3423
+ * @param data.region Region code for tenant context
3424
+ * @returns unknown Provider support status
3021
3425
  * @throws ApiError
3022
3426
  */
3023
- public static platformControllerUpdate(
3024
- data: PlatformControllerUpdateData
3025
- ): CancelablePromise<PlatformControllerUpdateResponse> {
3427
+ public static providerSyncControllerIsProviderSupported(
3428
+ data: ProviderSyncControllerIsProviderSupportedData
3429
+ ): CancelablePromise<ProviderSyncControllerIsProviderSupportedResponse> {
3026
3430
  return __request(OpenAPI, {
3027
- method: 'PUT',
3028
- url: '/api/v1/bean/platforms/{id}',
3431
+ method: 'GET',
3432
+ url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
3029
3433
  path: {
3030
- id: data.id
3434
+ providerName: data.providerName,
3435
+ region: data.region
3031
3436
  },
3032
- body: data.requestBody,
3033
- mediaType: 'application/json',
3034
3437
  errors: {
3035
- 404: 'Platform not found'
3438
+ 401: 'Missing or invalid authentication'
3036
3439
  }
3037
3440
  });
3038
3441
  }
3442
+ }
3039
3443
 
3444
+ export class ExternalAccountLinksService {
3040
3445
  /**
3041
- * Delete a platform
3446
+ * Create an external account → BeanAccount mapping (ADR-0113)
3042
3447
  * @param data The data for the request.
3043
- * @param data.id Platform ID
3044
- * @returns void Platform deleted successfully
3448
+ * @param data.region Region code for tenant context
3449
+ * @param data.requestBody
3450
+ * @returns ExternalAccountLinkResponseDto Link created.
3045
3451
  * @throws ApiError
3046
3452
  */
3047
- public static platformControllerDelete(
3048
- data: PlatformControllerDeleteData
3049
- ): CancelablePromise<PlatformControllerDeleteResponse> {
3453
+ public static externalAccountLinkControllerCreate(
3454
+ data: ExternalAccountLinkControllerCreateData
3455
+ ): CancelablePromise<ExternalAccountLinkControllerCreateResponse> {
3050
3456
  return __request(OpenAPI, {
3051
- method: 'DELETE',
3052
- url: '/api/v1/bean/platforms/{id}',
3457
+ method: 'POST',
3458
+ url: '/api/v1/{region}/bean/external-account-links',
3053
3459
  path: {
3054
- id: data.id
3460
+ region: data.region
3055
3461
  },
3462
+ body: data.requestBody,
3463
+ mediaType: 'application/json',
3056
3464
  errors: {
3057
- 404: 'Platform not found'
3465
+ 422: 'beanAccountId not owned, or an active link already exists.'
3058
3466
  }
3059
3467
  });
3060
3468
  }
3061
- }
3062
3469
 
3063
- export class ProviderSyncService {
3064
3470
  /**
3065
- * Sync transactions from financial data provider
3066
- *
3067
- * Accepts raw transactions from external financial data providers, transforms them to Beancount format, and processes them through the ingestion pipeline.
3068
- *
3069
- * **Supported Providers:**
3070
- * - **plaid**: Plaid API (US, Canada, Europe)
3071
- * - **teller**: Teller API (US)
3072
- * - **truelayer**: TrueLayer Open Banking (UK, Europe)
3073
- * - **gocardless**: GoCardless Bank Account Data (Europe)
3074
- * - **simplefin**: SimpleFIN (Self-hosted)
3075
- * - **yodlee**: Yodlee (Global)
3076
- * - **beancount-direct**: Beancount format transactions
3077
- * - **parsed-bill**: Client-side parsed bill transactions
3078
- *
3079
- * **Processing Flow:**
3080
- * 1. Transform raw data via provider adapter
3081
- * 2. Validate transaction format
3082
- * 3. Deduplicate using originalId
3083
- * 4. Classify using rule engine
3084
- * 5. Route low-confidence to Review Center
3085
- * 6. Persist validated transactions
3086
- *
3471
+ * List the user's active external account links
3087
3472
  * @param data The data for the request.
3088
- * @param data.providerName Provider name
3473
+ * @param data.provider
3089
3474
  * @param data.region Region code for tenant context
3090
- * @param data.requestBody
3091
- * @returns ProviderSyncResponseDto Sync completed successfully
3475
+ * @returns ExternalAccountLinkListResponseDto Links retrieved.
3092
3476
  * @throws ApiError
3093
3477
  */
3094
- public static providerSyncControllerSync(
3095
- data: ProviderSyncControllerSyncData
3096
- ): CancelablePromise<ProviderSyncControllerSyncResponse> {
3478
+ public static externalAccountLinkControllerFindAll(
3479
+ data: ExternalAccountLinkControllerFindAllData
3480
+ ): CancelablePromise<ExternalAccountLinkControllerFindAllResponse> {
3097
3481
  return __request(OpenAPI, {
3098
- method: 'POST',
3099
- url: '/api/v1/{region}/bean/import/provider/{providerName}/sync',
3482
+ method: 'GET',
3483
+ url: '/api/v1/{region}/bean/external-account-links',
3100
3484
  path: {
3101
- providerName: data.providerName,
3102
3485
  region: data.region
3103
3486
  },
3104
- body: data.requestBody,
3105
- mediaType: 'application/json',
3106
- errors: {
3107
- 400: 'Invalid request data',
3108
- 401: 'Missing or invalid authentication',
3109
- 404: 'Provider not supported'
3487
+ query: {
3488
+ provider: data.provider
3110
3489
  }
3111
3490
  });
3112
3491
  }
3113
3492
 
3114
3493
  /**
3115
- * Get supported providers
3116
- * Returns a list of all providers supported by the sync endpoint.
3494
+ * Get a single external account link
3117
3495
  * @param data The data for the request.
3496
+ * @param data.id
3118
3497
  * @param data.region Region code for tenant context
3119
- * @returns SupportedProvidersResponseDto List of supported providers
3498
+ * @returns ExternalAccountLinkResponseDto Link retrieved.
3120
3499
  * @throws ApiError
3121
3500
  */
3122
- public static providerSyncControllerGetSupportedProviders(
3123
- data: ProviderSyncControllerGetSupportedProvidersData
3124
- ): CancelablePromise<ProviderSyncControllerGetSupportedProvidersResponse> {
3501
+ public static externalAccountLinkControllerFindOne(
3502
+ data: ExternalAccountLinkControllerFindOneData
3503
+ ): CancelablePromise<ExternalAccountLinkControllerFindOneResponse> {
3125
3504
  return __request(OpenAPI, {
3126
3505
  method: 'GET',
3127
- url: '/api/v1/{region}/bean/import/provider/supported',
3506
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3128
3507
  path: {
3508
+ id: data.id,
3129
3509
  region: data.region
3130
3510
  },
3131
3511
  errors: {
3132
- 401: 'Missing or invalid authentication'
3512
+ 422: 'Link not found or not owned by the user.'
3133
3513
  }
3134
3514
  });
3135
3515
  }
3136
3516
 
3137
3517
  /**
3138
- * Check if provider is supported
3139
- * Returns whether a specific provider is supported.
3518
+ * Soft-delete (disconnect) an external account link
3140
3519
  * @param data The data for the request.
3141
- * @param data.providerName Provider name to check
3520
+ * @param data.id
3142
3521
  * @param data.region Region code for tenant context
3143
- * @returns unknown Provider support status
3522
+ * @returns void Link soft-deleted; historical transactions are unaffected.
3144
3523
  * @throws ApiError
3145
3524
  */
3146
- public static providerSyncControllerIsProviderSupported(
3147
- data: ProviderSyncControllerIsProviderSupportedData
3148
- ): CancelablePromise<ProviderSyncControllerIsProviderSupportedResponse> {
3525
+ public static externalAccountLinkControllerRemove(
3526
+ data: ExternalAccountLinkControllerRemoveData
3527
+ ): CancelablePromise<ExternalAccountLinkControllerRemoveResponse> {
3149
3528
  return __request(OpenAPI, {
3150
- method: 'GET',
3151
- url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
3529
+ method: 'DELETE',
3530
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3152
3531
  path: {
3153
- providerName: data.providerName,
3532
+ id: data.id,
3154
3533
  region: data.region
3155
- },
3156
- errors: {
3157
- 401: 'Missing or invalid authentication'
3158
3534
  }
3159
3535
  });
3160
3536
  }
@@ -3318,361 +3694,173 @@ export class BeanNlpService {
3318
3694
  }
3319
3695
  }
3320
3696
 
3321
- export class DashboardService {
3322
- /**
3323
- * Get net worth overview
3324
- * Returns total net worth with breakdown of assets and liabilities
3325
- * @param data The data for the request.
3326
- * @param data.region Region code for tenant context
3327
- * @param data.date Date for balance calculation (ISO 8601 format)
3328
- * @returns NetWorthResponseDto Net worth retrieved successfully
3329
- * @throws ApiError
3330
- */
3331
- public static dashboardControllerGetNetWorth(
3332
- data: DashboardControllerGetNetWorthData
3333
- ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
3334
- return __request(OpenAPI, {
3335
- method: 'GET',
3336
- url: '/api/v1/{region}/dashboard/net-worth',
3337
- path: {
3338
- region: data.region
3339
- },
3340
- query: {
3341
- date: data.date
3342
- },
3343
- errors: {
3344
- 401: 'User not authenticated'
3345
- }
3346
- });
3347
- }
3348
-
3349
- /**
3350
- * Get accounts grouped by platform
3351
- * Returns accounts with balances grouped by financial platform
3352
- * @param data The data for the request.
3353
- * @param data.region Region code for tenant context
3354
- * @param data.groupBy Grouping strategy
3355
- * @param data.date Date for balance calculation (ISO 8601 format)
3356
- * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
3357
- * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
3358
- * @throws ApiError
3359
- */
3360
- public static dashboardControllerGetAccounts(
3361
- data: DashboardControllerGetAccountsData
3362
- ): CancelablePromise<DashboardControllerGetAccountsResponse> {
3363
- return __request(OpenAPI, {
3364
- method: 'GET',
3365
- url: '/api/v1/{region}/dashboard/accounts',
3366
- path: {
3367
- region: data.region
3368
- },
3369
- query: {
3370
- groupBy: data.groupBy,
3371
- date: data.date,
3372
- accountId: data.accountId
3373
- },
3374
- errors: {
3375
- 401: 'User not authenticated'
3376
- }
3377
- });
3378
- }
3379
-
3380
- /**
3381
- * Get cash flow summary
3382
- * Returns income, expenses, and savings for a monthly period
3383
- * @param data The data for the request.
3384
- * @param data.period Period in YYYY-MM format
3385
- * @param data.region Region code for tenant context
3386
- * @returns CashFlowResponseDto Cash flow retrieved successfully
3387
- * @throws ApiError
3388
- */
3389
- public static dashboardControllerGetCashFlow(
3390
- data: DashboardControllerGetCashFlowData
3391
- ): CancelablePromise<DashboardControllerGetCashFlowResponse> {
3392
- return __request(OpenAPI, {
3393
- method: 'GET',
3394
- url: '/api/v1/{region}/dashboard/cash-flow',
3395
- path: {
3396
- region: data.region
3397
- },
3398
- query: {
3399
- period: data.period
3400
- },
3401
- errors: {
3402
- 400: 'Invalid period format',
3403
- 401: 'User not authenticated'
3404
- }
3405
- });
3406
- }
3407
-
3408
- /**
3409
- * Get expenses/income grouped by functional category
3410
- * 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)
3411
- * @param data The data for the request.
3412
- * @param data.region Region code for tenant context
3413
- * @param data.groupBy Grouping strategy
3414
- * @param data.period Time window (1m = current calendar month)
3415
- * @param data.flow Account root to aggregate (expense → ^Expenses:, income → ^Income:)
3416
- * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
3417
- * @throws ApiError
3418
- */
3419
- public static dashboardControllerGetExpenses(
3420
- data: DashboardControllerGetExpensesData
3421
- ): CancelablePromise<DashboardControllerGetExpensesResponse> {
3422
- return __request(OpenAPI, {
3423
- method: 'GET',
3424
- url: '/api/v1/{region}/dashboard/expenses',
3425
- path: {
3426
- region: data.region
3427
- },
3428
- query: {
3429
- groupBy: data.groupBy,
3430
- period: data.period,
3431
- flow: data.flow
3432
- },
3433
- errors: {
3434
- 400: 'Invalid groupBy or period',
3435
- 401: 'User not authenticated'
3436
- }
3437
- });
3438
- }
3439
- }
3440
-
3441
- export class InvestmentService {
3697
+ export class BeanPlatformsService {
3442
3698
  /**
3443
- * Get per-holding unrealized + realized P&L
3444
- * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3445
- * @param data The data for the request.
3446
- * @param data.region Region code for tenant context
3447
- * @param data.asOf As-of date (ISO 8601), defaults to today
3448
- * @param data.accountId Scope to a single account
3449
- * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
3450
- * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3699
+ * Get all platforms with statistics
3700
+ * @returns unknown List of platforms with binding and account counts
3451
3701
  * @throws ApiError
3452
3702
  */
3453
- public static holdingPnlControllerGetHoldingPnl(
3454
- data: HoldingPnlControllerGetHoldingPnlData
3455
- ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3703
+ public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
3456
3704
  return __request(OpenAPI, {
3457
3705
  method: 'GET',
3458
- url: '/api/v1/{region}/investment/holdings/pnl',
3459
- path: {
3460
- region: data.region
3461
- },
3462
- query: {
3463
- asOf: data.asOf,
3464
- accountId: data.accountId,
3465
- method: data.method
3466
- },
3467
- errors: {
3468
- 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
3469
- 401: 'User not authenticated'
3470
- }
3706
+ url: '/api/v1/bean/platforms'
3471
3707
  });
3472
3708
  }
3473
- }
3474
3709
 
3475
- export class BeanPricesService {
3476
3710
  /**
3477
- * Create a new price
3478
- * Creates a new price entry for the authenticated user
3711
+ * Create a new platform
3479
3712
  * @param data The data for the request.
3480
- * @param data.region Region code for tenant context
3481
3713
  * @param data.requestBody
3482
- * @returns PriceResponseDto Price created successfully
3714
+ * @returns unknown Platform created successfully
3483
3715
  * @throws ApiError
3484
3716
  */
3485
- public static priceControllerCreate(
3486
- data: PriceControllerCreateData
3487
- ): CancelablePromise<PriceControllerCreateResponse> {
3717
+ public static platformControllerCreate(
3718
+ data: PlatformControllerCreateData
3719
+ ): CancelablePromise<PlatformControllerCreateResponse> {
3488
3720
  return __request(OpenAPI, {
3489
3721
  method: 'POST',
3490
- url: '/api/v1/{region}/bean/prices',
3491
- path: {
3492
- region: data.region
3493
- },
3722
+ url: '/api/v1/bean/platforms',
3494
3723
  body: data.requestBody,
3495
3724
  mediaType: 'application/json',
3496
3725
  errors: {
3497
- 404: 'Currency or quoteCurrency commodity not found',
3498
- 409: 'Price already exists for this currency pair and date'
3726
+ 409: 'Platform already exists'
3499
3727
  }
3500
3728
  });
3501
3729
  }
3502
3730
 
3503
3731
  /**
3504
- * List user prices
3505
- * Returns all price entries for the authenticated user with optional filtering
3506
- * @param data The data for the request.
3507
- * @param data.region Region code for tenant context
3508
- * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
3509
- * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
3510
- * @param data.dateFrom Filter prices from this date (ISO 8601 format)
3511
- * @param data.dateTo Filter prices to this date (ISO 8601 format)
3512
- * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
3513
- * @param data.page Page number for pagination (default: 1)
3514
- * @param data.limit Number of items per page (default: 20, max: 100)
3515
- * @returns PriceListResponseDto Prices retrieved successfully
3732
+ * Get platform list for current user
3733
+ * @returns PlatformListItemDto List of platforms with user binding status
3516
3734
  * @throws ApiError
3517
3735
  */
3518
- public static priceControllerFindAll(
3519
- data: PriceControllerFindAllData
3520
- ): CancelablePromise<PriceControllerFindAllResponse> {
3736
+ public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
3521
3737
  return __request(OpenAPI, {
3522
3738
  method: 'GET',
3523
- url: '/api/v1/{region}/bean/prices',
3524
- path: {
3525
- region: data.region
3526
- },
3527
- query: {
3528
- currency: data.currency,
3529
- quoteCurrency: data.quoteCurrency,
3530
- dateFrom: data.dateFrom,
3531
- dateTo: data.dateTo,
3532
- search: data.search,
3533
- page: data.page,
3534
- limit: data.limit
3535
- }
3739
+ url: '/api/v1/bean/platforms/list'
3536
3740
  });
3537
3741
  }
3538
3742
 
3539
3743
  /**
3540
- * Get price by ID
3541
- * Returns a single price entry by its ID
3744
+ * Match platforms by name or alias
3542
3745
  * @param data The data for the request.
3543
- * @param data.id Price ID
3544
- * @param data.region Region code for tenant context
3545
- * @returns PriceResponseDto Price retrieved successfully
3746
+ * @param data.q Search query — Chinese name, English name, or abbreviation
3747
+ * @param data.region Region code for category override lookup
3748
+ * @returns PlatformMatchResponseDto Matching platforms with overall match type and truncation flag
3546
3749
  * @throws ApiError
3547
3750
  */
3548
- public static priceControllerFindOne(
3549
- data: PriceControllerFindOneData
3550
- ): CancelablePromise<PriceControllerFindOneResponse> {
3751
+ public static platformControllerMatchPlatforms(
3752
+ data: PlatformControllerMatchPlatformsData
3753
+ ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3551
3754
  return __request(OpenAPI, {
3552
3755
  method: 'GET',
3553
- url: '/api/v1/{region}/bean/prices/{id}',
3554
- path: {
3555
- id: data.id,
3756
+ url: '/api/v1/bean/platforms/match',
3757
+ query: {
3758
+ q: data.q,
3556
3759
  region: data.region
3557
- },
3558
- errors: {
3559
- 404: 'Price not found'
3560
3760
  }
3561
3761
  });
3562
3762
  }
3563
3763
 
3564
3764
  /**
3565
- * Update a price
3566
- * Updates an existing price entry
3765
+ * Update a platform
3567
3766
  * @param data The data for the request.
3568
- * @param data.id Price ID
3569
- * @param data.region Region code for tenant context
3767
+ * @param data.id Platform ID
3570
3768
  * @param data.requestBody
3571
- * @returns PriceResponseDto Price updated successfully
3769
+ * @returns unknown Platform updated successfully
3572
3770
  * @throws ApiError
3573
3771
  */
3574
- public static priceControllerUpdate(
3575
- data: PriceControllerUpdateData
3576
- ): CancelablePromise<PriceControllerUpdateResponse> {
3772
+ public static platformControllerUpdate(
3773
+ data: PlatformControllerUpdateData
3774
+ ): CancelablePromise<PlatformControllerUpdateResponse> {
3577
3775
  return __request(OpenAPI, {
3578
3776
  method: 'PUT',
3579
- url: '/api/v1/{region}/bean/prices/{id}',
3777
+ url: '/api/v1/bean/platforms/{id}',
3580
3778
  path: {
3581
- id: data.id,
3582
- region: data.region
3779
+ id: data.id
3583
3780
  },
3584
3781
  body: data.requestBody,
3585
3782
  mediaType: 'application/json',
3586
3783
  errors: {
3587
- 404: 'Price not found',
3588
- 409: 'Updated price conflicts with existing price'
3784
+ 404: 'Platform not found'
3589
3785
  }
3590
3786
  });
3591
3787
  }
3592
3788
 
3593
3789
  /**
3594
- * Delete a price
3595
- * Deletes a price entry (hard delete)
3790
+ * Delete a platform
3596
3791
  * @param data The data for the request.
3597
- * @param data.id Price ID
3598
- * @param data.region Region code for tenant context
3599
- * @returns void Price deleted successfully
3792
+ * @param data.id Platform ID
3793
+ * @returns void Platform deleted successfully
3600
3794
  * @throws ApiError
3601
3795
  */
3602
- public static priceControllerDelete(
3603
- data: PriceControllerDeleteData
3604
- ): CancelablePromise<PriceControllerDeleteResponse> {
3796
+ public static platformControllerDelete(
3797
+ data: PlatformControllerDeleteData
3798
+ ): CancelablePromise<PlatformControllerDeleteResponse> {
3605
3799
  return __request(OpenAPI, {
3606
3800
  method: 'DELETE',
3607
- url: '/api/v1/{region}/bean/prices/{id}',
3801
+ url: '/api/v1/bean/platforms/{id}',
3608
3802
  path: {
3609
- id: data.id,
3610
- region: data.region
3803
+ id: data.id
3611
3804
  },
3612
3805
  errors: {
3613
- 404: 'Price not found'
3806
+ 404: 'Platform not found'
3614
3807
  }
3615
3808
  });
3616
3809
  }
3810
+ }
3617
3811
 
3812
+ export class DashboardService {
3618
3813
  /**
3619
- * Bulk create prices
3620
- * Creates multiple price entries at once (skips duplicates)
3814
+ * Get net worth overview
3815
+ * Returns total net worth with breakdown of assets and liabilities
3621
3816
  * @param data The data for the request.
3622
3817
  * @param data.region Region code for tenant context
3623
- * @param data.requestBody
3624
- * @returns PriceResponseDto Prices created successfully
3818
+ * @param data.date Date for balance calculation (ISO 8601 format)
3819
+ * @returns NetWorthResponseDto Net worth retrieved successfully
3625
3820
  * @throws ApiError
3626
3821
  */
3627
- public static priceControllerBulkCreate(
3628
- data: PriceControllerBulkCreateData
3629
- ): CancelablePromise<PriceControllerBulkCreateResponse> {
3822
+ public static dashboardControllerGetNetWorth(
3823
+ data: DashboardControllerGetNetWorthData
3824
+ ): CancelablePromise<DashboardControllerGetNetWorthResponse> {
3630
3825
  return __request(OpenAPI, {
3631
- method: 'POST',
3632
- url: '/api/v1/{region}/bean/prices/bulk',
3826
+ method: 'GET',
3827
+ url: '/api/v1/{region}/dashboard/net-worth',
3633
3828
  path: {
3634
3829
  region: data.region
3635
3830
  },
3636
- body: data.requestBody,
3637
- mediaType: 'application/json'
3831
+ query: {
3832
+ date: data.date
3833
+ },
3834
+ errors: {
3835
+ 401: 'User not authenticated'
3836
+ }
3638
3837
  });
3639
3838
  }
3640
- }
3641
3839
 
3642
- export class ReportingService {
3643
3840
  /**
3644
- * Get portfolio value trends
3645
- *
3646
- * Returns time series data of portfolio net worth.
3647
- *
3648
- * **Multi-currency Support:**
3649
- * - `series[].byCurrency` - Currency breakdown for each data point
3650
- * - `byCurrency` - Separate time series grouped by currency
3651
- * - `warnings` - Exchange rate warnings if conversion failed
3652
- *
3653
- * **Parameters:**
3654
- * - `period`: Time period (1m, 3m, 6m, 1y)
3655
- * - `granularity`: Data granularity (day, week, month)
3656
- *
3841
+ * Get accounts grouped by platform
3842
+ * Returns accounts with balances grouped by financial platform
3657
3843
  * @param data The data for the request.
3658
3844
  * @param data.region Region code for tenant context
3659
- * @param data.period Time period
3660
- * @param data.granularity Data granularity
3661
- * @returns PortfolioTrendsResponseDto Trends retrieved successfully
3845
+ * @param data.groupBy Grouping strategy
3846
+ * @param data.date Date for balance calculation (ISO 8601 format)
3847
+ * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
3848
+ * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
3662
3849
  * @throws ApiError
3663
3850
  */
3664
- public static reportingControllerGetPortfolioTrends(
3665
- data: ReportingControllerGetPortfolioTrendsData
3666
- ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
3851
+ public static dashboardControllerGetAccounts(
3852
+ data: DashboardControllerGetAccountsData
3853
+ ): CancelablePromise<DashboardControllerGetAccountsResponse> {
3667
3854
  return __request(OpenAPI, {
3668
3855
  method: 'GET',
3669
- url: '/api/v1/{region}/reporting/portfolio/trends',
3856
+ url: '/api/v1/{region}/dashboard/accounts',
3670
3857
  path: {
3671
3858
  region: data.region
3672
3859
  },
3673
3860
  query: {
3674
- period: data.period,
3675
- granularity: data.granularity
3861
+ groupBy: data.groupBy,
3862
+ date: data.date,
3863
+ accountId: data.accountId
3676
3864
  },
3677
3865
  errors: {
3678
3866
  401: 'User not authenticated'
@@ -3681,116 +3869,95 @@ export class ReportingService {
3681
3869
  }
3682
3870
 
3683
3871
  /**
3684
- * Get cash-flow trends
3685
- *
3686
- * Monthly income / expense / netSavings over a fixed N-month window
3687
- * (current month + N−1 prior). Missing months are zero-filled (flow metric).
3688
- *
3689
- * **Parameters:**
3690
- * - `period`: 1m | 3m | 6m | 1y (default 6m)
3691
- * - `granularity`: accepted for API symmetry; v1 returns month buckets
3692
- *
3872
+ * Get cash flow summary
3873
+ * Returns income, expenses, and savings for a monthly period
3693
3874
  * @param data The data for the request.
3875
+ * @param data.period Period in YYYY-MM format
3694
3876
  * @param data.region Region code for tenant context
3695
- * @param data.period Time period
3696
- * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
3697
- * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
3877
+ * @returns CashFlowResponseDto Cash flow retrieved successfully
3698
3878
  * @throws ApiError
3699
3879
  */
3700
- public static reportingControllerGetCashFlowTrends(
3701
- data: ReportingControllerGetCashFlowTrendsData
3702
- ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
3880
+ public static dashboardControllerGetCashFlow(
3881
+ data: DashboardControllerGetCashFlowData
3882
+ ): CancelablePromise<DashboardControllerGetCashFlowResponse> {
3703
3883
  return __request(OpenAPI, {
3704
3884
  method: 'GET',
3705
- url: '/api/v1/{region}/reporting/cash-flow/trends',
3885
+ url: '/api/v1/{region}/dashboard/cash-flow',
3706
3886
  path: {
3707
3887
  region: data.region
3708
3888
  },
3709
3889
  query: {
3710
- period: data.period,
3711
- granularity: data.granularity
3890
+ period: data.period
3712
3891
  },
3713
3892
  errors: {
3893
+ 400: 'Invalid period format',
3714
3894
  401: 'User not authenticated'
3715
3895
  }
3716
3896
  });
3717
3897
  }
3718
3898
 
3719
3899
  /**
3720
- * Generate portfolio snapshot
3721
- *
3722
- * Manually generate a portfolio snapshot for a specific date.
3723
- *
3724
- * **Multi-currency Support:**
3725
- * - Fetches balances grouped by currency
3726
- * - Uses user's baseCurrency setting for conversion
3727
- * - Stores exchange rates and warnings
3728
- *
3729
- * **Use Cases:**
3730
- * - Testing snapshot generation
3731
- * - Force regeneration after data correction
3732
- * - Initial setup for new users
3733
- *
3900
+ * Get expenses/income grouped by functional category
3901
+ * 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)
3734
3902
  * @param data The data for the request.
3735
3903
  * @param data.region Region code for tenant context
3736
- * @param data.requestBody Optional date (defaults to today)
3737
- * @returns GenerateSnapshotResponse Snapshot generated successfully
3904
+ * @param data.groupBy Grouping strategy
3905
+ * @param data.period Time window (1m = current calendar month)
3906
+ * @param data.flow Account root to aggregate (expense → ^Expenses:, income → ^Income:)
3907
+ * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
3738
3908
  * @throws ApiError
3739
3909
  */
3740
- public static reportingControllerGenerateSnapshot(
3741
- data: ReportingControllerGenerateSnapshotData
3742
- ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
3910
+ public static dashboardControllerGetExpenses(
3911
+ data: DashboardControllerGetExpensesData
3912
+ ): CancelablePromise<DashboardControllerGetExpensesResponse> {
3743
3913
  return __request(OpenAPI, {
3744
- method: 'POST',
3745
- url: '/api/v1/{region}/reporting/snapshots/generate',
3914
+ method: 'GET',
3915
+ url: '/api/v1/{region}/dashboard/expenses',
3746
3916
  path: {
3747
3917
  region: data.region
3748
3918
  },
3749
- body: data.requestBody,
3750
- mediaType: 'application/json',
3919
+ query: {
3920
+ groupBy: data.groupBy,
3921
+ period: data.period,
3922
+ flow: data.flow
3923
+ },
3751
3924
  errors: {
3752
- 400: 'Invalid date format',
3925
+ 400: 'Invalid groupBy or period',
3753
3926
  401: 'User not authenticated'
3754
3927
  }
3755
3928
  });
3756
3929
  }
3930
+ }
3757
3931
 
3932
+ export class InvestmentService {
3758
3933
  /**
3759
- * Backfill portfolio snapshots
3760
- *
3761
- * Generate snapshots for a date range (historical data backfill).
3762
- *
3763
- * **Multi-currency Support:**
3764
- * - Each snapshot includes multi-currency data
3765
- * - Uses exchange rates available at generation time
3766
- * - Warnings stored for missing exchange rates
3767
- *
3768
- * **Best Practices:**
3769
- * - Use for initial setup after account configuration
3770
- * - Run during low-traffic periods for large date ranges
3771
- * - Existing snapshots are skipped (not regenerated)
3772
- *
3934
+ * Get per-holding unrealized + realized P&L
3935
+ * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3773
3936
  * @param data The data for the request.
3774
3937
  * @param data.region Region code for tenant context
3775
- * @param data.requestBody
3776
- * @returns BackfillSnapshotsResponse Backfill completed successfully
3938
+ * @param data.asOf As-of date (ISO 8601), defaults to today
3939
+ * @param data.accountId Scope to a single account
3940
+ * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
3941
+ * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3777
3942
  * @throws ApiError
3778
3943
  */
3779
- public static reportingControllerBackfillSnapshots(
3780
- data: ReportingControllerBackfillSnapshotsData
3781
- ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
3944
+ public static holdingPnlControllerGetHoldingPnl(
3945
+ data: HoldingPnlControllerGetHoldingPnlData
3946
+ ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3782
3947
  return __request(OpenAPI, {
3783
- method: 'POST',
3784
- url: '/api/v1/{region}/reporting/snapshots/backfill',
3948
+ method: 'GET',
3949
+ url: '/api/v1/{region}/investment/holdings/pnl',
3785
3950
  path: {
3786
3951
  region: data.region
3787
3952
  },
3788
- body: data.requestBody,
3789
- mediaType: 'application/json',
3953
+ query: {
3954
+ asOf: data.asOf,
3955
+ accountId: data.accountId,
3956
+ method: data.method
3957
+ },
3790
3958
  errors: {
3791
- 400: 'Invalid date format or range',
3792
- 401: 'User not authenticated',
3793
- 409: 'Backfill already in progress for this user'
3959
+ 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
3960
+ 401: 'User not authenticated'
3794
3961
  }
3795
3962
  });
3796
3963
  }
@@ -3819,7 +3986,7 @@ export class AuthService {
3819
3986
  * Anonymous login with access token
3820
3987
  * @param data The data for the request.
3821
3988
  * @param data.requestBody
3822
- * @returns unknown Login successful
3989
+ * @returns AnonymousLoginResponseDto Login successful
3823
3990
  * @throws ApiError
3824
3991
  */
3825
3992
  public static authControllerAccessTokenLogin(
@@ -4006,3 +4173,53 @@ export class InfoService {
4006
4173
  });
4007
4174
  }
4008
4175
  }
4176
+
4177
+ export class MarketDataService {
4178
+ /**
4179
+ * Search market symbols by name or code
4180
+ * Ranked search over the openbb catalog. Empty `q` returns [].
4181
+ * @param data The data for the request.
4182
+ * @param data.q Search term — matched against symbol and instrument name. Empty string returns [].
4183
+ * @param data.limit Maximum number of results (clamped 1..50)
4184
+ * @param data.exchange Filter by exchange code (e.g. US, HK, SS, SZ)
4185
+ * @param data.assetType Filter by OpenBB asset_type (e.g. stock, etf)
4186
+ * @returns SymbolSearchResultDto Ranked search results
4187
+ * @throws ApiError
4188
+ */
4189
+ public static symbolControllerSearch(
4190
+ data: SymbolControllerSearchData
4191
+ ): CancelablePromise<SymbolControllerSearchResponse> {
4192
+ return __request(OpenAPI, {
4193
+ method: 'GET',
4194
+ url: '/api/v1/market/symbols/search',
4195
+ query: {
4196
+ q: data.q,
4197
+ limit: data.limit,
4198
+ exchange: data.exchange,
4199
+ assetType: data.assetType
4200
+ }
4201
+ });
4202
+ }
4203
+
4204
+ /**
4205
+ * Get a market symbol quote
4206
+ * @param data The data for the request.
4207
+ * @param data.symbol
4208
+ * @returns SymbolQuoteDto Symbol quote
4209
+ * @throws ApiError
4210
+ */
4211
+ public static symbolControllerGetQuote(
4212
+ data: SymbolControllerGetQuoteData
4213
+ ): CancelablePromise<SymbolControllerGetQuoteResponse> {
4214
+ return __request(OpenAPI, {
4215
+ method: 'GET',
4216
+ url: '/api/v1/market/symbols/{symbol}/quote',
4217
+ path: {
4218
+ symbol: data.symbol
4219
+ },
4220
+ errors: {
4221
+ 404: 'Symbol not found in the openbb catalog'
4222
+ }
4223
+ });
4224
+ }
4225
+ }