@firela/api-types 0.0.0-canary.8c68ebbe → 0.0.0-canary.8c76fd39

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