@firela/api-types 0.0.0-canary.6a42fd0e → 0.0.0-canary.6b17fb8b

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,
@@ -141,26 +143,14 @@ import type {
141
143
  ExpectedTransactionControllerEnterNowResponse,
142
144
  ForecastControllerGetForecastData,
143
145
  ForecastControllerGetForecastResponse,
144
- TransactionRuleControllerCreateData,
145
- TransactionRuleControllerCreateResponse,
146
- TransactionRuleControllerListData,
147
- TransactionRuleControllerListResponse,
148
- TransactionRuleControllerValidateData,
149
- TransactionRuleControllerValidateResponse,
150
- TransactionRuleControllerBulkCreateData,
151
- TransactionRuleControllerBulkCreateResponse,
152
- TransactionRuleControllerExportData,
153
- TransactionRuleControllerExportResponse,
154
- TransactionRuleControllerGetStatisticsData,
155
- TransactionRuleControllerGetStatisticsResponse,
156
- TransactionRuleControllerGetDetailData,
157
- TransactionRuleControllerGetDetailResponse,
158
- TransactionRuleControllerUpdateData,
159
- TransactionRuleControllerUpdateResponse,
160
- TransactionRuleControllerDeleteData,
161
- TransactionRuleControllerDeleteResponse,
162
- TransactionRuleControllerTestData,
163
- TransactionRuleControllerTestResponse,
146
+ ReportingControllerGetPortfolioTrendsData,
147
+ ReportingControllerGetPortfolioTrendsResponse,
148
+ ReportingControllerGetCashFlowTrendsData,
149
+ ReportingControllerGetCashFlowTrendsResponse,
150
+ ReportingControllerGenerateSnapshotData,
151
+ ReportingControllerGenerateSnapshotResponse,
152
+ ReportingControllerBackfillSnapshotsData,
153
+ ReportingControllerBackfillSnapshotsResponse,
164
154
  UserControllerDeleteOwnUserData,
165
155
  UserControllerDeleteOwnUserResponse,
166
156
  UserControllerGetUserData,
@@ -183,6 +173,26 @@ import type {
183
173
  PropertyControllerUpdateResponse,
184
174
  PropertyControllerDeleteData,
185
175
  PropertyControllerDeleteResponse,
176
+ TransactionRuleControllerCreateData,
177
+ TransactionRuleControllerCreateResponse,
178
+ TransactionRuleControllerListData,
179
+ TransactionRuleControllerListResponse,
180
+ TransactionRuleControllerValidateData,
181
+ TransactionRuleControllerValidateResponse,
182
+ TransactionRuleControllerBulkCreateData,
183
+ TransactionRuleControllerBulkCreateResponse,
184
+ TransactionRuleControllerExportData,
185
+ TransactionRuleControllerExportResponse,
186
+ TransactionRuleControllerGetStatisticsData,
187
+ TransactionRuleControllerGetStatisticsResponse,
188
+ TransactionRuleControllerGetDetailData,
189
+ TransactionRuleControllerGetDetailResponse,
190
+ TransactionRuleControllerUpdateData,
191
+ TransactionRuleControllerUpdateResponse,
192
+ TransactionRuleControllerDeleteData,
193
+ TransactionRuleControllerDeleteResponse,
194
+ TransactionRuleControllerTestData,
195
+ TransactionRuleControllerTestResponse,
186
196
  EventControllerCreateData,
187
197
  EventControllerCreateResponse,
188
198
  EventControllerFindAllData,
@@ -195,6 +205,8 @@ import type {
195
205
  EventControllerDeleteResponse,
196
206
  EventControllerGetSliceData,
197
207
  EventControllerGetSliceResponse,
208
+ OnboardingControllerBootstrapData,
209
+ OnboardingControllerBootstrapResponse,
198
210
  ReconciliationControllerComputeData,
199
211
  ReconciliationControllerComputeResponse,
200
212
  ReconciliationControllerAssertData,
@@ -216,22 +228,20 @@ import type {
216
228
  ImporterConfigControllerUpdateConfigResponse,
217
229
  ImporterConfigControllerResetConfigData,
218
230
  ImporterConfigControllerResetConfigResponse,
219
- PlatformControllerFindAllResponse,
220
- PlatformControllerCreateData,
221
- PlatformControllerCreateResponse,
222
- PlatformControllerGetPlatformListResponse,
223
- PlatformControllerMatchPlatformsData,
224
- PlatformControllerMatchPlatformsResponse,
225
- PlatformControllerUpdateData,
226
- PlatformControllerUpdateResponse,
227
- PlatformControllerDeleteData,
228
- PlatformControllerDeleteResponse,
229
231
  ProviderSyncControllerSyncData,
230
232
  ProviderSyncControllerSyncResponse,
231
233
  ProviderSyncControllerGetSupportedProvidersData,
232
234
  ProviderSyncControllerGetSupportedProvidersResponse,
233
235
  ProviderSyncControllerIsProviderSupportedData,
234
236
  ProviderSyncControllerIsProviderSupportedResponse,
237
+ ExternalAccountLinkControllerCreateData,
238
+ ExternalAccountLinkControllerCreateResponse,
239
+ ExternalAccountLinkControllerFindAllData,
240
+ ExternalAccountLinkControllerFindAllResponse,
241
+ ExternalAccountLinkControllerFindOneData,
242
+ ExternalAccountLinkControllerFindOneResponse,
243
+ ExternalAccountLinkControllerRemoveData,
244
+ ExternalAccountLinkControllerRemoveResponse,
235
245
  TelemetryControllerReportTelemetryData,
236
246
  TelemetryControllerReportTelemetryResponse,
237
247
  TelemetryControllerReportCoverageMissData,
@@ -244,6 +254,17 @@ import type {
244
254
  NlpControllerClearSessionResponse,
245
255
  NlpControllerGetSessionData,
246
256
  NlpControllerGetSessionResponse,
257
+ PlatformControllerFindAllResponse,
258
+ PlatformControllerCreateData,
259
+ PlatformControllerCreateResponse,
260
+ PlatformControllerGetPlatformListData,
261
+ PlatformControllerGetPlatformListResponse,
262
+ PlatformControllerMatchPlatformsData,
263
+ PlatformControllerMatchPlatformsResponse,
264
+ PlatformControllerUpdateData,
265
+ PlatformControllerUpdateResponse,
266
+ PlatformControllerDeleteData,
267
+ PlatformControllerDeleteResponse,
247
268
  DashboardControllerGetNetWorthData,
248
269
  DashboardControllerGetNetWorthResponse,
249
270
  DashboardControllerGetAccountsData,
@@ -254,14 +275,6 @@ import type {
254
275
  DashboardControllerGetExpensesResponse,
255
276
  HoldingPnlControllerGetHoldingPnlData,
256
277
  HoldingPnlControllerGetHoldingPnlResponse,
257
- ReportingControllerGetPortfolioTrendsData,
258
- ReportingControllerGetPortfolioTrendsResponse,
259
- ReportingControllerGetCashFlowTrendsData,
260
- ReportingControllerGetCashFlowTrendsResponse,
261
- ReportingControllerGenerateSnapshotData,
262
- ReportingControllerGenerateSnapshotResponse,
263
- ReportingControllerBackfillSnapshotsData,
264
- ReportingControllerBackfillSnapshotsResponse,
265
278
  ApiKeysControllerCreateApiKeyResponse,
266
279
  AuthControllerAccessTokenLoginData,
267
280
  AuthControllerAccessTokenLoginResponse,
@@ -276,7 +289,11 @@ import type {
276
289
  HealthControllerResetCircuitBreakerData,
277
290
  HealthControllerResetCircuitBreakerResponse,
278
291
  HealthControllerGetMetricsResponse,
279
- InfoControllerGetInfoResponse
292
+ InfoControllerGetInfoResponse,
293
+ SymbolControllerSearchData,
294
+ SymbolControllerSearchResponse,
295
+ SymbolControllerGetQuoteData,
296
+ SymbolControllerGetQuoteResponse
280
297
  } from './types.gen';
281
298
 
282
299
  export class BeanAccountsService {
@@ -314,7 +331,7 @@ export class BeanAccountsService {
314
331
  * @param data.type Filter by account type
315
332
  * @param data.status Filter by status
316
333
  * @param data.isCustom Filter by custom (user-created) accounts only
317
- * @param data.search Search term for path or i18nKey
334
+ * @param data.search Search term for account path
318
335
  * @param data.limit Maximum number of results
319
336
  * @param data.offset Number of results to skip
320
337
  * @returns AccountListResponseDto Accounts retrieved successfully
@@ -395,7 +412,7 @@ export class BeanAccountsService {
395
412
 
396
413
  /**
397
414
  * Delete account
398
- * Deletes an account (only if no transactions)
415
+ * Deletes an account (only if no active transactions; voided/superseded residual postings are cleaned up)
399
416
  * @param data The data for the request.
400
417
  * @param data.id Account UUID
401
418
  * @param data.region Region code for tenant context
@@ -414,7 +431,7 @@ export class BeanAccountsService {
414
431
  },
415
432
  errors: {
416
433
  404: 'Account not found',
417
- 409: 'Account has transactions and cannot be deleted'
434
+ 409: 'Account has active transactions and cannot be deleted'
418
435
  }
419
436
  });
420
437
  }
@@ -476,6 +493,35 @@ export class BeanAccountsService {
476
493
  }
477
494
  });
478
495
  }
496
+
497
+ /**
498
+ * Post an opening-balance transaction
499
+ * 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.
500
+ * @param data The data for the request.
501
+ * @param data.id Account UUID
502
+ * @param data.region Region code for tenant context
503
+ * @param data.requestBody
504
+ * @returns OpeningBalanceResultDto Opening-balance transaction created
505
+ * @throws ApiError
506
+ */
507
+ public static accountControllerAddOpeningBalance(
508
+ data: AccountControllerAddOpeningBalanceData
509
+ ): CancelablePromise<AccountControllerAddOpeningBalanceResponse> {
510
+ return __request(OpenAPI, {
511
+ method: 'POST',
512
+ url: '/api/v1/{region}/bean/accounts/{id}/opening-balance',
513
+ path: {
514
+ id: data.id,
515
+ region: data.region
516
+ },
517
+ body: data.requestBody,
518
+ mediaType: 'application/json',
519
+ errors: {
520
+ 404: 'Account not found',
521
+ 409: 'An opening balance already exists for this account'
522
+ }
523
+ });
524
+ }
479
525
  }
480
526
 
481
527
  export class BeanAccountStandardsService {
@@ -507,7 +553,7 @@ export class BeanAccountStandardsService {
507
553
 
508
554
  /**
509
555
  * Get template metadata for an account path
510
- * Returns extendable status and root type for a template path.
556
+ * Returns root type for a template path.
511
557
  * @param data The data for the request.
512
558
  * @param data.region Region code for tenant context
513
559
  * @param data.path Account path to check
@@ -802,7 +848,7 @@ export class BeanBalancesService {
802
848
  * Query account balance
803
849
  * Calculate account balance at a specific date for a single currency
804
850
  * @param data The data for the request.
805
- * @param data.account Account name (e.g., "Assets:Bank:Checking")
851
+ * @param data.account Account name (e.g., "Assets:Checking")
806
852
  * @param data.region Region code for tenant context
807
853
  * @param data.date Date to calculate balance at (ISO 8601 format)
808
854
  * @param data.currency Currency to query (e.g., "USD", "CNY")
@@ -2120,295 +2166,174 @@ export class RecurringForecastService {
2120
2166
  }
2121
2167
  }
2122
2168
 
2123
- export class BeanTransactionRulesService {
2169
+ export class ReportingService {
2124
2170
  /**
2125
- * Create a new transaction rule (or upsert if upsertByPayee=true)
2126
- * Creates a new rule. If upsertByPayee=true, updates existing rule matching payeeKeywords[0] instead of creating duplicate.
2171
+ * Get portfolio value trends
2172
+ *
2173
+ * Returns time series data of portfolio net worth.
2174
+ *
2175
+ * **Multi-currency Support:**
2176
+ * - `series[].byCurrency` - Currency breakdown for each data point
2177
+ * - `byCurrency` - Separate time series grouped by currency
2178
+ * - `warnings` - Exchange rate warnings if conversion failed
2179
+ *
2180
+ * **Parameters:**
2181
+ * - `period`: Time period (1m, 3m, 6m, 1y)
2182
+ * - `granularity`: Data granularity (day, week, month)
2183
+ *
2127
2184
  * @param data The data for the request.
2128
2185
  * @param data.region Region code for tenant context
2129
- * @param data.requestBody
2130
- * @returns TransactionRuleResponseDto Rule updated successfully (upsert mode)
2186
+ * @param data.period Time period
2187
+ * @param data.granularity Data granularity
2188
+ * @returns PortfolioTrendsResponseDto Trends retrieved successfully
2131
2189
  * @throws ApiError
2132
2190
  */
2133
- public static transactionRuleControllerCreate(
2134
- data: TransactionRuleControllerCreateData
2135
- ): CancelablePromise<TransactionRuleControllerCreateResponse> {
2191
+ public static reportingControllerGetPortfolioTrends(
2192
+ data: ReportingControllerGetPortfolioTrendsData
2193
+ ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
2136
2194
  return __request(OpenAPI, {
2137
- method: 'POST',
2138
- url: '/api/v1/{region}/bean/transaction-rules',
2195
+ method: 'GET',
2196
+ url: '/api/v1/{region}/reporting/portfolio/trends',
2139
2197
  path: {
2140
2198
  region: data.region
2141
2199
  },
2142
- body: data.requestBody,
2143
- mediaType: 'application/json',
2200
+ query: {
2201
+ period: data.period,
2202
+ granularity: data.granularity
2203
+ },
2144
2204
  errors: {
2145
- 400: 'Validation failed',
2146
- 401: 'Unauthorized',
2147
- 409: 'Resource conflict - another process is updating this rule'
2205
+ 401: 'User not authenticated'
2148
2206
  }
2149
2207
  });
2150
2208
  }
2151
2209
 
2152
2210
  /**
2153
- * Get all transaction rules for user
2211
+ * Get cash-flow trends
2212
+ *
2213
+ * Monthly income / expense / netSavings over a fixed N-month window
2214
+ * (current month + N−1 prior). Missing months are zero-filled (flow metric).
2215
+ *
2216
+ * **Parameters:**
2217
+ * - `period`: 1m | 3m | 6m | 1y (default 6m)
2218
+ * - `granularity`: accepted for API symmetry; v1 returns month buckets
2219
+ *
2154
2220
  * @param data The data for the request.
2155
2221
  * @param data.region Region code for tenant context
2156
- * @param data.limit Max results per page (default: 20, max: 100)
2157
- * @param data.offset Pagination offset (default: 0)
2158
- * @param data.enabled Filter by enabled status
2159
- * @param data.learningSource Filter by learning source. Omit this parameter or pass empty string to get manually created rules (learningSource is null in database).
2160
- * @param data.autoApplyEnabled Filter by auto-apply status
2161
- * @returns TransactionRuleListResponseDto List of rules
2222
+ * @param data.period Time period
2223
+ * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
2224
+ * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
2162
2225
  * @throws ApiError
2163
2226
  */
2164
- public static transactionRuleControllerList(
2165
- data: TransactionRuleControllerListData
2166
- ): CancelablePromise<TransactionRuleControllerListResponse> {
2227
+ public static reportingControllerGetCashFlowTrends(
2228
+ data: ReportingControllerGetCashFlowTrendsData
2229
+ ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
2167
2230
  return __request(OpenAPI, {
2168
2231
  method: 'GET',
2169
- url: '/api/v1/{region}/bean/transaction-rules',
2232
+ url: '/api/v1/{region}/reporting/cash-flow/trends',
2170
2233
  path: {
2171
2234
  region: data.region
2172
2235
  },
2173
2236
  query: {
2174
- limit: data.limit,
2175
- offset: data.offset,
2176
- enabled: data.enabled,
2177
- learningSource: data.learningSource,
2178
- autoApplyEnabled: data.autoApplyEnabled
2237
+ period: data.period,
2238
+ granularity: data.granularity
2179
2239
  },
2180
2240
  errors: {
2181
- 401: 'Unauthorized'
2241
+ 401: 'User not authenticated'
2182
2242
  }
2183
2243
  });
2184
2244
  }
2185
2245
 
2186
2246
  /**
2187
- * Validate transaction rule configuration
2247
+ * Generate portfolio snapshot
2248
+ *
2249
+ * Manually generate a portfolio snapshot for a specific date.
2250
+ *
2251
+ * **Multi-currency Support:**
2252
+ * - Fetches balances grouped by currency
2253
+ * - Uses user's baseCurrency setting for conversion
2254
+ * - Stores exchange rates and warnings
2255
+ *
2256
+ * **Use Cases:**
2257
+ * - Testing snapshot generation
2258
+ * - Force regeneration after data correction
2259
+ * - Initial setup for new users
2260
+ *
2188
2261
  * @param data The data for the request.
2189
2262
  * @param data.region Region code for tenant context
2190
- * @param data.requestBody
2191
- * @returns ValidateRuleResponseDto Validation result
2263
+ * @param data.requestBody Optional date (defaults to today)
2264
+ * @returns GenerateSnapshotResponse Snapshot generated successfully
2192
2265
  * @throws ApiError
2193
2266
  */
2194
- public static transactionRuleControllerValidate(
2195
- data: TransactionRuleControllerValidateData
2196
- ): CancelablePromise<TransactionRuleControllerValidateResponse> {
2267
+ public static reportingControllerGenerateSnapshot(
2268
+ data: ReportingControllerGenerateSnapshotData
2269
+ ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
2197
2270
  return __request(OpenAPI, {
2198
2271
  method: 'POST',
2199
- url: '/api/v1/{region}/bean/transaction-rules/validate',
2272
+ url: '/api/v1/{region}/reporting/snapshots/generate',
2200
2273
  path: {
2201
2274
  region: data.region
2202
2275
  },
2203
2276
  body: data.requestBody,
2204
2277
  mediaType: 'application/json',
2205
2278
  errors: {
2206
- 400: 'Validation failed',
2207
- 401: 'Unauthorized'
2279
+ 400: 'Invalid date format',
2280
+ 401: 'User not authenticated'
2208
2281
  }
2209
2282
  });
2210
2283
  }
2211
2284
 
2212
2285
  /**
2213
- * Bulk create transaction rules
2286
+ * Backfill portfolio snapshots
2287
+ *
2288
+ * Generate snapshots for a date range (historical data backfill).
2289
+ *
2290
+ * **Multi-currency Support:**
2291
+ * - Each snapshot includes multi-currency data
2292
+ * - Uses exchange rates available at generation time
2293
+ * - Warnings stored for missing exchange rates
2294
+ *
2295
+ * **Best Practices:**
2296
+ * - Use for initial setup after account configuration
2297
+ * - Run during low-traffic periods for large date ranges
2298
+ * - Existing snapshots are skipped (not regenerated)
2299
+ *
2214
2300
  * @param data The data for the request.
2215
2301
  * @param data.region Region code for tenant context
2216
2302
  * @param data.requestBody
2217
- * @returns BulkCreateRulesResponseDto Bulk create completed
2303
+ * @returns BackfillSnapshotsResponse Backfill completed successfully
2218
2304
  * @throws ApiError
2219
2305
  */
2220
- public static transactionRuleControllerBulkCreate(
2221
- data: TransactionRuleControllerBulkCreateData
2222
- ): CancelablePromise<TransactionRuleControllerBulkCreateResponse> {
2306
+ public static reportingControllerBackfillSnapshots(
2307
+ data: ReportingControllerBackfillSnapshotsData
2308
+ ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
2223
2309
  return __request(OpenAPI, {
2224
2310
  method: 'POST',
2225
- url: '/api/v1/{region}/bean/transaction-rules/bulk',
2311
+ url: '/api/v1/{region}/reporting/snapshots/backfill',
2226
2312
  path: {
2227
2313
  region: data.region
2228
2314
  },
2229
2315
  body: data.requestBody,
2230
2316
  mediaType: 'application/json',
2231
2317
  errors: {
2232
- 400: 'Invalid bulk create data',
2233
- 401: 'Unauthorized'
2318
+ 400: 'Invalid date format or range',
2319
+ 401: 'User not authenticated',
2320
+ 409: 'Backfill already in progress for this user'
2234
2321
  }
2235
2322
  });
2236
2323
  }
2324
+ }
2237
2325
 
2326
+ export class UsersService {
2238
2327
  /**
2239
- * Export transaction rules
2328
+ * Delete own user account
2240
2329
  * @param data The data for the request.
2241
- * @param data.format Export format (currently only JSON supported)
2242
- * @param data.region Region code for tenant context
2243
- * @returns ExportRulesResponseDto Exported rules
2330
+ * @param data.requestBody
2331
+ * @returns void User deleted successfully
2244
2332
  * @throws ApiError
2245
2333
  */
2246
- public static transactionRuleControllerExport(
2247
- data: TransactionRuleControllerExportData
2248
- ): CancelablePromise<TransactionRuleControllerExportResponse> {
2249
- return __request(OpenAPI, {
2250
- method: 'GET',
2251
- url: '/api/v1/{region}/bean/transaction-rules/export/{format}',
2252
- path: {
2253
- format: data.format,
2254
- region: data.region
2255
- },
2256
- errors: {
2257
- 400: 'Unsupported format',
2258
- 401: 'Unauthorized'
2259
- }
2260
- });
2261
- }
2262
-
2263
- /**
2264
- * Get transaction rule statistics
2265
- * @param data The data for the request.
2266
- * @param data.period Statistics time period
2267
- * @param data.region Region code for tenant context
2268
- * @returns RuleStatisticsResponseDto Rule statistics
2269
- * @throws ApiError
2270
- */
2271
- public static transactionRuleControllerGetStatistics(
2272
- data: TransactionRuleControllerGetStatisticsData
2273
- ): CancelablePromise<TransactionRuleControllerGetStatisticsResponse> {
2274
- return __request(OpenAPI, {
2275
- method: 'GET',
2276
- url: '/api/v1/{region}/bean/transaction-rules/statistics/{period}',
2277
- path: {
2278
- period: data.period,
2279
- region: data.region
2280
- },
2281
- errors: {
2282
- 401: 'Unauthorized'
2283
- }
2284
- });
2285
- }
2286
-
2287
- /**
2288
- * Get transaction rule detail
2289
- * @param data The data for the request.
2290
- * @param data.ruleId Rule ID
2291
- * @param data.region Region code for tenant context
2292
- * @returns TransactionRuleResponseDto Rule details
2293
- * @throws ApiError
2294
- */
2295
- public static transactionRuleControllerGetDetail(
2296
- data: TransactionRuleControllerGetDetailData
2297
- ): CancelablePromise<TransactionRuleControllerGetDetailResponse> {
2298
- return __request(OpenAPI, {
2299
- method: 'GET',
2300
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2301
- path: {
2302
- ruleId: data.ruleId,
2303
- region: data.region
2304
- },
2305
- errors: {
2306
- 401: 'Unauthorized',
2307
- 403: 'Forbidden - not owner of rule',
2308
- 404: 'Rule not found'
2309
- }
2310
- });
2311
- }
2312
-
2313
- /**
2314
- * Update a transaction rule
2315
- * @param data The data for the request.
2316
- * @param data.ruleId Rule ID to update
2317
- * @param data.region Region code for tenant context
2318
- * @param data.requestBody
2319
- * @returns TransactionRuleResponseDto Rule updated successfully
2320
- * @throws ApiError
2321
- */
2322
- public static transactionRuleControllerUpdate(
2323
- data: TransactionRuleControllerUpdateData
2324
- ): CancelablePromise<TransactionRuleControllerUpdateResponse> {
2325
- return __request(OpenAPI, {
2326
- method: 'PUT',
2327
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2328
- path: {
2329
- ruleId: data.ruleId,
2330
- region: data.region
2331
- },
2332
- body: data.requestBody,
2333
- mediaType: 'application/json',
2334
- errors: {
2335
- 400: 'Validation failed',
2336
- 401: 'Unauthorized',
2337
- 403: 'Forbidden - not owner of rule',
2338
- 404: 'Rule not found',
2339
- 409: 'Resource conflict - rule is being modified by another process'
2340
- }
2341
- });
2342
- }
2343
-
2344
- /**
2345
- * Delete a transaction rule
2346
- * @param data The data for the request.
2347
- * @param data.ruleId Rule ID to delete
2348
- * @param data.region Region code for tenant context
2349
- * @returns void Rule deleted successfully
2350
- * @throws ApiError
2351
- */
2352
- public static transactionRuleControllerDelete(
2353
- data: TransactionRuleControllerDeleteData
2354
- ): CancelablePromise<TransactionRuleControllerDeleteResponse> {
2355
- return __request(OpenAPI, {
2356
- method: 'DELETE',
2357
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2358
- path: {
2359
- ruleId: data.ruleId,
2360
- region: data.region
2361
- },
2362
- errors: {
2363
- 401: 'Unauthorized',
2364
- 403: 'Forbidden - not owner of rule',
2365
- 404: 'Rule not found',
2366
- 409: 'Resource conflict - rule is being modified by another process'
2367
- }
2368
- });
2369
- }
2370
-
2371
- /**
2372
- * Test rule matching
2373
- * @param data The data for the request.
2374
- * @param data.ruleId Rule ID to test
2375
- * @param data.region Region code for tenant context
2376
- * @param data.requestBody
2377
- * @returns TestRuleResponseDto Test result
2378
- * @throws ApiError
2379
- */
2380
- public static transactionRuleControllerTest(
2381
- data: TransactionRuleControllerTestData
2382
- ): CancelablePromise<TransactionRuleControllerTestResponse> {
2383
- return __request(OpenAPI, {
2384
- method: 'POST',
2385
- url: '/api/v1/{region}/bean/transaction-rules/{ruleId}/test',
2386
- path: {
2387
- ruleId: data.ruleId,
2388
- region: data.region
2389
- },
2390
- body: data.requestBody,
2391
- mediaType: 'application/json',
2392
- errors: {
2393
- 401: 'Unauthorized',
2394
- 403: 'Forbidden - not owner of rule',
2395
- 404: 'Rule not found'
2396
- }
2397
- });
2398
- }
2399
- }
2400
-
2401
- export class UsersService {
2402
- /**
2403
- * Delete own user account
2404
- * @param data The data for the request.
2405
- * @param data.requestBody
2406
- * @returns void User deleted successfully
2407
- * @throws ApiError
2408
- */
2409
- public static userControllerDeleteOwnUser(
2410
- data: UserControllerDeleteOwnUserData
2411
- ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
2334
+ public static userControllerDeleteOwnUser(
2335
+ data: UserControllerDeleteOwnUserData
2336
+ ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
2412
2337
  return __request(OpenAPI, {
2413
2338
  method: 'DELETE',
2414
2339
  url: '/api/v1/users',
@@ -2444,7 +2369,7 @@ export class UsersService {
2444
2369
  * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
2445
2370
  * @param data The data for the request.
2446
2371
  * @param data.requestBody
2447
- * @returns unknown User created successfully
2372
+ * @returns SignupResponseDto User created successfully
2448
2373
  * @throws ApiError
2449
2374
  */
2450
2375
  public static userControllerSignupUser(
@@ -2653,105 +2578,383 @@ export class PropertiesService {
2653
2578
  }
2654
2579
  }
2655
2580
 
2656
- export class LifeEventsService {
2581
+ export class BeanTransactionRulesService {
2657
2582
  /**
2658
- * Create a new life event
2659
- * Creates a new life event entry for the authenticated user. Returns ETag header carrying the row updatedAt.
2583
+ * Create a new transaction rule (or upsert if upsertByPayee=true)
2584
+ * Creates a new rule. If upsertByPayee=true, updates existing rule matching payeeKeywords[0] instead of creating duplicate.
2660
2585
  * @param data The data for the request.
2661
- * @param data.region Region code for tenant context (decorative for life events)
2586
+ * @param data.region Region code for tenant context
2662
2587
  * @param data.requestBody
2663
- * @returns EventResponseDto Life event created successfully
2588
+ * @returns TransactionRuleResponseDto Rule updated successfully (upsert mode)
2664
2589
  * @throws ApiError
2665
2590
  */
2666
- public static eventControllerCreate(
2667
- data: EventControllerCreateData
2668
- ): CancelablePromise<EventControllerCreateResponse> {
2591
+ public static transactionRuleControllerCreate(
2592
+ data: TransactionRuleControllerCreateData
2593
+ ): CancelablePromise<TransactionRuleControllerCreateResponse> {
2669
2594
  return __request(OpenAPI, {
2670
2595
  method: 'POST',
2671
- url: '/api/v1/{region}/bean/events',
2596
+ url: '/api/v1/{region}/bean/transaction-rules',
2672
2597
  path: {
2673
2598
  region: data.region
2674
2599
  },
2675
2600
  body: data.requestBody,
2676
2601
  mediaType: 'application/json',
2677
2602
  errors: {
2678
- 409: 'Life event already exists for this (userId, type, date) combination'
2603
+ 400: 'Validation failed',
2604
+ 401: 'Unauthorized',
2605
+ 409: 'Resource conflict - another process is updating this rule'
2679
2606
  }
2680
2607
  });
2681
2608
  }
2682
2609
 
2683
2610
  /**
2684
- * List user life events
2685
- * Returns life events for the authenticated user with optional filtering by type, description search, and date range.
2611
+ * Get all transaction rules for user
2686
2612
  * @param data The data for the request.
2687
- * @param data.region Region code for tenant context (decorative for life events)
2688
- * @param data.type Filter by life event type (exact match)
2689
- * @param data.q Search term for description (case-insensitive partial match)
2690
- * @param data.from Filter life events from this date (ISO 8601 format)
2691
- * @param data.to Filter life events to this date (ISO 8601 format)
2692
- * @param data.page Page number for pagination (default: 1)
2693
- * @param data.limit Number of items per page (default: 20, max: 100)
2694
- * @returns EventListResponseDto Life events retrieved successfully
2613
+ * @param data.region Region code for tenant context
2614
+ * @param data.limit Max results per page (default: 20, max: 100)
2615
+ * @param data.offset Pagination offset (default: 0)
2616
+ * @param data.enabled Filter by enabled status
2617
+ * @param data.learningSource Filter by learning source. Omit this parameter or pass empty string to get manually created rules (learningSource is null in database).
2618
+ * @param data.autoApplyEnabled Filter by auto-apply status
2619
+ * @returns TransactionRuleListResponseDto List of rules
2695
2620
  * @throws ApiError
2696
2621
  */
2697
- public static eventControllerFindAll(
2698
- data: EventControllerFindAllData
2699
- ): CancelablePromise<EventControllerFindAllResponse> {
2622
+ public static transactionRuleControllerList(
2623
+ data: TransactionRuleControllerListData
2624
+ ): CancelablePromise<TransactionRuleControllerListResponse> {
2700
2625
  return __request(OpenAPI, {
2701
2626
  method: 'GET',
2702
- url: '/api/v1/{region}/bean/events',
2627
+ url: '/api/v1/{region}/bean/transaction-rules',
2703
2628
  path: {
2704
2629
  region: data.region
2705
2630
  },
2706
2631
  query: {
2707
- type: data.type,
2708
- q: data.q,
2709
- from: data.from,
2710
- to: data.to,
2711
- page: data.page,
2712
- limit: data.limit
2632
+ limit: data.limit,
2633
+ offset: data.offset,
2634
+ enabled: data.enabled,
2635
+ learningSource: data.learningSource,
2636
+ autoApplyEnabled: data.autoApplyEnabled
2637
+ },
2638
+ errors: {
2639
+ 401: 'Unauthorized'
2713
2640
  }
2714
2641
  });
2715
2642
  }
2716
2643
 
2717
2644
  /**
2718
- * Get life event by ID
2719
- * Returns a single life event by its ID. Returns ETag header.
2645
+ * Validate transaction rule configuration
2720
2646
  * @param data The data for the request.
2721
- * @param data.id Life event ID
2722
- * @param data.region Region code for tenant context (decorative for life events)
2723
- * @returns EventResponseDto Life event retrieved successfully
2647
+ * @param data.region Region code for tenant context
2648
+ * @param data.requestBody
2649
+ * @returns ValidateRuleResponseDto Validation result
2724
2650
  * @throws ApiError
2725
2651
  */
2726
- public static eventControllerFindOne(
2727
- data: EventControllerFindOneData
2728
- ): CancelablePromise<EventControllerFindOneResponse> {
2652
+ public static transactionRuleControllerValidate(
2653
+ data: TransactionRuleControllerValidateData
2654
+ ): CancelablePromise<TransactionRuleControllerValidateResponse> {
2729
2655
  return __request(OpenAPI, {
2730
- method: 'GET',
2731
- url: '/api/v1/{region}/bean/events/{id}',
2656
+ method: 'POST',
2657
+ url: '/api/v1/{region}/bean/transaction-rules/validate',
2732
2658
  path: {
2733
- id: data.id,
2734
2659
  region: data.region
2735
2660
  },
2661
+ body: data.requestBody,
2662
+ mediaType: 'application/json',
2736
2663
  errors: {
2737
- 404: 'Life event not found'
2664
+ 400: 'Validation failed',
2665
+ 401: 'Unauthorized'
2738
2666
  }
2739
2667
  });
2740
2668
  }
2741
2669
 
2742
2670
  /**
2743
- * Update a life event
2744
- * Updates an existing life event. If If-Match header is provided, performs optimistic concurrency check; mismatched updatedAt returns 412.
2671
+ * Bulk create transaction rules
2745
2672
  * @param data The data for the request.
2746
- * @param data.id Life event ID
2747
- * @param data.region Region code for tenant context (decorative for life events)
2673
+ * @param data.region Region code for tenant context
2748
2674
  * @param data.requestBody
2749
- * @returns EventResponseDto Life event updated successfully
2675
+ * @returns BulkCreateRulesResponseDto Bulk create completed
2750
2676
  * @throws ApiError
2751
2677
  */
2752
- public static eventControllerUpdate(
2753
- data: EventControllerUpdateData
2754
- ): CancelablePromise<EventControllerUpdateResponse> {
2678
+ public static transactionRuleControllerBulkCreate(
2679
+ data: TransactionRuleControllerBulkCreateData
2680
+ ): CancelablePromise<TransactionRuleControllerBulkCreateResponse> {
2681
+ return __request(OpenAPI, {
2682
+ method: 'POST',
2683
+ url: '/api/v1/{region}/bean/transaction-rules/bulk',
2684
+ path: {
2685
+ region: data.region
2686
+ },
2687
+ body: data.requestBody,
2688
+ mediaType: 'application/json',
2689
+ errors: {
2690
+ 400: 'Invalid bulk create data',
2691
+ 401: 'Unauthorized'
2692
+ }
2693
+ });
2694
+ }
2695
+
2696
+ /**
2697
+ * Export transaction rules
2698
+ * @param data The data for the request.
2699
+ * @param data.format Export format (currently only JSON supported)
2700
+ * @param data.region Region code for tenant context
2701
+ * @returns ExportRulesResponseDto Exported rules
2702
+ * @throws ApiError
2703
+ */
2704
+ public static transactionRuleControllerExport(
2705
+ data: TransactionRuleControllerExportData
2706
+ ): CancelablePromise<TransactionRuleControllerExportResponse> {
2707
+ return __request(OpenAPI, {
2708
+ method: 'GET',
2709
+ url: '/api/v1/{region}/bean/transaction-rules/export/{format}',
2710
+ path: {
2711
+ format: data.format,
2712
+ region: data.region
2713
+ },
2714
+ errors: {
2715
+ 400: 'Unsupported format',
2716
+ 401: 'Unauthorized'
2717
+ }
2718
+ });
2719
+ }
2720
+
2721
+ /**
2722
+ * Get transaction rule statistics
2723
+ * @param data The data for the request.
2724
+ * @param data.period Statistics time period
2725
+ * @param data.region Region code for tenant context
2726
+ * @returns RuleStatisticsResponseDto Rule statistics
2727
+ * @throws ApiError
2728
+ */
2729
+ public static transactionRuleControllerGetStatistics(
2730
+ data: TransactionRuleControllerGetStatisticsData
2731
+ ): CancelablePromise<TransactionRuleControllerGetStatisticsResponse> {
2732
+ return __request(OpenAPI, {
2733
+ method: 'GET',
2734
+ url: '/api/v1/{region}/bean/transaction-rules/statistics/{period}',
2735
+ path: {
2736
+ period: data.period,
2737
+ region: data.region
2738
+ },
2739
+ errors: {
2740
+ 401: 'Unauthorized'
2741
+ }
2742
+ });
2743
+ }
2744
+
2745
+ /**
2746
+ * Get transaction rule detail
2747
+ * @param data The data for the request.
2748
+ * @param data.ruleId Rule ID
2749
+ * @param data.region Region code for tenant context
2750
+ * @returns TransactionRuleResponseDto Rule details
2751
+ * @throws ApiError
2752
+ */
2753
+ public static transactionRuleControllerGetDetail(
2754
+ data: TransactionRuleControllerGetDetailData
2755
+ ): CancelablePromise<TransactionRuleControllerGetDetailResponse> {
2756
+ return __request(OpenAPI, {
2757
+ method: 'GET',
2758
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2759
+ path: {
2760
+ ruleId: data.ruleId,
2761
+ region: data.region
2762
+ },
2763
+ errors: {
2764
+ 401: 'Unauthorized',
2765
+ 403: 'Forbidden - not owner of rule',
2766
+ 404: 'Rule not found'
2767
+ }
2768
+ });
2769
+ }
2770
+
2771
+ /**
2772
+ * Update a transaction rule
2773
+ * @param data The data for the request.
2774
+ * @param data.ruleId Rule ID to update
2775
+ * @param data.region Region code for tenant context
2776
+ * @param data.requestBody
2777
+ * @returns TransactionRuleResponseDto Rule updated successfully
2778
+ * @throws ApiError
2779
+ */
2780
+ public static transactionRuleControllerUpdate(
2781
+ data: TransactionRuleControllerUpdateData
2782
+ ): CancelablePromise<TransactionRuleControllerUpdateResponse> {
2783
+ return __request(OpenAPI, {
2784
+ method: 'PUT',
2785
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2786
+ path: {
2787
+ ruleId: data.ruleId,
2788
+ region: data.region
2789
+ },
2790
+ body: data.requestBody,
2791
+ mediaType: 'application/json',
2792
+ errors: {
2793
+ 400: 'Validation failed',
2794
+ 401: 'Unauthorized',
2795
+ 403: 'Forbidden - not owner of rule',
2796
+ 404: 'Rule not found',
2797
+ 409: 'Resource conflict - rule is being modified by another process'
2798
+ }
2799
+ });
2800
+ }
2801
+
2802
+ /**
2803
+ * Delete a transaction rule
2804
+ * @param data The data for the request.
2805
+ * @param data.ruleId Rule ID to delete
2806
+ * @param data.region Region code for tenant context
2807
+ * @returns void Rule deleted successfully
2808
+ * @throws ApiError
2809
+ */
2810
+ public static transactionRuleControllerDelete(
2811
+ data: TransactionRuleControllerDeleteData
2812
+ ): CancelablePromise<TransactionRuleControllerDeleteResponse> {
2813
+ return __request(OpenAPI, {
2814
+ method: 'DELETE',
2815
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}',
2816
+ path: {
2817
+ ruleId: data.ruleId,
2818
+ region: data.region
2819
+ },
2820
+ errors: {
2821
+ 401: 'Unauthorized',
2822
+ 403: 'Forbidden - not owner of rule',
2823
+ 404: 'Rule not found',
2824
+ 409: 'Resource conflict - rule is being modified by another process'
2825
+ }
2826
+ });
2827
+ }
2828
+
2829
+ /**
2830
+ * Test rule matching
2831
+ * @param data The data for the request.
2832
+ * @param data.ruleId Rule ID to test
2833
+ * @param data.region Region code for tenant context
2834
+ * @param data.requestBody
2835
+ * @returns TestRuleResponseDto Test result
2836
+ * @throws ApiError
2837
+ */
2838
+ public static transactionRuleControllerTest(
2839
+ data: TransactionRuleControllerTestData
2840
+ ): CancelablePromise<TransactionRuleControllerTestResponse> {
2841
+ return __request(OpenAPI, {
2842
+ method: 'POST',
2843
+ url: '/api/v1/{region}/bean/transaction-rules/{ruleId}/test',
2844
+ path: {
2845
+ ruleId: data.ruleId,
2846
+ region: data.region
2847
+ },
2848
+ body: data.requestBody,
2849
+ mediaType: 'application/json',
2850
+ errors: {
2851
+ 401: 'Unauthorized',
2852
+ 403: 'Forbidden - not owner of rule',
2853
+ 404: 'Rule not found'
2854
+ }
2855
+ });
2856
+ }
2857
+ }
2858
+
2859
+ export class LifeEventsService {
2860
+ /**
2861
+ * Create a new life event
2862
+ * Creates a new life event entry for the authenticated user. Returns ETag header carrying the row updatedAt.
2863
+ * @param data The data for the request.
2864
+ * @param data.region Region code for tenant context (decorative for life events)
2865
+ * @param data.requestBody
2866
+ * @returns EventResponseDto Life event created successfully
2867
+ * @throws ApiError
2868
+ */
2869
+ public static eventControllerCreate(
2870
+ data: EventControllerCreateData
2871
+ ): CancelablePromise<EventControllerCreateResponse> {
2872
+ return __request(OpenAPI, {
2873
+ method: 'POST',
2874
+ url: '/api/v1/{region}/bean/events',
2875
+ path: {
2876
+ region: data.region
2877
+ },
2878
+ body: data.requestBody,
2879
+ mediaType: 'application/json',
2880
+ errors: {
2881
+ 409: 'Life event already exists for this (userId, type, date) combination'
2882
+ }
2883
+ });
2884
+ }
2885
+
2886
+ /**
2887
+ * List user life events
2888
+ * Returns life events for the authenticated user with optional filtering by type, description search, and date range.
2889
+ * @param data The data for the request.
2890
+ * @param data.region Region code for tenant context (decorative for life events)
2891
+ * @param data.type Filter by life event type (exact match)
2892
+ * @param data.q Search term for description (case-insensitive partial match)
2893
+ * @param data.from Filter life events from this date (ISO 8601 format)
2894
+ * @param data.to Filter life events to this date (ISO 8601 format)
2895
+ * @param data.page Page number for pagination (default: 1)
2896
+ * @param data.limit Number of items per page (default: 20, max: 100)
2897
+ * @returns EventListResponseDto Life events retrieved successfully
2898
+ * @throws ApiError
2899
+ */
2900
+ public static eventControllerFindAll(
2901
+ data: EventControllerFindAllData
2902
+ ): CancelablePromise<EventControllerFindAllResponse> {
2903
+ return __request(OpenAPI, {
2904
+ method: 'GET',
2905
+ url: '/api/v1/{region}/bean/events',
2906
+ path: {
2907
+ region: data.region
2908
+ },
2909
+ query: {
2910
+ type: data.type,
2911
+ q: data.q,
2912
+ from: data.from,
2913
+ to: data.to,
2914
+ page: data.page,
2915
+ limit: data.limit
2916
+ }
2917
+ });
2918
+ }
2919
+
2920
+ /**
2921
+ * Get life event by ID
2922
+ * Returns a single life event by its ID. Returns ETag header.
2923
+ * @param data The data for the request.
2924
+ * @param data.id Life event ID
2925
+ * @param data.region Region code for tenant context (decorative for life events)
2926
+ * @returns EventResponseDto Life event retrieved successfully
2927
+ * @throws ApiError
2928
+ */
2929
+ public static eventControllerFindOne(
2930
+ data: EventControllerFindOneData
2931
+ ): CancelablePromise<EventControllerFindOneResponse> {
2932
+ return __request(OpenAPI, {
2933
+ method: 'GET',
2934
+ url: '/api/v1/{region}/bean/events/{id}',
2935
+ path: {
2936
+ id: data.id,
2937
+ region: data.region
2938
+ },
2939
+ errors: {
2940
+ 404: 'Life event not found'
2941
+ }
2942
+ });
2943
+ }
2944
+
2945
+ /**
2946
+ * Update a life event
2947
+ * Updates an existing life event. If If-Match header is provided, performs optimistic concurrency check; mismatched updatedAt returns 412.
2948
+ * @param data The data for the request.
2949
+ * @param data.id Life event ID
2950
+ * @param data.region Region code for tenant context (decorative for life events)
2951
+ * @param data.requestBody
2952
+ * @returns EventResponseDto Life event updated successfully
2953
+ * @throws ApiError
2954
+ */
2955
+ public static eventControllerUpdate(
2956
+ data: EventControllerUpdateData
2957
+ ): CancelablePromise<EventControllerUpdateResponse> {
2755
2958
  return __request(OpenAPI, {
2756
2959
  method: 'PUT',
2757
2960
  url: '/api/v1/{region}/bean/events/{id}',
@@ -2828,6 +3031,33 @@ export class LifeEventsService {
2828
3031
  }
2829
3032
  }
2830
3033
 
3034
+ export class OnboardingService {
3035
+ /**
3036
+ * Bootstrap core accounts + register asset accounts with opening balances (ADR-0113)
3037
+ * @param data The data for the request.
3038
+ * @param data.region Region code for tenant context
3039
+ * @param data.requestBody
3040
+ * @returns unknown Onboarding bootstrap result.
3041
+ * @throws ApiError
3042
+ */
3043
+ public static onboardingControllerBootstrap(
3044
+ data: OnboardingControllerBootstrapData
3045
+ ): CancelablePromise<OnboardingControllerBootstrapResponse> {
3046
+ return __request(OpenAPI, {
3047
+ method: 'POST',
3048
+ url: '/api/v1/{region}/bean/onboarding',
3049
+ path: {
3050
+ region: data.region
3051
+ },
3052
+ body: data.requestBody,
3053
+ mediaType: 'application/json',
3054
+ errors: {
3055
+ 422: 'Invalid region/account path/duplicate paths.'
3056
+ }
3057
+ });
3058
+ }
3059
+ }
3060
+
2831
3061
  export class BalanceReconciliationService {
2832
3062
  /**
2833
3063
  * Preview reconciliation (book vs actual)
@@ -3027,201 +3257,86 @@ export class BeanImportService {
3027
3257
  mediaType: 'multipart/form-data',
3028
3258
  errors: {
3029
3259
  400: 'Bad request - invalid file or no file uploaded'
3030
- }
3031
- });
3032
- }
3033
-
3034
- /**
3035
- * Get importer configuration
3036
- * Returns the current configuration for the specified importer. Creates default configuration if none exists.
3037
- * @param data The data for the request.
3038
- * @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
3039
- * @param data.region Region code for tenant context
3040
- * @returns ImporterConfigDto Configuration retrieved successfully
3041
- * @throws ApiError
3042
- */
3043
- public static importerConfigControllerGetConfig(
3044
- data: ImporterConfigControllerGetConfigData
3045
- ): CancelablePromise<ImporterConfigControllerGetConfigResponse> {
3046
- return __request(OpenAPI, {
3047
- method: 'GET',
3048
- url: '/api/v1/{region}/bean/import/config/{importerId}',
3049
- path: {
3050
- importerId: data.importerId,
3051
- region: data.region
3052
- },
3053
- errors: {
3054
- 400: 'Invalid input - Unsupported importer',
3055
- 401: 'Unauthorized - Authentication required'
3056
- }
3057
- });
3058
- }
3059
-
3060
- /**
3061
- * Update importer configuration
3062
- * Updates the configuration for the specified importer. Partial updates are supported.
3063
- * @param data The data for the request.
3064
- * @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
3065
- * @param data.region Region code for tenant context
3066
- * @param data.requestBody Partial configuration update. Only provided fields will be updated.
3067
- * @returns ImporterConfigDto Configuration updated successfully
3068
- * @throws ApiError
3069
- */
3070
- public static importerConfigControllerUpdateConfig(
3071
- data: ImporterConfigControllerUpdateConfigData
3072
- ): CancelablePromise<ImporterConfigControllerUpdateConfigResponse> {
3073
- return __request(OpenAPI, {
3074
- method: 'PUT',
3075
- url: '/api/v1/{region}/bean/import/config/{importerId}',
3076
- path: {
3077
- importerId: data.importerId,
3078
- region: data.region
3079
- },
3080
- body: data.requestBody,
3081
- mediaType: 'application/json',
3082
- errors: {
3083
- 400: 'Invalid input - Validation failed',
3084
- 404: 'Configuration not found'
3085
- }
3086
- });
3087
- }
3088
-
3089
- /**
3090
- * Reset configuration to default
3091
- * Resets the configuration for the specified importer to default values. This operation overwrites all existing configuration.
3092
- * @param data The data for the request.
3093
- * @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
3094
- * @param data.region Region code for tenant context
3095
- * @returns ImporterConfigDto Configuration reset successfully
3096
- * @throws ApiError
3097
- */
3098
- public static importerConfigControllerResetConfig(
3099
- data: ImporterConfigControllerResetConfigData
3100
- ): CancelablePromise<ImporterConfigControllerResetConfigResponse> {
3101
- return __request(OpenAPI, {
3102
- method: 'POST',
3103
- url: '/api/v1/{region}/bean/import/config/{importerId}/reset',
3104
- path: {
3105
- importerId: data.importerId,
3106
- region: data.region
3107
- },
3108
- errors: {
3109
- 400: 'Invalid input - Unsupported importer'
3110
- }
3111
- });
3112
- }
3113
- }
3114
-
3115
- export class BeanPlatformsService {
3116
- /**
3117
- * Get all platforms with statistics
3118
- * @returns unknown List of platforms with binding and account counts
3119
- * @throws ApiError
3120
- */
3121
- public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
3122
- return __request(OpenAPI, {
3123
- method: 'GET',
3124
- url: '/api/v1/bean/platforms'
3125
- });
3126
- }
3127
-
3128
- /**
3129
- * Create a new platform
3130
- * @param data The data for the request.
3131
- * @param data.requestBody
3132
- * @returns unknown Platform created successfully
3133
- * @throws ApiError
3134
- */
3135
- public static platformControllerCreate(
3136
- data: PlatformControllerCreateData
3137
- ): CancelablePromise<PlatformControllerCreateResponse> {
3138
- return __request(OpenAPI, {
3139
- method: 'POST',
3140
- url: '/api/v1/bean/platforms',
3141
- body: data.requestBody,
3142
- mediaType: 'application/json',
3143
- errors: {
3144
- 409: 'Platform already exists'
3145
- }
3146
- });
3147
- }
3148
-
3149
- /**
3150
- * Get platform list for current user
3151
- * @returns unknown List of platforms with user binding status
3152
- * @throws ApiError
3153
- */
3154
- public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
3155
- return __request(OpenAPI, {
3156
- method: 'GET',
3157
- url: '/api/v1/bean/platforms/list'
3260
+ }
3158
3261
  });
3159
3262
  }
3160
3263
 
3161
3264
  /**
3162
- * Match platforms by name or alias
3265
+ * Get importer configuration
3266
+ * Returns the current configuration for the specified importer. Creates default configuration if none exists.
3163
3267
  * @param data The data for the request.
3164
- * @param data.q Search query — Chinese name, English name, or abbreviation
3165
- * @param data.region Region code for category override lookup
3166
- * @returns unknown List of matching platforms with suggested segment names
3268
+ * @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
3269
+ * @param data.region Region code for tenant context
3270
+ * @returns ImporterConfigDto Configuration retrieved successfully
3167
3271
  * @throws ApiError
3168
3272
  */
3169
- public static platformControllerMatchPlatforms(
3170
- data: PlatformControllerMatchPlatformsData
3171
- ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3273
+ public static importerConfigControllerGetConfig(
3274
+ data: ImporterConfigControllerGetConfigData
3275
+ ): CancelablePromise<ImporterConfigControllerGetConfigResponse> {
3172
3276
  return __request(OpenAPI, {
3173
3277
  method: 'GET',
3174
- url: '/api/v1/bean/platforms/match',
3175
- query: {
3176
- q: data.q,
3278
+ url: '/api/v1/{region}/bean/import/config/{importerId}',
3279
+ path: {
3280
+ importerId: data.importerId,
3177
3281
  region: data.region
3282
+ },
3283
+ errors: {
3284
+ 400: 'Invalid input - Unsupported importer',
3285
+ 401: 'Unauthorized - Authentication required'
3178
3286
  }
3179
3287
  });
3180
3288
  }
3181
3289
 
3182
3290
  /**
3183
- * Update a platform
3291
+ * Update importer configuration
3292
+ * Updates the configuration for the specified importer. Partial updates are supported.
3184
3293
  * @param data The data for the request.
3185
- * @param data.id Platform ID
3186
- * @param data.requestBody
3187
- * @returns unknown Platform updated successfully
3294
+ * @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
3295
+ * @param data.region Region code for tenant context
3296
+ * @param data.requestBody Partial configuration update. Only provided fields will be updated.
3297
+ * @returns ImporterConfigDto Configuration updated successfully
3188
3298
  * @throws ApiError
3189
3299
  */
3190
- public static platformControllerUpdate(
3191
- data: PlatformControllerUpdateData
3192
- ): CancelablePromise<PlatformControllerUpdateResponse> {
3300
+ public static importerConfigControllerUpdateConfig(
3301
+ data: ImporterConfigControllerUpdateConfigData
3302
+ ): CancelablePromise<ImporterConfigControllerUpdateConfigResponse> {
3193
3303
  return __request(OpenAPI, {
3194
3304
  method: 'PUT',
3195
- url: '/api/v1/bean/platforms/{id}',
3305
+ url: '/api/v1/{region}/bean/import/config/{importerId}',
3196
3306
  path: {
3197
- id: data.id
3307
+ importerId: data.importerId,
3308
+ region: data.region
3198
3309
  },
3199
3310
  body: data.requestBody,
3200
3311
  mediaType: 'application/json',
3201
3312
  errors: {
3202
- 404: 'Platform not found'
3313
+ 400: 'Invalid input - Validation failed',
3314
+ 404: 'Configuration not found'
3203
3315
  }
3204
3316
  });
3205
3317
  }
3206
3318
 
3207
3319
  /**
3208
- * Delete a platform
3320
+ * Reset configuration to default
3321
+ * Resets the configuration for the specified importer to default values. This operation overwrites all existing configuration.
3209
3322
  * @param data The data for the request.
3210
- * @param data.id Platform ID
3211
- * @returns void Platform deleted successfully
3323
+ * @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
3324
+ * @param data.region Region code for tenant context
3325
+ * @returns ImporterConfigDto Configuration reset successfully
3212
3326
  * @throws ApiError
3213
3327
  */
3214
- public static platformControllerDelete(
3215
- data: PlatformControllerDeleteData
3216
- ): CancelablePromise<PlatformControllerDeleteResponse> {
3328
+ public static importerConfigControllerResetConfig(
3329
+ data: ImporterConfigControllerResetConfigData
3330
+ ): CancelablePromise<ImporterConfigControllerResetConfigResponse> {
3217
3331
  return __request(OpenAPI, {
3218
- method: 'DELETE',
3219
- url: '/api/v1/bean/platforms/{id}',
3332
+ method: 'POST',
3333
+ url: '/api/v1/{region}/bean/import/config/{importerId}/reset',
3220
3334
  path: {
3221
- id: data.id
3335
+ importerId: data.importerId,
3336
+ region: data.region
3222
3337
  },
3223
3338
  errors: {
3224
- 404: 'Platform not found'
3339
+ 400: 'Invalid input - Unsupported importer'
3225
3340
  }
3226
3341
  });
3227
3342
  }
@@ -3327,6 +3442,101 @@ export class ProviderSyncService {
3327
3442
  }
3328
3443
  }
3329
3444
 
3445
+ export class ExternalAccountLinksService {
3446
+ /**
3447
+ * Create an external account → BeanAccount mapping (ADR-0113)
3448
+ * @param data The data for the request.
3449
+ * @param data.region Region code for tenant context
3450
+ * @param data.requestBody
3451
+ * @returns ExternalAccountLinkResponseDto Link created.
3452
+ * @throws ApiError
3453
+ */
3454
+ public static externalAccountLinkControllerCreate(
3455
+ data: ExternalAccountLinkControllerCreateData
3456
+ ): CancelablePromise<ExternalAccountLinkControllerCreateResponse> {
3457
+ return __request(OpenAPI, {
3458
+ method: 'POST',
3459
+ url: '/api/v1/{region}/bean/external-account-links',
3460
+ path: {
3461
+ region: data.region
3462
+ },
3463
+ body: data.requestBody,
3464
+ mediaType: 'application/json',
3465
+ errors: {
3466
+ 422: 'beanAccountId not owned, or an active link already exists.'
3467
+ }
3468
+ });
3469
+ }
3470
+
3471
+ /**
3472
+ * List the user's active external account links
3473
+ * @param data The data for the request.
3474
+ * @param data.provider
3475
+ * @param data.region Region code for tenant context
3476
+ * @returns ExternalAccountLinkListResponseDto Links retrieved.
3477
+ * @throws ApiError
3478
+ */
3479
+ public static externalAccountLinkControllerFindAll(
3480
+ data: ExternalAccountLinkControllerFindAllData
3481
+ ): CancelablePromise<ExternalAccountLinkControllerFindAllResponse> {
3482
+ return __request(OpenAPI, {
3483
+ method: 'GET',
3484
+ url: '/api/v1/{region}/bean/external-account-links',
3485
+ path: {
3486
+ region: data.region
3487
+ },
3488
+ query: {
3489
+ provider: data.provider
3490
+ }
3491
+ });
3492
+ }
3493
+
3494
+ /**
3495
+ * Get a single external account link
3496
+ * @param data The data for the request.
3497
+ * @param data.id
3498
+ * @param data.region Region code for tenant context
3499
+ * @returns ExternalAccountLinkResponseDto Link retrieved.
3500
+ * @throws ApiError
3501
+ */
3502
+ public static externalAccountLinkControllerFindOne(
3503
+ data: ExternalAccountLinkControllerFindOneData
3504
+ ): CancelablePromise<ExternalAccountLinkControllerFindOneResponse> {
3505
+ return __request(OpenAPI, {
3506
+ method: 'GET',
3507
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3508
+ path: {
3509
+ id: data.id,
3510
+ region: data.region
3511
+ },
3512
+ errors: {
3513
+ 422: 'Link not found or not owned by the user.'
3514
+ }
3515
+ });
3516
+ }
3517
+
3518
+ /**
3519
+ * Soft-delete (disconnect) an external account link
3520
+ * @param data The data for the request.
3521
+ * @param data.id
3522
+ * @param data.region Region code for tenant context
3523
+ * @returns void Link soft-deleted; historical transactions are unaffected.
3524
+ * @throws ApiError
3525
+ */
3526
+ public static externalAccountLinkControllerRemove(
3527
+ data: ExternalAccountLinkControllerRemoveData
3528
+ ): CancelablePromise<ExternalAccountLinkControllerRemoveResponse> {
3529
+ return __request(OpenAPI, {
3530
+ method: 'DELETE',
3531
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3532
+ path: {
3533
+ id: data.id,
3534
+ region: data.region
3535
+ }
3536
+ });
3537
+ }
3538
+ }
3539
+
3330
3540
  export class ImportTelemetryService {
3331
3541
  /**
3332
3542
  * Receive anonymous parser failure telemetry
@@ -3416,70 +3626,192 @@ export class BeanNlpService {
3416
3626
  data: NlpControllerProcessNaturalLanguageData
3417
3627
  ): CancelablePromise<NlpControllerProcessNaturalLanguageResponse> {
3418
3628
  return __request(OpenAPI, {
3419
- method: 'POST',
3420
- url: '/api/v1/{region}/bean/nlp/process',
3421
- path: {
3629
+ method: 'POST',
3630
+ url: '/api/v1/{region}/bean/nlp/process',
3631
+ path: {
3632
+ region: data.region
3633
+ },
3634
+ body: data.requestBody,
3635
+ mediaType: 'application/json',
3636
+ errors: {
3637
+ 400: 'Invalid input',
3638
+ 401: 'Unauthorized'
3639
+ }
3640
+ });
3641
+ }
3642
+
3643
+ /**
3644
+ * Clear dialogue session
3645
+ * Clear the current NLP dialogue session. Use this to cancel an ongoing multi-turn dialogue.
3646
+ * @param data The data for the request.
3647
+ * @param data.region Region code for tenant context
3648
+ * @param data.sessionId Specific session ID to clear (defaults to user session)
3649
+ * @returns void Session cleared successfully
3650
+ * @throws ApiError
3651
+ */
3652
+ public static nlpControllerClearSession(
3653
+ data: NlpControllerClearSessionData
3654
+ ): CancelablePromise<NlpControllerClearSessionResponse> {
3655
+ return __request(OpenAPI, {
3656
+ method: 'DELETE',
3657
+ url: '/api/v1/{region}/bean/nlp/session',
3658
+ path: {
3659
+ region: data.region
3660
+ },
3661
+ query: {
3662
+ sessionId: data.sessionId
3663
+ },
3664
+ errors: {
3665
+ 401: 'Unauthorized'
3666
+ }
3667
+ });
3668
+ }
3669
+
3670
+ /**
3671
+ * Get current session state
3672
+ * Get the current NLP dialogue session state. Useful for debugging and displaying session context in UI.
3673
+ * @param data The data for the request.
3674
+ * @param data.region Region code for tenant context
3675
+ * @param data.sessionId Specific session ID to get (defaults to user session)
3676
+ * @returns unknown Current session state (or null if no active session)
3677
+ * @throws ApiError
3678
+ */
3679
+ public static nlpControllerGetSession(
3680
+ data: NlpControllerGetSessionData
3681
+ ): CancelablePromise<NlpControllerGetSessionResponse> {
3682
+ return __request(OpenAPI, {
3683
+ method: 'GET',
3684
+ url: '/api/v1/{region}/bean/nlp/session',
3685
+ path: {
3686
+ region: data.region
3687
+ },
3688
+ query: {
3689
+ sessionId: data.sessionId
3690
+ },
3691
+ errors: {
3692
+ 401: 'Unauthorized'
3693
+ }
3694
+ });
3695
+ }
3696
+ }
3697
+
3698
+ export class BeanPlatformsService {
3699
+ /**
3700
+ * Get all platforms with statistics
3701
+ * @returns unknown List of platforms with binding and account counts
3702
+ * @throws ApiError
3703
+ */
3704
+ public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
3705
+ return __request(OpenAPI, {
3706
+ method: 'GET',
3707
+ url: '/api/v1/bean/platforms'
3708
+ });
3709
+ }
3710
+
3711
+ /**
3712
+ * Create a new platform
3713
+ * @param data The data for the request.
3714
+ * @param data.requestBody
3715
+ * @returns unknown Platform created successfully
3716
+ * @throws ApiError
3717
+ */
3718
+ public static platformControllerCreate(
3719
+ data: PlatformControllerCreateData
3720
+ ): CancelablePromise<PlatformControllerCreateResponse> {
3721
+ return __request(OpenAPI, {
3722
+ method: 'POST',
3723
+ url: '/api/v1/bean/platforms',
3724
+ body: data.requestBody,
3725
+ mediaType: 'application/json',
3726
+ errors: {
3727
+ 409: 'Platform already exists'
3728
+ }
3729
+ });
3730
+ }
3731
+
3732
+ /**
3733
+ * Get platform list for current user
3734
+ * @param data The data for the request.
3735
+ * @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").
3736
+ * @returns PlatformListItemDto List of platforms with user binding status
3737
+ * @throws ApiError
3738
+ */
3739
+ public static platformControllerGetPlatformList(
3740
+ data: PlatformControllerGetPlatformListData = {}
3741
+ ): CancelablePromise<PlatformControllerGetPlatformListResponse> {
3742
+ return __request(OpenAPI, {
3743
+ method: 'GET',
3744
+ url: '/api/v1/bean/platforms/list',
3745
+ query: {
3746
+ region: data.region
3747
+ }
3748
+ });
3749
+ }
3750
+
3751
+ /**
3752
+ * Match platforms by name or alias
3753
+ * @param data The data for the request.
3754
+ * @param data.q Search query — Chinese name, English name, or abbreviation
3755
+ * @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").
3756
+ * @returns PlatformMatchResponseDto Matching platforms with overall match type and truncation flag
3757
+ * @throws ApiError
3758
+ */
3759
+ public static platformControllerMatchPlatforms(
3760
+ data: PlatformControllerMatchPlatformsData
3761
+ ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3762
+ return __request(OpenAPI, {
3763
+ method: 'GET',
3764
+ url: '/api/v1/bean/platforms/match',
3765
+ query: {
3766
+ q: data.q,
3422
3767
  region: data.region
3423
- },
3424
- body: data.requestBody,
3425
- mediaType: 'application/json',
3426
- errors: {
3427
- 400: 'Invalid input',
3428
- 401: 'Unauthorized'
3429
3768
  }
3430
3769
  });
3431
3770
  }
3432
3771
 
3433
3772
  /**
3434
- * Clear dialogue session
3435
- * Clear the current NLP dialogue session. Use this to cancel an ongoing multi-turn dialogue.
3773
+ * Update a platform
3436
3774
  * @param data The data for the request.
3437
- * @param data.region Region code for tenant context
3438
- * @param data.sessionId Specific session ID to clear (defaults to user session)
3439
- * @returns void Session cleared successfully
3775
+ * @param data.id Platform ID
3776
+ * @param data.requestBody
3777
+ * @returns unknown Platform updated successfully
3440
3778
  * @throws ApiError
3441
3779
  */
3442
- public static nlpControllerClearSession(
3443
- data: NlpControllerClearSessionData
3444
- ): CancelablePromise<NlpControllerClearSessionResponse> {
3780
+ public static platformControllerUpdate(
3781
+ data: PlatformControllerUpdateData
3782
+ ): CancelablePromise<PlatformControllerUpdateResponse> {
3445
3783
  return __request(OpenAPI, {
3446
- method: 'DELETE',
3447
- url: '/api/v1/{region}/bean/nlp/session',
3784
+ method: 'PUT',
3785
+ url: '/api/v1/bean/platforms/{id}',
3448
3786
  path: {
3449
- region: data.region
3450
- },
3451
- query: {
3452
- sessionId: data.sessionId
3787
+ id: data.id
3453
3788
  },
3789
+ body: data.requestBody,
3790
+ mediaType: 'application/json',
3454
3791
  errors: {
3455
- 401: 'Unauthorized'
3792
+ 404: 'Platform not found'
3456
3793
  }
3457
3794
  });
3458
3795
  }
3459
3796
 
3460
3797
  /**
3461
- * Get current session state
3462
- * Get the current NLP dialogue session state. Useful for debugging and displaying session context in UI.
3798
+ * Delete a platform
3463
3799
  * @param data The data for the request.
3464
- * @param data.region Region code for tenant context
3465
- * @param data.sessionId Specific session ID to get (defaults to user session)
3466
- * @returns unknown Current session state (or null if no active session)
3800
+ * @param data.id Platform ID
3801
+ * @returns void Platform deleted successfully
3467
3802
  * @throws ApiError
3468
3803
  */
3469
- public static nlpControllerGetSession(
3470
- data: NlpControllerGetSessionData
3471
- ): CancelablePromise<NlpControllerGetSessionResponse> {
3804
+ public static platformControllerDelete(
3805
+ data: PlatformControllerDeleteData
3806
+ ): CancelablePromise<PlatformControllerDeleteResponse> {
3472
3807
  return __request(OpenAPI, {
3473
- method: 'GET',
3474
- url: '/api/v1/{region}/bean/nlp/session',
3808
+ method: 'DELETE',
3809
+ url: '/api/v1/bean/platforms/{id}',
3475
3810
  path: {
3476
- region: data.region
3477
- },
3478
- query: {
3479
- sessionId: data.sessionId
3811
+ id: data.id
3480
3812
  },
3481
3813
  errors: {
3482
- 401: 'Unauthorized'
3814
+ 404: 'Platform not found'
3483
3815
  }
3484
3816
  });
3485
3817
  }
@@ -3639,163 +3971,6 @@ export class InvestmentService {
3639
3971
  }
3640
3972
  }
3641
3973
 
3642
- export class ReportingService {
3643
- /**
3644
- * Get portfolio value trends
3645
- *
3646
- * Returns time series data of portfolio net worth.
3647
- *
3648
- * **Multi-currency Support:**
3649
- * - `series[].byCurrency` - Currency breakdown for each data point
3650
- * - `byCurrency` - Separate time series grouped by currency
3651
- * - `warnings` - Exchange rate warnings if conversion failed
3652
- *
3653
- * **Parameters:**
3654
- * - `period`: Time period (1m, 3m, 6m, 1y)
3655
- * - `granularity`: Data granularity (day, week, month)
3656
- *
3657
- * @param data The data for the request.
3658
- * @param data.region Region code for tenant context
3659
- * @param data.period Time period
3660
- * @param data.granularity Data granularity
3661
- * @returns PortfolioTrendsResponseDto Trends retrieved successfully
3662
- * @throws ApiError
3663
- */
3664
- public static reportingControllerGetPortfolioTrends(
3665
- data: ReportingControllerGetPortfolioTrendsData
3666
- ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
3667
- return __request(OpenAPI, {
3668
- method: 'GET',
3669
- url: '/api/v1/{region}/reporting/portfolio/trends',
3670
- path: {
3671
- region: data.region
3672
- },
3673
- query: {
3674
- period: data.period,
3675
- granularity: data.granularity
3676
- },
3677
- errors: {
3678
- 401: 'User not authenticated'
3679
- }
3680
- });
3681
- }
3682
-
3683
- /**
3684
- * Get cash-flow trends
3685
- *
3686
- * Monthly income / expense / netSavings over a fixed N-month window
3687
- * (current month + N−1 prior). Missing months are zero-filled (flow metric).
3688
- *
3689
- * **Parameters:**
3690
- * - `period`: 1m | 3m | 6m | 1y (default 6m)
3691
- * - `granularity`: accepted for API symmetry; v1 returns month buckets
3692
- *
3693
- * @param data The data for the request.
3694
- * @param data.region Region code for tenant context
3695
- * @param data.period Time period
3696
- * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
3697
- * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
3698
- * @throws ApiError
3699
- */
3700
- public static reportingControllerGetCashFlowTrends(
3701
- data: ReportingControllerGetCashFlowTrendsData
3702
- ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
3703
- return __request(OpenAPI, {
3704
- method: 'GET',
3705
- url: '/api/v1/{region}/reporting/cash-flow/trends',
3706
- path: {
3707
- region: data.region
3708
- },
3709
- query: {
3710
- period: data.period,
3711
- granularity: data.granularity
3712
- },
3713
- errors: {
3714
- 401: 'User not authenticated'
3715
- }
3716
- });
3717
- }
3718
-
3719
- /**
3720
- * Generate portfolio snapshot
3721
- *
3722
- * Manually generate a portfolio snapshot for a specific date.
3723
- *
3724
- * **Multi-currency Support:**
3725
- * - Fetches balances grouped by currency
3726
- * - Uses user's baseCurrency setting for conversion
3727
- * - Stores exchange rates and warnings
3728
- *
3729
- * **Use Cases:**
3730
- * - Testing snapshot generation
3731
- * - Force regeneration after data correction
3732
- * - Initial setup for new users
3733
- *
3734
- * @param data The data for the request.
3735
- * @param data.region Region code for tenant context
3736
- * @param data.requestBody Optional date (defaults to today)
3737
- * @returns GenerateSnapshotResponse Snapshot generated successfully
3738
- * @throws ApiError
3739
- */
3740
- public static reportingControllerGenerateSnapshot(
3741
- data: ReportingControllerGenerateSnapshotData
3742
- ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
3743
- return __request(OpenAPI, {
3744
- method: 'POST',
3745
- url: '/api/v1/{region}/reporting/snapshots/generate',
3746
- path: {
3747
- region: data.region
3748
- },
3749
- body: data.requestBody,
3750
- mediaType: 'application/json',
3751
- errors: {
3752
- 400: 'Invalid date format',
3753
- 401: 'User not authenticated'
3754
- }
3755
- });
3756
- }
3757
-
3758
- /**
3759
- * Backfill portfolio snapshots
3760
- *
3761
- * Generate snapshots for a date range (historical data backfill).
3762
- *
3763
- * **Multi-currency Support:**
3764
- * - Each snapshot includes multi-currency data
3765
- * - Uses exchange rates available at generation time
3766
- * - Warnings stored for missing exchange rates
3767
- *
3768
- * **Best Practices:**
3769
- * - Use for initial setup after account configuration
3770
- * - Run during low-traffic periods for large date ranges
3771
- * - Existing snapshots are skipped (not regenerated)
3772
- *
3773
- * @param data The data for the request.
3774
- * @param data.region Region code for tenant context
3775
- * @param data.requestBody
3776
- * @returns BackfillSnapshotsResponse Backfill completed successfully
3777
- * @throws ApiError
3778
- */
3779
- public static reportingControllerBackfillSnapshots(
3780
- data: ReportingControllerBackfillSnapshotsData
3781
- ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
3782
- return __request(OpenAPI, {
3783
- method: 'POST',
3784
- url: '/api/v1/{region}/reporting/snapshots/backfill',
3785
- path: {
3786
- region: data.region
3787
- },
3788
- body: data.requestBody,
3789
- mediaType: 'application/json',
3790
- errors: {
3791
- 400: 'Invalid date format or range',
3792
- 401: 'User not authenticated',
3793
- 409: 'Backfill already in progress for this user'
3794
- }
3795
- });
3796
- }
3797
- }
3798
-
3799
3974
  export class ApiKeysService {
3800
3975
  /**
3801
3976
  * Create API key
@@ -3819,7 +3994,7 @@ export class AuthService {
3819
3994
  * Anonymous login with access token
3820
3995
  * @param data The data for the request.
3821
3996
  * @param data.requestBody
3822
- * @returns unknown Login successful
3997
+ * @returns AnonymousLoginResponseDto Login successful
3823
3998
  * @throws ApiError
3824
3999
  */
3825
4000
  public static authControllerAccessTokenLogin(
@@ -4006,3 +4181,53 @@ export class InfoService {
4006
4181
  });
4007
4182
  }
4008
4183
  }
4184
+
4185
+ export class MarketDataService {
4186
+ /**
4187
+ * Search market symbols by name or code
4188
+ * Ranked search over the openbb catalog. Empty `q` returns [].
4189
+ * @param data The data for the request.
4190
+ * @param data.q Search term — matched against symbol and instrument name. Empty string returns [].
4191
+ * @param data.limit Maximum number of results (clamped 1..50)
4192
+ * @param data.exchange Filter by exchange code (e.g. US, HK, SS, SZ)
4193
+ * @param data.assetType Filter by OpenBB asset_type (e.g. stock, etf)
4194
+ * @returns SymbolSearchResultDto Ranked search results
4195
+ * @throws ApiError
4196
+ */
4197
+ public static symbolControllerSearch(
4198
+ data: SymbolControllerSearchData
4199
+ ): CancelablePromise<SymbolControllerSearchResponse> {
4200
+ return __request(OpenAPI, {
4201
+ method: 'GET',
4202
+ url: '/api/v1/market/symbols/search',
4203
+ query: {
4204
+ q: data.q,
4205
+ limit: data.limit,
4206
+ exchange: data.exchange,
4207
+ assetType: data.assetType
4208
+ }
4209
+ });
4210
+ }
4211
+
4212
+ /**
4213
+ * Get a market symbol quote
4214
+ * @param data The data for the request.
4215
+ * @param data.symbol
4216
+ * @returns SymbolQuoteDto Symbol quote
4217
+ * @throws ApiError
4218
+ */
4219
+ public static symbolControllerGetQuote(
4220
+ data: SymbolControllerGetQuoteData
4221
+ ): CancelablePromise<SymbolControllerGetQuoteResponse> {
4222
+ return __request(OpenAPI, {
4223
+ method: 'GET',
4224
+ url: '/api/v1/market/symbols/{symbol}/quote',
4225
+ path: {
4226
+ symbol: data.symbol
4227
+ },
4228
+ errors: {
4229
+ 404: 'Symbol not found in the openbb catalog'
4230
+ }
4231
+ });
4232
+ }
4233
+ }