@firela/api-types 0.0.0-canary.da8dfd93 → 0.0.0-canary.e6edf4ac

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.
@@ -164,9 +164,7 @@ export type AccountResponseDto = {
164
164
  /**
165
165
  * Platform ID (null if unbound)
166
166
  */
167
- platformId?: {
168
- [key: string]: unknown;
169
- };
167
+ platformId?: string;
170
168
  /**
171
169
  * Platform details (populated if platformId is set)
172
170
  */
@@ -327,15 +325,27 @@ export type AccountStandardResponseDto = {
327
325
  */
328
326
  type: 'Assets' | 'Liabilities' | 'Income' | 'Expenses' | 'Equity';
329
327
  /**
330
- * Short localized display name
328
+ * Short display name. Universal rows project to the request locale (Accept-Language); regional rows keep the authored native name — mixed-language by design (ADR-0131 class P vs class A).
331
329
  */
332
330
  name?: string;
333
331
  /**
334
- * Account description (stable semantics only)
332
+ * Authored market-language alternative names delivered verbatim (not localized copy, not xlf-managed, not locale-projected). Flat string[] per ADR-0129 D1; ADR-0131 class A.
333
+ */
334
+ aliases?: Array<string>;
335
+ /**
336
+ * Locale-projected search synonyms (e.g. the zh bank-card / debit-card everyday terms for the checking account). Pure-locale projection — absent when the locale has no seeded synonyms; English fallback rides the authored aliases field. Search-only vocabulary, not the NLP routing corpus (#698, ADR-0131 fourth-class adjudication).
337
+ */
338
+ searchTerms?: Array<string>;
339
+ /**
340
+ * Product denomination as a 3-letter ISO 4217 code, authored market data delivered verbatim (not localized, not xlf-managed). ADR-0131 class A. Absent = single-currency not asserted — consumers fall back to their own region currency (#714).
341
+ */
342
+ currency?: string;
343
+ /**
344
+ * Account description (stable semantics only). Mixed-language contract: universal rows project to the request locale via the accountDesc xlf axis with an en fallback (ADR-0131 class P, ADR-0132; unseeded locales falling back to English are expected); regional rows deliver the authored market language (ADR-0131 class A, verbatim, never xlf-managed).
335
345
  */
336
346
  description: string;
337
347
  /**
338
- * Account tags for categorization
348
+ * Account tags for categorization — structured metadata delivered verbatim (not localized, not xlf-managed). ADR-0131 class A.
339
349
  */
340
350
  tags: Array<string>;
341
351
  /**
@@ -595,7 +605,7 @@ export type PostingResponseDto = {
595
605
  */
596
606
  account: string;
597
607
  /**
598
- * Amount as decimal string. Typed optional but always present in responses: interpolation fills any MISSING posting before it is persisted or returned.
608
+ * Amount as decimal string. Typed optional but always present in responses: interpolation fills any MISSING posting before it is persisted or returned. Carries the raw Beancount sign (credit-normal accounts such as Income post negative — the accounting truth, ADR-0126); renderers must not infer economic semantics from this sign.
599
609
  */
600
610
  units?: string;
601
611
  /**
@@ -830,7 +840,7 @@ export type PostingDetailDto = {
830
840
  */
831
841
  account: string;
832
842
  /**
833
- * Amount as decimal string. Typed optional but always present in responses: interpolation fills any MISSING posting before it is persisted or returned.
843
+ * Amount as decimal string. Typed optional but always present in responses: interpolation fills any MISSING posting before it is persisted or returned. Carries the raw Beancount sign (credit-normal accounts such as Income post negative — the accounting truth, ADR-0126); renderers must not infer economic semantics from this sign.
834
844
  */
835
845
  units?: string;
836
846
  /**
@@ -976,6 +986,101 @@ export type flag2 =
976
986
  */
977
987
  export type status2 = 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
978
988
 
989
+ export type TransactionListItemDto = {
990
+ /**
991
+ * Transaction ID
992
+ */
993
+ id: string;
994
+ /**
995
+ * Transaction date
996
+ */
997
+ date: string;
998
+ /**
999
+ * Transaction flag
1000
+ */
1001
+ flag?:
1002
+ | 'CLEARED'
1003
+ | 'PENDING'
1004
+ | 'PADDING'
1005
+ | 'SUMMARIZE'
1006
+ | 'TRANSFER'
1007
+ | 'CONVERSIONS';
1008
+ /**
1009
+ * Custom flag (if not using standard flags)
1010
+ */
1011
+ customFlag?: string;
1012
+ /**
1013
+ * Payee name
1014
+ */
1015
+ payee?: string;
1016
+ /**
1017
+ * Transaction narration
1018
+ */
1019
+ narration: string;
1020
+ /**
1021
+ * Transaction tags
1022
+ */
1023
+ tags: Array<string>;
1024
+ /**
1025
+ * Transaction links
1026
+ */
1027
+ links: Array<string>;
1028
+ /**
1029
+ * Transaction metadata
1030
+ */
1031
+ meta?: {
1032
+ [key: string]: unknown;
1033
+ };
1034
+ /**
1035
+ * Transaction status
1036
+ */
1037
+ status: 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
1038
+ /**
1039
+ * Source type (free-form string from transaction metadata, e.g. import, api)
1040
+ */
1041
+ sourceType?: string;
1042
+ /**
1043
+ * Source platform (e.g., alipay, wechat)
1044
+ */
1045
+ sourcePlatform?: string;
1046
+ /**
1047
+ * Transaction postings
1048
+ */
1049
+ postings: Array<PostingDetailDto>;
1050
+ /**
1051
+ * Created at timestamp
1052
+ */
1053
+ createdAt: string;
1054
+ /**
1055
+ * Voided at timestamp (if voided)
1056
+ */
1057
+ voidedAt?: string;
1058
+ /**
1059
+ * User ID who voided this transaction
1060
+ */
1061
+ voidedBy?: string;
1062
+ /**
1063
+ * Correction reason (if voided or superseded)
1064
+ */
1065
+ correctionReason?: string;
1066
+ /**
1067
+ * ID of the transaction that supersedes this one (set when status=SUPERSEDED)
1068
+ */
1069
+ supersededBy?: string;
1070
+ /**
1071
+ * ID of the transaction this one corrected/replaced (back-link on the replacement)
1072
+ */
1073
+ originalTxn?: string;
1074
+ /**
1075
+ * Row amount under the request viewpoint (ADR-0126). Category viewpoint (category + flow): per-leg sign-normalized sum over the category account set (Income-root legs negated, Expenses-root identity) — positive under normal booking but NOT clamped (explicit negative expense legs and net-flip refund months stay negative). No viewpoint (plain list / search, no accountId): wallet money-flow net = raw-sign sum over cost-less Assets/Liabilities legs (income positive, expenses negative, transfers net ~0); color cue is the wallet sign (net < 0 = wealth-decreasing). Status-orthogonal: audit views match too (ADR-0128 amount-as-matching-key). Omitted under the account viewpoint (incl. dual) and for rows with no wallet leg.
1076
+ */
1077
+ viewpointAmount?: string;
1078
+ /**
1079
+ * Currency of viewpointAmount. A row spanning multiple currencies takes the largest-magnitude currency group (known simplification, ADR-0126).
1080
+ */
1081
+ viewpointCurrency?: string;
1082
+ };
1083
+
979
1084
  export type BalanceByCurrencyDto = {
980
1085
  /**
981
1086
  * ISO 4217 currency code
@@ -1004,7 +1109,7 @@ export type ExchangeRateWarningDto = {
1004
1109
 
1005
1110
  export type TransactionListSummaryDto = {
1006
1111
  /**
1007
- * Partial converted total in base currency (rated currencies only, raw Beancount sign). When warnings is non-empty this excludes currencies missing an FX rate; may be "0.00" if ALL non-base currencies lack a rate. Converted at the dateTo (or current) available rate.
1112
+ * Partial converted total in base currency (rated currencies only). Sign by viewpoint (ADR-0126): account viewpoint keeps the raw Beancount sign (income negative); category viewpoint is per-leg sign-normalized (Income legs negated, Expenses legs identity — positive under normal booking, not clamped). When warnings is non-empty this excludes currencies missing an FX rate; may be "0.00" if ALL non-base currencies lack a rate. Converted at the dateTo (or current) available rate.
1008
1113
  */
1009
1114
  totalAmount: string;
1010
1115
  /**
@@ -1021,11 +1126,32 @@ export type TransactionListSummaryDto = {
1021
1126
  warnings?: Array<ExchangeRateWarningDto>;
1022
1127
  };
1023
1128
 
1129
+ export type TransactionListViewpointDto = {
1130
+ /**
1131
+ * Viewpoint type (only category drill-down carries a viewpoint today)
1132
+ */
1133
+ type: 'category';
1134
+ /**
1135
+ * Flow root the category account set is restricted to
1136
+ */
1137
+ flow: 'income' | 'expense';
1138
+ };
1139
+
1140
+ /**
1141
+ * Viewpoint type (only category drill-down carries a viewpoint today)
1142
+ */
1143
+ export type type2 = 'category';
1144
+
1145
+ /**
1146
+ * Flow root the category account set is restricted to
1147
+ */
1148
+ export type flow = 'income' | 'expense';
1149
+
1024
1150
  export type TransactionListResponseDto = {
1025
1151
  /**
1026
1152
  * List of transactions
1027
1153
  */
1028
- data: Array<TransactionDetailDto>;
1154
+ data: Array<TransactionListItemDto>;
1029
1155
  /**
1030
1156
  * Total count of matching transactions
1031
1157
  */
@@ -1042,6 +1168,10 @@ export type TransactionListResponseDto = {
1042
1168
  * Amount summary for the full filtered set (#514). Present only when the request has a single account OR category viewpoint; omitted for search-only / plain-list / dual-perspective requests.
1043
1169
  */
1044
1170
  summary?: TransactionListSummaryDto;
1171
+ /**
1172
+ * Viewpoint metadata (ADR-0126). Present only for a single category filter (category + flow, no accountId); dual-perspective requests are viewpoint-less (raw signs, no viewpointAmount).
1173
+ */
1174
+ viewpoint?: TransactionListViewpointDto;
1045
1175
  };
1046
1176
 
1047
1177
  export type TagSuggestionDto = {
@@ -1253,7 +1383,7 @@ export type ReviewSummaryDto = {
1253
1383
  /**
1254
1384
  * Review type
1255
1385
  */
1256
- export type type2 =
1386
+ export type type3 =
1257
1387
  | 'DUPLICATE'
1258
1388
  | 'RULE_MATCH'
1259
1389
  | 'PAYEE_MATCH'
@@ -1701,7 +1831,7 @@ export type UpdatePayeeDto = {
1701
1831
  */
1702
1832
  customTags?: Array<string>;
1703
1833
  /**
1704
- * Metadata for extended information (location, notes, contact info, etc.). Will merge with existing metadata.
1834
+ * Metadata for extended information (location, notes, contact info, etc.)
1705
1835
  */
1706
1836
  meta?: {
1707
1837
  [key: string]: unknown;
@@ -2094,481 +2224,449 @@ export type UpdateCommodityDto = {
2094
2224
  };
2095
2225
  };
2096
2226
 
2097
- export type CreateBeanPriceDto = {
2227
+ export type CurrencyBalanceDto = {
2098
2228
  /**
2099
- * Currency being priced (e.g., USD, AAPL, BTC)
2229
+ * ISO 4217 currency code
2100
2230
  */
2101
2231
  currency: string;
2102
2232
  /**
2103
- * Quote currency (pricing currency, e.g., CNY, EUR)
2233
+ * Balance amount
2104
2234
  */
2105
- quoteCurrency: string;
2235
+ balance: string;
2236
+ };
2237
+
2238
+ export type TimeSeriesPointDto = {
2106
2239
  /**
2107
- * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
2240
+ * Date in YYYY-MM-DD format
2108
2241
  */
2109
- amount: number;
2242
+ date: string;
2110
2243
  /**
2111
- * Price date (ISO 8601 format)
2244
+ * Value at this date (in base currency)
2112
2245
  */
2113
- date: string;
2246
+ value: string;
2114
2247
  /**
2115
- * Metadata (validated by Zod schema, max field lengths enforced)
2248
+ * Change from previous point
2116
2249
  */
2117
- metadata?: {
2118
- [key: string]: unknown;
2119
- };
2120
- };
2121
-
2122
- export type PriceResponseDto = {
2250
+ change?: string;
2123
2251
  /**
2124
- * Unique identifier
2252
+ * Total assets at this date (in base currency)
2125
2253
  */
2126
- id: string;
2254
+ assets?: string;
2127
2255
  /**
2128
- * User ID (owner of the price)
2256
+ * Total liabilities at this date (in base currency)
2129
2257
  */
2130
- userId: string;
2258
+ liabilities?: string;
2131
2259
  /**
2132
- * Currency being priced (e.g., USD, AAPL, BTC)
2260
+ * Multi-currency breakdown for this point
2133
2261
  */
2134
- currency: string;
2262
+ byCurrency?: Array<CurrencyBalanceDto>;
2263
+ };
2264
+
2265
+ export type TrendSummaryDto = {
2135
2266
  /**
2136
- * Quote currency (pricing currency, e.g., USD, CNY)
2267
+ * Value at start of period
2137
2268
  */
2138
- quoteCurrency: string;
2269
+ startValue: string;
2139
2270
  /**
2140
- * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
2271
+ * Value at end of period
2141
2272
  */
2142
- amount: number;
2273
+ endValue: string;
2143
2274
  /**
2144
- * Price date (ISO 8601 format). Represents the date this price was valid.
2275
+ * Total change over period
2145
2276
  */
2146
- date: string;
2277
+ totalChange: string;
2147
2278
  /**
2148
- * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
2279
+ * Total change percentage
2149
2280
  */
2150
- meta: {
2151
- [key: string]: unknown;
2152
- };
2281
+ totalChangePercentage: string;
2282
+ };
2283
+
2284
+ export type MultiCurrencyPointDto = {
2153
2285
  /**
2154
- * Creation timestamp
2286
+ * Date in YYYY-MM-DD format
2155
2287
  */
2156
- createdAt: string;
2288
+ date: string;
2157
2289
  /**
2158
- * Last update timestamp
2290
+ * Balances by currency
2159
2291
  */
2160
- updatedAt: string;
2292
+ byCurrency: Array<CurrencyBalanceDto>;
2161
2293
  };
2162
2294
 
2163
- export type PriceListResponseDto = {
2295
+ export type PortfolioTrendsResponseDto = {
2164
2296
  /**
2165
- * List of prices
2297
+ * Time series data points
2166
2298
  */
2167
- items: Array<PriceResponseDto>;
2299
+ series: Array<TimeSeriesPointDto>;
2168
2300
  /**
2169
- * Total number of prices
2301
+ * Period summary
2170
2302
  */
2171
- total: number;
2172
- };
2173
-
2174
- export type UpdateBeanPriceDto = {
2303
+ summary: TrendSummaryDto;
2175
2304
  /**
2176
- * Currency being priced
2305
+ * Period requested
2177
2306
  */
2178
- currency?: string;
2307
+ period: string;
2179
2308
  /**
2180
- * Quote currency (pricing currency)
2309
+ * Data granularity
2181
2310
  */
2182
- quoteCurrency?: string;
2311
+ granularity: string;
2183
2312
  /**
2184
- * Price amount (MUST be >= 0 per Beancount spec)
2313
+ * Base currency for converted values
2185
2314
  */
2186
- amount?: number;
2315
+ currency: string;
2187
2316
  /**
2188
- * Price date (ISO 8601 format)
2317
+ * Multi-currency time series (each point has currency breakdown)
2189
2318
  */
2190
- date?: string;
2319
+ byCurrency?: Array<MultiCurrencyPointDto>;
2191
2320
  /**
2192
- * Metadata
2321
+ * Exchange rate warnings
2193
2322
  */
2194
- metadata?: {
2195
- [key: string]: unknown;
2196
- };
2323
+ warnings?: Array<ExchangeRateWarningDto>;
2197
2324
  };
2198
2325
 
2199
- export type CreateRecurringRuleDto = {
2326
+ export type CashFlowPointDto = {
2200
2327
  /**
2201
- * Rule name (unique per user)
2328
+ * Month key (YYYY-MM)
2202
2329
  */
2203
- name: string;
2330
+ month: string;
2204
2331
  /**
2205
- * Icon emoji
2332
+ * Income in base currency (absolute, converted)
2206
2333
  */
2207
- icon?: string;
2334
+ income: string;
2208
2335
  /**
2209
- * Recurring frequency
2336
+ * Expense in base currency (absolute, converted)
2210
2337
  */
2211
- frequency:
2212
- | 'WEEKLY'
2213
- | 'BIWEEKLY'
2214
- | 'MONTHLY'
2215
- | 'BIMONTHLY'
2216
- | 'QUARTERLY'
2217
- | 'YEARLY'
2218
- | 'CUSTOM';
2338
+ expense: string;
2219
2339
  /**
2220
- * Expected amount (positive number)
2340
+ * netSavings = income − expense (savings positive)
2221
2341
  */
2222
- expectedAmount: number;
2342
+ netSavings: string;
2343
+ };
2344
+
2345
+ export type CashFlowTrendSummaryDto = {
2223
2346
  /**
2224
- * Expected day of month (1-31)
2347
+ * Total income across the period
2225
2348
  */
2226
- expectedDay?: number;
2349
+ totalIncome: string;
2227
2350
  /**
2228
- * Custom interval in days (required for CUSTOM frequency)
2229
- */
2230
- customIntervalDays?: number;
2231
- /**
2232
- * Currency code
2351
+ * Total expense across the period
2233
2352
  */
2234
- currency: string;
2353
+ totalExpense: string;
2235
2354
  /**
2236
- * Payee matching pattern (supports wildcards)
2355
+ * income expense across the period
2237
2356
  */
2238
- matchPayeePattern?: string;
2357
+ totalNetSavings: string;
2239
2358
  /**
2240
- * Amount tolerance percentage (0-1)
2359
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
2241
2360
  */
2242
- matchAmountTolerance: number;
2361
+ averageMonthlyNetSavings: string;
2362
+ };
2363
+
2364
+ export type CashFlowTrendsResponseDto = {
2243
2365
  /**
2244
- * Default expense account for auto-create
2366
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
2245
2367
  */
2246
- defaultExpenseAccount?: string;
2368
+ series: Array<CashFlowPointDto>;
2247
2369
  /**
2248
- * Default payment account for auto-create
2370
+ * Period totals
2249
2371
  */
2250
- defaultPaymentAccount?: string;
2372
+ summary: CashFlowTrendSummaryDto;
2251
2373
  /**
2252
- * Default payee for auto-create
2374
+ * Period requested
2253
2375
  */
2254
- defaultPayee?: string;
2376
+ period: string;
2255
2377
  /**
2256
- * Auto-create transaction when expected date arrives
2378
+ * Data granularity (v1 returns month buckets)
2257
2379
  */
2258
- autoCreate: boolean;
2380
+ granularity: string;
2259
2381
  /**
2260
- * Rule start date (ISO format)
2382
+ * Base currency for converted values
2261
2383
  */
2262
- startDate?: string;
2384
+ currency: string;
2263
2385
  /**
2264
- * Rule end date (ISO format)
2386
+ * Exchange rate warnings (e.g. missing rate for a currency)
2265
2387
  */
2266
- endDate?: string;
2388
+ warnings?: Array<ExchangeRateWarningDto>;
2267
2389
  };
2268
2390
 
2269
- /**
2270
- * Recurring frequency
2271
- */
2272
- export type frequency =
2273
- | 'WEEKLY'
2274
- | 'BIWEEKLY'
2275
- | 'MONTHLY'
2276
- | 'BIMONTHLY'
2277
- | 'QUARTERLY'
2278
- | 'YEARLY'
2279
- | 'CUSTOM';
2391
+ export type GenerateSnapshotBody = unknown;
2280
2392
 
2281
- export type RecurringRuleResponseDto = {
2282
- /**
2283
- * Rule ID
2284
- */
2285
- id: string;
2286
- /**
2287
- * User ID
2288
- */
2289
- userId: string;
2393
+ export type GenerateSnapshotResponse = unknown;
2394
+
2395
+ export type BackfillSnapshotsBody = unknown;
2396
+
2397
+ export type BackfillSnapshotsResponse = unknown;
2398
+
2399
+ export type CreateBeanPriceDto = {
2290
2400
  /**
2291
- * Rule name
2401
+ * Currency being priced (e.g., USD, AAPL, BTC)
2292
2402
  */
2293
- name: string;
2403
+ currency: string;
2294
2404
  /**
2295
- * Icon emoji
2405
+ * Quote currency (pricing currency, e.g., CNY, EUR)
2296
2406
  */
2297
- icon?: {
2298
- [key: string]: unknown;
2299
- };
2407
+ quoteCurrency: string;
2300
2408
  /**
2301
- * Recurring frequency
2409
+ * Price amount (MUST be >= 0 per Beancount spec, supports up to 15 decimal places). Zero allowed for conversion entries, negative strictly prohibited.
2302
2410
  */
2303
- frequency: string;
2411
+ amount: number;
2304
2412
  /**
2305
- * Expected amount
2413
+ * Price date (ISO 8601 format)
2306
2414
  */
2307
- expectedAmount: number;
2415
+ date: string;
2308
2416
  /**
2309
- * Expected day of month
2417
+ * Metadata (validated by Zod schema, max field lengths enforced)
2310
2418
  */
2311
- expectedDay?: {
2419
+ metadata?: {
2312
2420
  [key: string]: unknown;
2313
2421
  };
2422
+ };
2423
+
2424
+ export type PriceResponseDto = {
2314
2425
  /**
2315
- * Custom interval in days
2426
+ * Unique identifier
2316
2427
  */
2317
- customIntervalDays?: {
2318
- [key: string]: unknown;
2319
- };
2428
+ id: string;
2320
2429
  /**
2321
- * Currency code
2430
+ * User ID (owner of the price)
2431
+ */
2432
+ userId: string;
2433
+ /**
2434
+ * Currency being priced (e.g., USD, AAPL, BTC)
2322
2435
  */
2323
2436
  currency: string;
2324
2437
  /**
2325
- * Payee matching pattern
2438
+ * Quote currency (pricing currency, e.g., USD, CNY)
2326
2439
  */
2327
- matchPayeePattern?: {
2328
- [key: string]: unknown;
2329
- };
2440
+ quoteCurrency: string;
2330
2441
  /**
2331
- * Amount tolerance percentage
2442
+ * Price amount (corresponds to Beancount Amount.number). Supports up to 15 decimal places.
2332
2443
  */
2333
- matchAmountTolerance: number;
2444
+ amount: number;
2334
2445
  /**
2335
- * Default expense account
2446
+ * Price date (ISO 8601 format). Represents the date this price was valid.
2336
2447
  */
2337
- defaultExpenseAccount?: {
2338
- [key: string]: unknown;
2339
- };
2448
+ date: string;
2340
2449
  /**
2341
- * Default payment account
2450
+ * Metadata (corresponds to Beancount meta field). Contains source, confidence, note, etc.
2342
2451
  */
2343
- defaultPaymentAccount?: {
2452
+ meta: {
2344
2453
  [key: string]: unknown;
2345
2454
  };
2346
2455
  /**
2347
- * Default payee
2456
+ * Creation timestamp
2348
2457
  */
2349
- defaultPayee?: {
2350
- [key: string]: unknown;
2351
- };
2458
+ createdAt: string;
2352
2459
  /**
2353
- * Whether rule is active
2460
+ * Last update timestamp
2354
2461
  */
2355
- isActive: boolean;
2462
+ updatedAt: string;
2463
+ };
2464
+
2465
+ export type PriceListResponseDto = {
2356
2466
  /**
2357
- * Rule start date (YYYY-MM-DD)
2467
+ * List of prices
2358
2468
  */
2359
- startDate: string;
2469
+ items: Array<PriceResponseDto>;
2360
2470
  /**
2361
- * Rule end date (YYYY-MM-DD)
2471
+ * Total number of prices
2362
2472
  */
2363
- endDate?: {
2364
- [key: string]: unknown;
2365
- };
2473
+ total: number;
2474
+ };
2475
+
2476
+ export type UpdateBeanPriceDto = {
2366
2477
  /**
2367
- * Auto-create transaction on expected date
2478
+ * Currency being priced
2368
2479
  */
2369
- autoCreate: boolean;
2480
+ currency?: string;
2370
2481
  /**
2371
- * Last matched occurrence date (YYYY-MM-DD)
2482
+ * Quote currency (pricing currency)
2372
2483
  */
2373
- lastOccurrence?: {
2374
- [key: string]: unknown;
2375
- };
2484
+ quoteCurrency?: string;
2376
2485
  /**
2377
- * Total matched transactions count
2486
+ * Price amount (MUST be >= 0 per Beancount spec)
2378
2487
  */
2379
- totalCount: number;
2488
+ amount?: number;
2380
2489
  /**
2381
- * Created at timestamp
2490
+ * Price date (ISO 8601 format)
2382
2491
  */
2383
- createdAt: string;
2492
+ date?: string;
2384
2493
  /**
2385
- * Updated at timestamp
2494
+ * Metadata
2386
2495
  */
2387
- updatedAt: string;
2496
+ metadata?: {
2497
+ [key: string]: unknown;
2498
+ };
2388
2499
  };
2389
2500
 
2390
- export type CreateRuleFromTransactionDto = {
2391
- /**
2392
- * Recurring frequency
2393
- */
2394
- frequency:
2395
- | 'WEEKLY'
2396
- | 'BIWEEKLY'
2397
- | 'MONTHLY'
2398
- | 'BIMONTHLY'
2399
- | 'QUARTERLY'
2400
- | 'YEARLY'
2401
- | 'CUSTOM';
2402
- /**
2403
- * Optional name override (default: transaction payee)
2404
- */
2405
- name?: string;
2501
+ export type DeleteOwnUserDto = {
2406
2502
  /**
2407
- * Optional icon emoji
2503
+ * Access token for user verification
2408
2504
  */
2409
- icon?: string;
2505
+ accessToken: string;
2410
2506
  };
2411
2507
 
2412
- export type RecurringRuleWithStatsResponseDto = {
2508
+ export type UserSettingsResponseDto = {
2413
2509
  /**
2414
- * Rule ID
2510
+ * Stored base currency choice (ISO 4217) for net-worth/report aggregation. null = user never chose; aggregates fall back to the region default at display time (#713).
2415
2511
  */
2416
- id: string;
2512
+ baseCurrency: string | null;
2513
+ };
2514
+
2515
+ export type UserResponseDto = {
2417
2516
  /**
2418
2517
  * User ID
2419
2518
  */
2420
- userId: string;
2421
- /**
2422
- * Rule name
2423
- */
2424
- name: string;
2519
+ id: string;
2425
2520
  /**
2426
- * Icon emoji
2521
+ * Assigned user role
2427
2522
  */
2428
- icon?: {
2429
- [key: string]: unknown;
2430
- };
2523
+ role: string;
2431
2524
  /**
2432
- * Recurring frequency
2525
+ * Permission strings
2433
2526
  */
2434
- frequency: string;
2527
+ permissions: Array<string>;
2435
2528
  /**
2436
- * Expected amount
2529
+ * User settings
2437
2530
  */
2438
- expectedAmount: number;
2531
+ settings: UserSettingsResponseDto;
2532
+ };
2533
+
2534
+ export type SignupDto = {
2439
2535
  /**
2440
- * Expected day of month
2536
+ * Cloudflare Turnstile verification token (optional when Turnstile disabled)
2441
2537
  */
2442
- expectedDay?: {
2443
- [key: string]: unknown;
2444
- };
2538
+ turnstileToken?: string;
2539
+ };
2540
+
2541
+ export type SignupResponseDto = {
2445
2542
  /**
2446
- * Custom interval in days
2543
+ * JWT auth token
2447
2544
  */
2448
- customIntervalDays?: {
2449
- [key: string]: unknown;
2450
- };
2545
+ authToken: string;
2451
2546
  /**
2452
- * Currency code
2547
+ * Auto-generated access token
2453
2548
  */
2454
- currency: string;
2549
+ accessToken: string;
2455
2550
  /**
2456
- * Payee matching pattern
2551
+ * Assigned user role
2457
2552
  */
2458
- matchPayeePattern?: {
2459
- [key: string]: unknown;
2460
- };
2553
+ role: 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2554
+ };
2555
+
2556
+ /**
2557
+ * Assigned user role
2558
+ */
2559
+ export type role = 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
2560
+
2561
+ export type UpdateUserSettingDto = {
2461
2562
  /**
2462
- * Amount tolerance percentage
2563
+ * Security ID
2463
2564
  */
2464
- matchAmountTolerance: number;
2565
+ secId?: number;
2465
2566
  /**
2466
- * Default expense account
2567
+ * Annual interest rate
2467
2568
  */
2468
- defaultExpenseAccount?: {
2469
- [key: string]: unknown;
2470
- };
2569
+ annualInterestRate?: number;
2471
2570
  /**
2472
- * Default payment account
2571
+ * Currency code
2473
2572
  */
2474
- defaultPaymentAccount?: {
2475
- [key: string]: unknown;
2476
- };
2573
+ currency?: string;
2477
2574
  /**
2478
- * Default payee
2575
+ * Base currency code
2479
2576
  */
2480
- defaultPayee?: {
2481
- [key: string]: unknown;
2482
- };
2577
+ baseCurrency?: string;
2483
2578
  /**
2484
- * Whether rule is active
2579
+ * Benchmark symbol
2485
2580
  */
2486
- isActive: boolean;
2581
+ benchmark?: string;
2487
2582
  /**
2488
- * Rule start date (YYYY-MM-DD)
2583
+ * Color scheme
2489
2584
  */
2490
- startDate: string;
2585
+ colorScheme?: 'DARK' | 'LIGHT';
2491
2586
  /**
2492
- * Rule end date (YYYY-MM-DD)
2587
+ * Date range filter
2493
2588
  */
2494
- endDate?: {
2495
- [key: string]: unknown;
2496
- };
2589
+ dateRange?: string;
2497
2590
  /**
2498
- * Auto-create transaction on expected date
2591
+ * Emergency fund amount
2499
2592
  */
2500
- autoCreate: boolean;
2593
+ emergencyFund?: number;
2501
2594
  /**
2502
- * Last matched occurrence date (YYYY-MM-DD)
2595
+ * Account filter IDs
2503
2596
  */
2504
- lastOccurrence?: {
2505
- [key: string]: unknown;
2506
- };
2597
+ 'filters.accounts'?: Array<string>;
2507
2598
  /**
2508
- * Total matched transactions count
2599
+ * Asset class filters
2509
2600
  */
2510
- totalCount: number;
2601
+ 'filters.assetClasses'?: Array<string>;
2511
2602
  /**
2512
- * Created at timestamp
2603
+ * Data source filter
2513
2604
  */
2514
- createdAt: string;
2605
+ 'filters.dataSource'?: string;
2515
2606
  /**
2516
- * Updated at timestamp
2607
+ * Symbol filter
2517
2608
  */
2518
- updatedAt: string;
2609
+ 'filters.symbol'?: string;
2519
2610
  /**
2520
- * Number of pending expected transactions
2611
+ * Tag filters
2521
2612
  */
2522
- pendingCount: number;
2613
+ 'filters.tags'?: Array<string>;
2523
2614
  /**
2524
- * Number of overdue expected transactions
2615
+ * Enable experimental features
2525
2616
  */
2526
- overdueCount: number;
2617
+ isExperimentalFeatures?: boolean;
2527
2618
  /**
2528
- * Next expected date (YYYY-MM-DD)
2619
+ * Enable restricted view mode
2529
2620
  */
2530
- nextExpectedDate?: {
2531
- [key: string]: unknown;
2532
- };
2621
+ isRestrictedView?: boolean;
2533
2622
  /**
2534
- * Total amount of all matched transactions
2623
+ * Language code
2535
2624
  */
2536
- totalAmount: number;
2625
+ language?: string;
2537
2626
  /**
2538
- * Average amount per transaction
2627
+ * Locale code
2539
2628
  */
2540
- averageAmount: number;
2629
+ locale?: string;
2541
2630
  /**
2542
- * Number of matched transactions
2631
+ * Projected total amount
2543
2632
  */
2544
- transactionCount: number;
2633
+ projectedTotalAmount?: number;
2545
2634
  /**
2546
- * First matched transaction date (YYYY-MM-DD)
2635
+ * Retirement date in ISO 8601 format
2547
2636
  */
2548
- firstDate?: {
2549
- [key: string]: unknown;
2550
- };
2637
+ retirementDate?: string;
2551
2638
  /**
2552
- * Last matched transaction date (YYYY-MM-DD)
2639
+ * Savings rate percentage
2553
2640
  */
2554
- lastDate?: {
2555
- [key: string]: unknown;
2556
- };
2641
+ savingsRate?: number;
2557
2642
  /**
2558
- * Amount variance (standard deviation squared)
2643
+ * View mode
2559
2644
  */
2560
- variance: number;
2645
+ viewMode?: 'DEFAULT' | 'ZEN';
2646
+ };
2647
+
2648
+ /**
2649
+ * Color scheme
2650
+ */
2651
+ export type colorScheme = 'DARK' | 'LIGHT';
2652
+
2653
+ /**
2654
+ * View mode
2655
+ */
2656
+ export type viewMode = 'DEFAULT' | 'ZEN';
2657
+
2658
+ export type UpdatePropertyDto = {
2561
2659
  /**
2562
- * Number of upcoming expected transactions
2660
+ * Property value
2563
2661
  */
2564
- upcomingCount: number;
2662
+ value: string;
2565
2663
  };
2566
2664
 
2567
- export type UpdateRecurringRuleDto = {
2665
+ export type CreateRecurringRuleDto = {
2568
2666
  /**
2569
- * Rule name
2667
+ * Rule name (unique per user)
2570
2668
  */
2571
- name?: string;
2669
+ name: string;
2572
2670
  /**
2573
2671
  * Icon emoji
2574
2672
  */
@@ -2576,7 +2674,7 @@ export type UpdateRecurringRuleDto = {
2576
2674
  /**
2577
2675
  * Recurring frequency
2578
2676
  */
2579
- frequency?:
2677
+ frequency:
2580
2678
  | 'WEEKLY'
2581
2679
  | 'BIWEEKLY'
2582
2680
  | 'MONTHLY'
@@ -2585,15 +2683,15 @@ export type UpdateRecurringRuleDto = {
2585
2683
  | 'YEARLY'
2586
2684
  | 'CUSTOM';
2587
2685
  /**
2588
- * Expected amount
2686
+ * Expected amount (positive number)
2589
2687
  */
2590
- expectedAmount?: number;
2688
+ expectedAmount: number;
2591
2689
  /**
2592
2690
  * Expected day of month (1-31)
2593
2691
  */
2594
2692
  expectedDay?: number;
2595
2693
  /**
2596
- * Custom interval in days
2694
+ * Custom interval in days (required for CUSTOM frequency)
2597
2695
  */
2598
2696
  customIntervalDays?: number;
2599
2697
  /**
@@ -2601,111 +2699,132 @@ export type UpdateRecurringRuleDto = {
2601
2699
  */
2602
2700
  currency?: string;
2603
2701
  /**
2604
- * Payee matching pattern
2702
+ * Payee matching pattern (supports wildcards)
2605
2703
  */
2606
2704
  matchPayeePattern?: string;
2607
2705
  /**
2608
2706
  * Amount tolerance percentage (0-1)
2609
2707
  */
2610
- matchAmountTolerance?: number;
2708
+ matchAmountTolerance: number;
2611
2709
  /**
2612
- * Default expense account
2710
+ * Default expense account for auto-create
2613
2711
  */
2614
2712
  defaultExpenseAccount?: string;
2615
2713
  /**
2616
- * Default payment account
2714
+ * Default payment account for auto-create
2617
2715
  */
2618
2716
  defaultPaymentAccount?: string;
2619
2717
  /**
2620
- * Default payee
2718
+ * Default payee for auto-create
2621
2719
  */
2622
2720
  defaultPayee?: string;
2623
2721
  /**
2624
- * Auto-create transaction
2722
+ * Auto-create transaction when expected date arrives
2625
2723
  */
2626
- autoCreate?: boolean;
2724
+ autoCreate: boolean;
2627
2725
  /**
2628
- * Rule active status
2726
+ * Rule start date (ISO format)
2629
2727
  */
2630
- isActive?: boolean;
2728
+ startDate?: string;
2631
2729
  /**
2632
2730
  * Rule end date (ISO format)
2633
2731
  */
2634
2732
  endDate?: string;
2635
2733
  };
2636
2734
 
2637
- export type ExpectedTransactionRuleDto = {
2735
+ /**
2736
+ * Recurring frequency
2737
+ */
2738
+ export type frequency =
2739
+ | 'WEEKLY'
2740
+ | 'BIWEEKLY'
2741
+ | 'MONTHLY'
2742
+ | 'BIMONTHLY'
2743
+ | 'QUARTERLY'
2744
+ | 'YEARLY'
2745
+ | 'CUSTOM';
2746
+
2747
+ export type RecurringRuleResponseDto = {
2748
+ /**
2749
+ * Rule ID
2750
+ */
2751
+ id: string;
2752
+ /**
2753
+ * User ID
2754
+ */
2755
+ userId: string;
2638
2756
  /**
2639
2757
  * Rule name
2640
2758
  */
2641
2759
  name: string;
2642
2760
  /**
2643
- * Rule icon
2761
+ * Icon emoji
2644
2762
  */
2645
- icon?: {
2646
- [key: string]: unknown;
2647
- };
2763
+ icon?: string;
2648
2764
  /**
2649
- * Rule frequency
2765
+ * Recurring frequency
2650
2766
  */
2651
2767
  frequency: string;
2768
+ /**
2769
+ * Expected amount
2770
+ */
2771
+ expectedAmount: number;
2772
+ /**
2773
+ * Expected day of month
2774
+ */
2775
+ expectedDay?: number;
2776
+ /**
2777
+ * Custom interval in days
2778
+ */
2779
+ customIntervalDays?: number;
2652
2780
  /**
2653
2781
  * Currency code
2654
2782
  */
2655
2783
  currency: string;
2656
- };
2657
-
2658
- export type ExpectedTransactionResponseDto = {
2659
2784
  /**
2660
- * Expected transaction ID
2785
+ * Payee matching pattern
2661
2786
  */
2662
- id: string;
2787
+ matchPayeePattern?: string;
2663
2788
  /**
2664
- * User ID
2789
+ * Amount tolerance percentage
2665
2790
  */
2666
- userId: string;
2791
+ matchAmountTolerance: number;
2667
2792
  /**
2668
- * Associated rule ID
2793
+ * Default expense account
2669
2794
  */
2670
- ruleId: string;
2795
+ defaultExpenseAccount?: string;
2671
2796
  /**
2672
- * Expected date (YYYY-MM-DD)
2797
+ * Default payment account
2673
2798
  */
2674
- expectedDate: string;
2799
+ defaultPaymentAccount?: string;
2675
2800
  /**
2676
- * Expected amount
2801
+ * Default payee
2677
2802
  */
2678
- expectedAmount: number;
2803
+ defaultPayee?: string;
2679
2804
  /**
2680
- * Status (PENDING, COMPLETED, SKIPPED)
2805
+ * Whether rule is active
2681
2806
  */
2682
- status: string;
2807
+ isActive: boolean;
2683
2808
  /**
2684
- * Matched transaction ID
2809
+ * Rule start date (YYYY-MM-DD)
2685
2810
  */
2686
- matchedTransactionId?: {
2687
- [key: string]: unknown;
2688
- };
2811
+ startDate: string;
2689
2812
  /**
2690
- * Match timestamp (ISO 8601)
2813
+ * Rule end date (YYYY-MM-DD)
2691
2814
  */
2692
- matchedAt?: {
2693
- [key: string]: unknown;
2694
- };
2815
+ endDate?: string;
2695
2816
  /**
2696
- * Match confidence score (0-1)
2817
+ * Auto-create transaction on expected date
2697
2818
  */
2698
- matchConfidence?: {
2699
- [key: string]: unknown;
2700
- };
2819
+ autoCreate: boolean;
2701
2820
  /**
2702
- * Whether this expected transaction is overdue
2821
+ * Last matched occurrence date (YYYY-MM-DD)
2703
2822
  */
2704
- isOverdue: boolean;
2823
+ lastOccurrence?: string;
2705
2824
  /**
2706
- * Rule information
2825
+ * Total matched transactions count
2707
2826
  */
2708
- rule: ExpectedTransactionRuleDto;
2827
+ totalCount: number;
2709
2828
  /**
2710
2829
  * Created at timestamp
2711
2830
  */
@@ -2716,461 +2835,420 @@ export type ExpectedTransactionResponseDto = {
2716
2835
  updatedAt: string;
2717
2836
  };
2718
2837
 
2719
- export type ExpectedTransactionListResponseDto = {
2720
- items: Array<ExpectedTransactionResponseDto>;
2721
- /**
2722
- * Total count
2723
- */
2724
- total: number;
2725
- };
2726
-
2727
- export type ConfirmMatchDto = {
2838
+ export type CreateRuleFromTransactionDto = {
2728
2839
  /**
2729
- * Transaction ID to match with
2840
+ * Recurring frequency
2730
2841
  */
2731
- transactionId: string;
2732
- };
2733
-
2734
- export type EnterNowDto = {
2842
+ frequency:
2843
+ | 'WEEKLY'
2844
+ | 'BIWEEKLY'
2845
+ | 'MONTHLY'
2846
+ | 'BIMONTHLY'
2847
+ | 'QUARTERLY'
2848
+ | 'YEARLY'
2849
+ | 'CUSTOM';
2735
2850
  /**
2736
- * Override expense account (uses rule default if not provided)
2851
+ * Optional name override (default: transaction payee)
2737
2852
  */
2738
- expenseAccount?: string;
2853
+ name?: string;
2739
2854
  /**
2740
- * Override payment account (uses rule default if not provided)
2855
+ * Optional icon emoji
2741
2856
  */
2742
- paymentAccount?: string;
2857
+ icon?: string;
2858
+ };
2859
+
2860
+ export type RecurringRuleWithStatsResponseDto = {
2743
2861
  /**
2744
- * Override amount (uses expected amount if not provided)
2862
+ * Rule ID
2745
2863
  */
2746
- amount?: number;
2864
+ id: string;
2747
2865
  /**
2748
- * Override payee (uses rule default if not provided)
2866
+ * User ID
2749
2867
  */
2750
- payee?: string;
2868
+ userId: string;
2751
2869
  /**
2752
- * Optional narration
2870
+ * Rule name
2753
2871
  */
2754
- narration?: string;
2755
- };
2756
-
2757
- export type ForecastItemDto = {
2872
+ name: string;
2758
2873
  /**
2759
- * Rule name
2874
+ * Icon emoji
2760
2875
  */
2761
- rule: string;
2876
+ icon?: string;
2762
2877
  /**
2763
- * Rule ID
2878
+ * Recurring frequency
2764
2879
  */
2765
- ruleId: string;
2880
+ frequency: string;
2766
2881
  /**
2767
2882
  * Expected amount
2768
2883
  */
2769
- amount: number;
2884
+ expectedAmount: number;
2770
2885
  /**
2771
- * Expected date (YYYY-MM-DD)
2886
+ * Expected day of month
2772
2887
  */
2773
- date: string;
2888
+ expectedDay?: number;
2774
2889
  /**
2775
- * Rule icon emoji
2890
+ * Custom interval in days
2776
2891
  */
2777
- icon: string | null;
2892
+ customIntervalDays?: number;
2778
2893
  /**
2779
2894
  * Currency code
2780
2895
  */
2781
2896
  currency: string;
2782
- };
2783
-
2784
- export type MonthlyForecastDto = {
2785
2897
  /**
2786
- * Month (YYYY-MM)
2898
+ * Payee matching pattern
2787
2899
  */
2788
- month: string;
2900
+ matchPayeePattern?: string;
2789
2901
  /**
2790
- * Total expected outflow for the month
2902
+ * Amount tolerance percentage
2791
2903
  */
2792
- expectedOutflow: number;
2904
+ matchAmountTolerance: number;
2793
2905
  /**
2794
- * Number of expected transactions
2906
+ * Default expense account
2795
2907
  */
2796
- itemCount: number;
2908
+ defaultExpenseAccount?: string;
2797
2909
  /**
2798
- * Breakdown by currency
2910
+ * Default payment account
2799
2911
  */
2800
- byCurrency: {
2801
- [key: string]: unknown;
2802
- };
2912
+ defaultPaymentAccount?: string;
2803
2913
  /**
2804
- * Individual forecast items
2914
+ * Default payee
2805
2915
  */
2806
- items: Array<ForecastItemDto>;
2807
- };
2808
-
2809
- export type ForecastResponseDto = {
2916
+ defaultPayee?: string;
2810
2917
  /**
2811
- * Monthly forecast data
2918
+ * Whether rule is active
2812
2919
  */
2813
- forecast: Array<MonthlyForecastDto>;
2920
+ isActive: boolean;
2814
2921
  /**
2815
- * Total expected outflow across all months
2922
+ * Rule start date (YYYY-MM-DD)
2816
2923
  */
2817
- totalOutflow: number;
2924
+ startDate: string;
2818
2925
  /**
2819
- * Total by currency across all months
2926
+ * Rule end date (YYYY-MM-DD)
2820
2927
  */
2821
- totalByCurrency: {
2822
- [key: string]: unknown;
2823
- };
2928
+ endDate?: string;
2824
2929
  /**
2825
- * Number of active recurring rules included
2930
+ * Auto-create transaction on expected date
2826
2931
  */
2827
- rulesCount: number;
2932
+ autoCreate: boolean;
2828
2933
  /**
2829
- * Forecast period start date
2934
+ * Last matched occurrence date (YYYY-MM-DD)
2830
2935
  */
2831
- periodStart: string;
2936
+ lastOccurrence?: string;
2832
2937
  /**
2833
- * Forecast period end date
2938
+ * Total matched transactions count
2834
2939
  */
2835
- periodEnd: string;
2836
- };
2837
-
2838
- export type CurrencyBalanceDto = {
2940
+ totalCount: number;
2839
2941
  /**
2840
- * ISO 4217 currency code
2942
+ * Created at timestamp
2841
2943
  */
2842
- currency: string;
2944
+ createdAt: string;
2843
2945
  /**
2844
- * Balance amount
2946
+ * Updated at timestamp
2845
2947
  */
2846
- balance: string;
2847
- };
2848
-
2849
- export type TimeSeriesPointDto = {
2948
+ updatedAt: string;
2850
2949
  /**
2851
- * Date in YYYY-MM-DD format
2950
+ * Number of pending expected transactions
2852
2951
  */
2853
- date: string;
2952
+ pendingCount: number;
2854
2953
  /**
2855
- * Value at this date (in base currency)
2954
+ * Number of overdue expected transactions
2856
2955
  */
2857
- value: string;
2956
+ overdueCount: number;
2858
2957
  /**
2859
- * Change from previous point
2958
+ * Next expected date (YYYY-MM-DD)
2860
2959
  */
2861
- change?: {
2862
- [key: string]: unknown;
2863
- };
2960
+ nextExpectedDate?: string;
2864
2961
  /**
2865
- * Total assets at this date (in base currency)
2962
+ * Total amount of all matched transactions
2866
2963
  */
2867
- assets?: string;
2964
+ totalAmount: number;
2868
2965
  /**
2869
- * Total liabilities at this date (in base currency)
2966
+ * Average amount per transaction
2870
2967
  */
2871
- liabilities?: string;
2968
+ averageAmount: number;
2872
2969
  /**
2873
- * Multi-currency breakdown for this point
2970
+ * Number of matched transactions
2874
2971
  */
2875
- byCurrency?: Array<CurrencyBalanceDto>;
2876
- };
2877
-
2878
- export type TrendSummaryDto = {
2972
+ transactionCount: number;
2879
2973
  /**
2880
- * Value at start of period
2974
+ * First matched transaction date (YYYY-MM-DD)
2881
2975
  */
2882
- startValue: string;
2976
+ firstDate?: string;
2883
2977
  /**
2884
- * Value at end of period
2978
+ * Last matched transaction date (YYYY-MM-DD)
2885
2979
  */
2886
- endValue: string;
2980
+ lastDate?: string;
2887
2981
  /**
2888
- * Total change over period
2982
+ * Amount variance (standard deviation squared)
2889
2983
  */
2890
- totalChange: string;
2984
+ variance: number;
2891
2985
  /**
2892
- * Total change percentage
2986
+ * Number of upcoming expected transactions
2893
2987
  */
2894
- totalChangePercentage: string;
2988
+ upcomingCount: number;
2895
2989
  };
2896
2990
 
2897
- export type MultiCurrencyPointDto = {
2991
+ export type UpdateRecurringRuleDto = {
2898
2992
  /**
2899
- * Date in YYYY-MM-DD format
2993
+ * Rule name (unique per user)
2900
2994
  */
2901
- date: string;
2995
+ name?: string;
2902
2996
  /**
2903
- * Balances by currency
2997
+ * Icon emoji
2904
2998
  */
2905
- byCurrency: Array<CurrencyBalanceDto>;
2906
- };
2907
-
2908
- export type PortfolioTrendsResponseDto = {
2999
+ icon?: string;
2909
3000
  /**
2910
- * Time series data points
3001
+ * Recurring frequency
2911
3002
  */
2912
- series: Array<TimeSeriesPointDto>;
3003
+ frequency?:
3004
+ | 'WEEKLY'
3005
+ | 'BIWEEKLY'
3006
+ | 'MONTHLY'
3007
+ | 'BIMONTHLY'
3008
+ | 'QUARTERLY'
3009
+ | 'YEARLY'
3010
+ | 'CUSTOM';
2913
3011
  /**
2914
- * Period summary
3012
+ * Expected amount (positive number)
2915
3013
  */
2916
- summary: TrendSummaryDto;
3014
+ expectedAmount?: number;
2917
3015
  /**
2918
- * Period requested
3016
+ * Expected day of month (1-31)
2919
3017
  */
2920
- period: string;
3018
+ expectedDay?: number;
2921
3019
  /**
2922
- * Data granularity
3020
+ * Currency code
2923
3021
  */
2924
- granularity: string;
3022
+ currency?: string;
2925
3023
  /**
2926
- * Base currency for converted values
3024
+ * Payee matching pattern (supports wildcards)
2927
3025
  */
2928
- currency: string;
3026
+ matchPayeePattern?: string;
2929
3027
  /**
2930
- * Multi-currency time series (each point has currency breakdown)
3028
+ * Amount tolerance percentage (0-1)
2931
3029
  */
2932
- byCurrency?: Array<MultiCurrencyPointDto>;
3030
+ matchAmountTolerance?: number;
2933
3031
  /**
2934
- * Exchange rate warnings
3032
+ * Default expense account for auto-create
2935
3033
  */
2936
- warnings?: Array<ExchangeRateWarningDto>;
2937
- };
2938
-
2939
- export type CashFlowPointDto = {
3034
+ defaultExpenseAccount?: string;
2940
3035
  /**
2941
- * Month key (YYYY-MM)
3036
+ * Default payment account for auto-create
2942
3037
  */
2943
- month: string;
3038
+ defaultPaymentAccount?: string;
2944
3039
  /**
2945
- * Income in base currency (absolute, converted)
3040
+ * Default payee for auto-create
2946
3041
  */
2947
- income: string;
3042
+ defaultPayee?: string;
2948
3043
  /**
2949
- * Expense in base currency (absolute, converted)
3044
+ * Auto-create transaction when expected date arrives
2950
3045
  */
2951
- expense: string;
3046
+ autoCreate?: boolean;
2952
3047
  /**
2953
- * netSavings = income − expense (savings positive)
3048
+ * Rule end date (ISO format)
2954
3049
  */
2955
- netSavings: string;
2956
- };
2957
-
2958
- export type CashFlowTrendSummaryDto = {
3050
+ endDate?: string;
2959
3051
  /**
2960
- * Total income across the period
3052
+ * Custom interval in days
2961
3053
  */
2962
- totalIncome: string;
3054
+ customIntervalDays?: number;
2963
3055
  /**
2964
- * Total expense across the period
3056
+ * Rule active status
2965
3057
  */
2966
- totalExpense: string;
3058
+ isActive?: boolean;
3059
+ };
3060
+
3061
+ export type ExpectedTransactionRuleDto = {
2967
3062
  /**
2968
- * income − expense across the period
3063
+ * Rule name
2969
3064
  */
2970
- totalNetSavings: string;
3065
+ name: string;
2971
3066
  /**
2972
- * totalNetSavings divided by the window length (N months, incl. zero-filled)
3067
+ * Rule icon
2973
3068
  */
2974
- averageMonthlyNetSavings: string;
2975
- };
2976
-
2977
- export type CashFlowTrendsResponseDto = {
3069
+ icon?: string;
2978
3070
  /**
2979
- * Monthly cash-flow series (fixed N-month window, zero-filled)
3071
+ * Rule frequency
2980
3072
  */
2981
- series: Array<CashFlowPointDto>;
3073
+ frequency: string;
2982
3074
  /**
2983
- * Period totals
3075
+ * Currency code
2984
3076
  */
2985
- summary: CashFlowTrendSummaryDto;
3077
+ currency: string;
3078
+ };
3079
+
3080
+ export type ExpectedTransactionResponseDto = {
2986
3081
  /**
2987
- * Period requested
3082
+ * Expected transaction ID
2988
3083
  */
2989
- period: string;
3084
+ id: string;
2990
3085
  /**
2991
- * Data granularity (v1 returns month buckets)
3086
+ * User ID
2992
3087
  */
2993
- granularity: string;
3088
+ userId: string;
2994
3089
  /**
2995
- * Base currency for converted values
3090
+ * Associated rule ID
2996
3091
  */
2997
- currency: string;
3092
+ ruleId: string;
2998
3093
  /**
2999
- * Exchange rate warnings (e.g. missing rate for a currency)
3094
+ * Expected date (YYYY-MM-DD)
3000
3095
  */
3001
- warnings?: Array<ExchangeRateWarningDto>;
3002
- };
3003
-
3004
- export type GenerateSnapshotBody = unknown;
3005
-
3006
- export type GenerateSnapshotResponse = unknown;
3007
-
3008
- export type BackfillSnapshotsBody = unknown;
3009
-
3010
- export type BackfillSnapshotsResponse = unknown;
3011
-
3012
- export type DeleteOwnUserDto = {
3096
+ expectedDate: string;
3013
3097
  /**
3014
- * Access token for user verification
3098
+ * Expected amount
3015
3099
  */
3016
- accessToken: string;
3017
- };
3018
-
3019
- export type UserSettingsResponseDto = {
3100
+ expectedAmount: number;
3020
3101
  /**
3021
- * Base currency (ISO 4217) for net-worth/report aggregation. Independent of region (ADR-0006).
3102
+ * Status (PENDING, COMPLETED, SKIPPED)
3022
3103
  */
3023
- baseCurrency: string | null;
3024
- };
3025
-
3026
- export type UserResponseDto = {
3104
+ status: string;
3027
3105
  /**
3028
- * User ID
3106
+ * Matched transaction ID
3029
3107
  */
3030
- id: string;
3108
+ matchedTransactionId?: string;
3031
3109
  /**
3032
- * Assigned user role
3110
+ * Match timestamp (ISO 8601)
3033
3111
  */
3034
- role: string;
3112
+ matchedAt?: string;
3035
3113
  /**
3036
- * Permission strings
3114
+ * Match confidence score (0-1)
3037
3115
  */
3038
- permissions: Array<string>;
3116
+ matchConfidence?: number;
3039
3117
  /**
3040
- * User settings
3118
+ * Whether this expected transaction is overdue
3041
3119
  */
3042
- settings: UserSettingsResponseDto;
3043
- };
3044
-
3045
- export type SignupDto = {
3120
+ isOverdue: boolean;
3046
3121
  /**
3047
- * Cloudflare Turnstile verification token (optional when Turnstile disabled)
3122
+ * Rule information
3048
3123
  */
3049
- turnstileToken?: string;
3050
- };
3051
-
3052
- export type SignupResponseDto = {
3124
+ rule: ExpectedTransactionRuleDto;
3053
3125
  /**
3054
- * JWT auth token
3126
+ * Created at timestamp
3055
3127
  */
3056
- authToken: string;
3128
+ createdAt: string;
3057
3129
  /**
3058
- * Auto-generated access token
3130
+ * Updated at timestamp
3059
3131
  */
3060
- accessToken: string;
3132
+ updatedAt: string;
3133
+ };
3134
+
3135
+ export type ExpectedTransactionListResponseDto = {
3136
+ items: Array<ExpectedTransactionResponseDto>;
3061
3137
  /**
3062
- * Assigned user role
3138
+ * Total count
3063
3139
  */
3064
- role: 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
3140
+ total: number;
3065
3141
  };
3066
3142
 
3067
- /**
3068
- * Assigned user role
3069
- */
3070
- export type role = 'USER' | 'ADMIN' | 'DEMO' | 'INACTIVE' | 'PAID' | 'OPS';
3143
+ export type ConfirmMatchDto = {
3144
+ /**
3145
+ * Transaction ID to match with
3146
+ */
3147
+ transactionId: string;
3148
+ };
3071
3149
 
3072
- export type UpdateUserSettingDto = {
3150
+ export type EnterNowDto = {
3073
3151
  /**
3074
- * Security ID
3152
+ * Override expense account (uses rule default if not provided)
3075
3153
  */
3076
- secId?: number;
3154
+ expenseAccount?: string;
3077
3155
  /**
3078
- * Annual interest rate
3156
+ * Override payment account (uses rule default if not provided)
3079
3157
  */
3080
- annualInterestRate?: number;
3158
+ paymentAccount?: string;
3081
3159
  /**
3082
- * Currency code
3160
+ * Override amount (uses expected amount if not provided)
3083
3161
  */
3084
- currency?: string;
3162
+ amount?: number;
3085
3163
  /**
3086
- * Base currency code
3164
+ * Override payee (uses rule default if not provided)
3087
3165
  */
3088
- baseCurrency?: string;
3166
+ payee?: string;
3089
3167
  /**
3090
- * Benchmark symbol
3168
+ * Optional narration
3091
3169
  */
3092
- benchmark?: string;
3170
+ narration?: string;
3171
+ };
3172
+
3173
+ export type ForecastItemDto = {
3093
3174
  /**
3094
- * Color scheme
3175
+ * Rule name
3095
3176
  */
3096
- colorScheme?: 'DARK' | 'LIGHT';
3177
+ rule: string;
3097
3178
  /**
3098
- * Date range filter
3179
+ * Rule ID
3099
3180
  */
3100
- dateRange?: string;
3181
+ ruleId: string;
3101
3182
  /**
3102
- * Emergency fund amount
3183
+ * Expected amount
3103
3184
  */
3104
- emergencyFund?: number;
3185
+ amount: number;
3105
3186
  /**
3106
- * Account filter IDs
3187
+ * Expected date (YYYY-MM-DD)
3107
3188
  */
3108
- 'filters.accounts'?: Array<string>;
3189
+ date: string;
3109
3190
  /**
3110
- * Asset class filters
3191
+ * Rule icon emoji
3111
3192
  */
3112
- 'filters.assetClasses'?: Array<string>;
3193
+ icon: string | null;
3113
3194
  /**
3114
- * Data source filter
3195
+ * Currency code
3115
3196
  */
3116
- 'filters.dataSource'?: string;
3197
+ currency: string;
3198
+ };
3199
+
3200
+ export type MonthlyForecastDto = {
3117
3201
  /**
3118
- * Symbol filter
3202
+ * Month (YYYY-MM)
3119
3203
  */
3120
- 'filters.symbol'?: string;
3204
+ month: string;
3121
3205
  /**
3122
- * Tag filters
3206
+ * Total expected outflow for the month
3123
3207
  */
3124
- 'filters.tags'?: Array<string>;
3208
+ expectedOutflow: number;
3125
3209
  /**
3126
- * Enable experimental features
3210
+ * Number of expected transactions
3127
3211
  */
3128
- isExperimentalFeatures?: boolean;
3212
+ itemCount: number;
3129
3213
  /**
3130
- * Enable restricted view mode
3214
+ * Breakdown by currency
3131
3215
  */
3132
- isRestrictedView?: boolean;
3216
+ byCurrency: {
3217
+ [key: string]: unknown;
3218
+ };
3133
3219
  /**
3134
- * Language code
3220
+ * Individual forecast items
3135
3221
  */
3136
- language?: string;
3222
+ items: Array<ForecastItemDto>;
3223
+ };
3224
+
3225
+ export type ForecastResponseDto = {
3137
3226
  /**
3138
- * Locale code
3227
+ * Monthly forecast data
3139
3228
  */
3140
- locale?: string;
3229
+ forecast: Array<MonthlyForecastDto>;
3141
3230
  /**
3142
- * Projected total amount
3231
+ * Total expected outflow across all months
3143
3232
  */
3144
- projectedTotalAmount?: number;
3233
+ totalOutflow: number;
3145
3234
  /**
3146
- * Retirement date in ISO 8601 format
3235
+ * Total by currency across all months
3147
3236
  */
3148
- retirementDate?: string;
3237
+ totalByCurrency: {
3238
+ [key: string]: unknown;
3239
+ };
3149
3240
  /**
3150
- * Savings rate percentage
3241
+ * Number of active recurring rules included
3151
3242
  */
3152
- savingsRate?: number;
3243
+ rulesCount: number;
3153
3244
  /**
3154
- * View mode
3245
+ * Forecast period start date
3155
3246
  */
3156
- viewMode?: 'DEFAULT' | 'ZEN';
3157
- };
3158
-
3159
- /**
3160
- * Color scheme
3161
- */
3162
- export type colorScheme = 'DARK' | 'LIGHT';
3163
-
3164
- /**
3165
- * View mode
3166
- */
3167
- export type viewMode = 'DEFAULT' | 'ZEN';
3168
-
3169
- export type UpdatePropertyDto = {
3247
+ periodStart: string;
3170
3248
  /**
3171
- * Property value
3249
+ * Forecast period end date
3172
3250
  */
3173
- value: string;
3251
+ periodEnd: string;
3174
3252
  };
3175
3253
 
3176
3254
  export type CreateTransactionRuleDto = {
@@ -3489,14 +3567,14 @@ export type UpdateTransactionRuleDto = {
3489
3567
  */
3490
3568
  amountMax?: number;
3491
3569
  priority?: number;
3492
- /**
3493
- * Enable or disable the rule
3494
- */
3495
- enabled?: boolean;
3496
3570
  additionalTags?: Array<unknown[]>;
3497
3571
  additionalMetadata?: {
3498
3572
  [key: string]: unknown;
3499
3573
  };
3574
+ /**
3575
+ * Enable or disable the rule
3576
+ */
3577
+ enabled?: boolean;
3500
3578
  };
3501
3579
 
3502
3580
  export type TestRuleDto = {
@@ -4355,11 +4433,28 @@ export type ProcessNlpDto = {
4355
4433
  */
4356
4434
  selectedRuleId?: string;
4357
4435
  /**
4358
- * confirm_account echo-back: account path selected from the prior confirm_account response (suggestedAccount, similarAccounts[i], or a typed path). Applied directly when the session is confirming_account — no NL re-parse.
4436
+ * confirm_account echo-back: account path selected from the prior confirm_account response (suggestedAccount, similarAccounts[i].path, or a typed path). Applied directly when the session is confirming_account — no NL re-parse.
4359
4437
  */
4360
4438
  selectedAccount?: string;
4439
+ /**
4440
+ * Viewpoint account hint: the beancount path the user drilled into (e.g. from an account drill-down). Tie-break only — never overrides accounts resolved from the text. Must be an owned, OPEN Assets:/Liabilities: account; unresolvable hints are silently ignored.
4441
+ */
4442
+ viewpointAccount?: string;
4443
+ /**
4444
+ * Viewpoint category hint: the ADR-0075 Group segment the user drilled into (e.g. 'Food'). Resolved to a concrete OPEN account in that group; tie-break only — never overrides a category resolved from the text.
4445
+ */
4446
+ viewpointCategory?: string;
4447
+ /**
4448
+ * Companion flow root for viewpointCategory ('income' | 'expense'), mirroring the ADR-0126 list-endpoint invariant. Derived from the session's routed intent (multi-turn) when absent; a first-turn flow-less category hint is dropped — send the flow explicitly.
4449
+ */
4450
+ viewpointFlow?: 'income' | 'expense';
4361
4451
  };
4362
4452
 
4453
+ /**
4454
+ * Companion flow root for viewpointCategory ('income' | 'expense'), mirroring the ADR-0126 list-endpoint invariant. Derived from the session's routed intent (multi-turn) when absent; a first-turn flow-less category hint is dropped — send the flow explicitly.
4455
+ */
4456
+ export type viewpointFlow = 'income' | 'expense';
4457
+
4363
4458
  export type NlpTransactionInfoDto = {
4364
4459
  /**
4365
4460
  * Transaction ID
@@ -4585,6 +4680,17 @@ export type NlpRuleConfirmationDataDto = {
4585
4680
  reasons: Array<string>;
4586
4681
  };
4587
4682
 
4683
+ export type NlpAccountCandidateDto = {
4684
+ /**
4685
+ * Canonical beancount account path (echo back on selection)
4686
+ */
4687
+ path: string;
4688
+ /**
4689
+ * Localized display name (ADR-0114 read-time projection, user locale)
4690
+ */
4691
+ name: string;
4692
+ };
4693
+
4588
4694
  export type NlpAccountConfirmationDataDto = {
4589
4695
  /**
4590
4696
  * The invalid account name
@@ -4595,9 +4701,9 @@ export type NlpAccountConfirmationDataDto = {
4595
4701
  */
4596
4702
  suggestedAccount?: string;
4597
4703
  /**
4598
- * Similar accounts for user selection
4704
+ * Similar accounts for user selection (path + localized name, #680)
4599
4705
  */
4600
- similarAccounts: Array<string>;
4706
+ similarAccounts: Array<NlpAccountCandidateDto>;
4601
4707
  /**
4602
4708
  * Error message explaining the issue
4603
4709
  */
@@ -4781,7 +4887,12 @@ export type NlpResponseDto = {
4781
4887
  /**
4782
4888
  * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4783
4889
  */
4784
- assetSubType?: 'transfer' | 'banking' | 'investment';
4890
+ assetSubType?:
4891
+ | 'transfer'
4892
+ | 'banking'
4893
+ | 'investment'
4894
+ | 'lend'
4895
+ | 'lend_collect';
4785
4896
  /**
4786
4897
  * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
4787
4898
  */
@@ -4898,7 +5009,12 @@ export type intent = 'expense' | 'asset' | 'income' | 'liability' | 'equity';
4898
5009
  /**
4899
5010
  * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4900
5011
  */
4901
- export type assetSubType = 'transfer' | 'banking' | 'investment';
5012
+ export type assetSubType =
5013
+ | 'transfer'
5014
+ | 'banking'
5015
+ | 'investment'
5016
+ | 'lend'
5017
+ | 'lend_collect';
4902
5018
 
4903
5019
  /**
4904
5020
  * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
@@ -4963,7 +5079,7 @@ export type PlatformListItemDto = {
4963
5079
  /**
4964
5080
  * Platform type
4965
5081
  */
4966
- export type type3 =
5082
+ export type type4 =
4967
5083
  | 'BANK'
4968
5084
  | 'BROKERAGE'
4969
5085
  | 'CRYPTO_EXCHANGE'
@@ -5037,16 +5153,65 @@ export type PlatformMatchResponseDto = {
5037
5153
  */
5038
5154
  total: number;
5039
5155
  /**
5040
- * true when total > platforms.length (more matches exist)
5156
+ * true when total > platforms.length (more matches exist)
5157
+ */
5158
+ hasMore: boolean;
5159
+ };
5160
+
5161
+ /**
5162
+ * Overall match quality — top row's tier, or 'none' when no hits
5163
+ */
5164
+ export type matchType2 = 'none' | 'exact' | 'prefix' | 'substring';
5165
+
5166
+ export type PlatformStandardsPlatformDto = {
5167
+ /**
5168
+ * Global platform ID
5169
+ */
5170
+ id: string;
5171
+ /**
5172
+ * Platform name (e.g., "ICBC")
5173
+ */
5174
+ name: string;
5175
+ /**
5176
+ * Canonical identifier in ACCOUNT_RE format (e.g., "icbc")
5177
+ */
5178
+ canonical: string;
5179
+ /**
5180
+ * Suggested path segment — canonical PascalCased per hyphen-part, hyphens preserved (e.g. "Apple-Pay")
5181
+ */
5182
+ suggestedSegment: string;
5183
+ /**
5184
+ * Platform type
5185
+ */
5186
+ type:
5187
+ | 'BANK'
5188
+ | 'BROKERAGE'
5189
+ | 'CRYPTO_EXCHANGE'
5190
+ | 'PAYMENT'
5191
+ | 'INVESTMENT'
5192
+ | 'INSURANCE'
5193
+ | 'OTHER';
5194
+ /**
5195
+ * Region-aware category (institution vocab, e.g. DigitalWallet/Bank) resolved against the final region. null = no region-aware suggestion; fall back to type.
5196
+ */
5197
+ category: string | null;
5198
+ };
5199
+
5200
+ export type PlatformStandardsResponseDto = {
5201
+ /**
5202
+ * The selected platform (institution lock source)
5203
+ */
5204
+ platform: PlatformStandardsPlatformDto;
5205
+ /**
5206
+ * Resolved template region (ISO 3166-1 alpha-2, UPPERCASE): the platform's own countryCode when set, else the region query param. For regions without a regional template file the template list falls back to the universal-only catalog while region still echoes the code.
5207
+ */
5208
+ region: string;
5209
+ /**
5210
+ * Candidate account-standard templates of the resolved region (groupable by productCategory client-side)
5041
5211
  */
5042
- hasMore: boolean;
5212
+ templates: Array<AccountStandardResponseDto>;
5043
5213
  };
5044
5214
 
5045
- /**
5046
- * Overall match quality — top row's tier, or 'none' when no hits
5047
- */
5048
- export type matchType2 = 'none' | 'exact' | 'prefix' | 'substring';
5049
-
5050
5215
  export type CreatePlatformDto = {
5051
5216
  /**
5052
5217
  * Platform name
@@ -5243,11 +5408,11 @@ export type PlatformGroupDto = {
5243
5408
  */
5244
5409
  platformName: string;
5245
5410
  /**
5246
- * Accounts within this platform
5411
+ * Accounts within this platform (Assets and Liabilities rows, #696)
5247
5412
  */
5248
5413
  accounts: Array<AccountItemDto>;
5249
5414
  /**
5250
- * FX-converted total balance in base currency
5415
+ * FX-converted total balance in base currency (nets Assets + Liabilities rows; can be negative)
5251
5416
  */
5252
5417
  totalBalance: string;
5253
5418
  /**
@@ -5259,7 +5424,7 @@ export type PlatformGroupDto = {
5259
5424
  */
5260
5425
  convertedBalance?: string;
5261
5426
  /**
5262
- * Share of the grand converted total (0-100); 0 when grand total is 0
5427
+ * Share of the converted asset-side grand total (0-100); liability balances are excluded from the basis; 0 when grand total is 0 (#696)
5263
5428
  */
5264
5429
  sharePct: number;
5265
5430
  };
@@ -5285,7 +5450,7 @@ export type AccountExchangeRateWarningDto = {
5285
5450
 
5286
5451
  export type AccountsSummaryDto = {
5287
5452
  /**
5288
- * Total number of accounts
5453
+ * Total number of accounts (balance sheet: Assets + Liabilities, #696)
5289
5454
  */
5290
5455
  totalAccounts: number;
5291
5456
  /**
@@ -5637,9 +5802,7 @@ export type MonetaryDto = {
5637
5802
  /**
5638
5803
  * Converted to user base currency (Decimal string)
5639
5804
  */
5640
- baseCcyEquivalent?: {
5641
- [key: string]: unknown;
5642
- } | null;
5805
+ baseCcyEquivalent?: string | null;
5643
5806
  };
5644
5807
 
5645
5808
  export type CurrentPriceDto = {
@@ -5691,15 +5854,11 @@ export type HoldingPnlRowDto = {
5691
5854
  /**
5692
5855
  * Account settlement currency (ISO 4217), from cost currency
5693
5856
  */
5694
- accountCcy?: {
5695
- [key: string]: unknown;
5696
- } | null;
5857
+ accountCcy?: string | null;
5697
5858
  /**
5698
5859
  * Broker type derived from Platform.type
5699
5860
  */
5700
- brokerType?: {
5701
- [key: string]: unknown;
5702
- } | null;
5861
+ brokerType?: string | null;
5703
5862
  /**
5704
5863
  * Commodity symbol
5705
5864
  */
@@ -5709,9 +5868,7 @@ export type HoldingPnlRowDto = {
5709
5868
  */
5710
5869
  chartToken: 'equity' | 'fund' | 'bond' | 'cash' | 'other';
5711
5870
  assetClass: string;
5712
- assetSubClass?: {
5713
- [key: string]: unknown;
5714
- } | null;
5871
+ assetSubClass?: string | null;
5715
5872
  /**
5716
5873
  * Net held units (Decimal string)
5717
5874
  */
@@ -5735,15 +5892,11 @@ export type HoldingPnlRowDto = {
5735
5892
  /**
5736
5893
  * Unrealized P&L in base currency (Decimal string); null when any FX/price missing
5737
5894
  */
5738
- unrealizedPnlBase?: {
5739
- [key: string]: unknown;
5740
- } | null;
5895
+ unrealizedPnlBase?: string | null;
5741
5896
  /**
5742
5897
  * Unrealized P&L % (Decimal string)
5743
5898
  */
5744
- unrealizedPnlPct?: {
5745
- [key: string]: unknown;
5746
- } | null;
5899
+ unrealizedPnlPct?: string | null;
5747
5900
  /**
5748
5901
  * Historical FX rate applied to cost basis
5749
5902
  */
@@ -5755,9 +5908,7 @@ export type HoldingPnlRowDto = {
5755
5908
  /**
5756
5909
  * Share of invested assets % (Decimal string); only for invested chartTokens
5757
5910
  */
5758
- pctOfInvestedAssets?: {
5759
- [key: string]: unknown;
5760
- } | null;
5911
+ pctOfInvestedAssets?: string | null;
5761
5912
  /**
5762
5913
  * Cumulative realized P&L on sold lots (asOf-date cutoff); null when the method has no applicable sells, a sell lacks a price, or any required FX rate is missing (never-mix). When a sell spans multiple currencies (cross-currency sale), amount and currency reflect the base currency; baseCcyEquivalent is always the authoritative dual-FX figure
5763
5914
  */
@@ -5781,21 +5932,15 @@ export type HoldingPnlWarningDto = {
5781
5932
  | 'OVERSOLD_LOTS'
5782
5933
  | 'NO_PRICE'
5783
5934
  | 'MIXED_COST_CURRENCY';
5784
- symbol?: {
5785
- [key: string]: unknown;
5786
- } | null;
5787
- accountId?: {
5788
- [key: string]: unknown;
5789
- } | null;
5790
- currency?: {
5791
- [key: string]: unknown;
5792
- } | null;
5935
+ symbol?: string | null;
5936
+ accountId?: string | null;
5937
+ currency?: string | null;
5793
5938
  };
5794
5939
 
5795
5940
  /**
5796
5941
  * Warning type
5797
5942
  */
5798
- export type type4 =
5943
+ export type type5 =
5799
5944
  | 'MISSING_COST_FX_RATE'
5800
5945
  | 'MISSING_MARKET_FX_RATE'
5801
5946
  | 'MISSING_SALE_PRICE'
@@ -5834,132 +5979,205 @@ export type AnonymousLoginResponseDto = {
5834
5979
  authToken: string;
5835
5980
  };
5836
5981
 
5982
+ export type ParserContributionMetaDto = {
5983
+ /**
5984
+ * Institution slug (lowercase kebab-case)
5985
+ */
5986
+ institution: string;
5987
+ region:
5988
+ | 'cn'
5989
+ | 'us'
5990
+ | 'de'
5991
+ | 'fr'
5992
+ | 'gb'
5993
+ | 'hk'
5994
+ | 'jp'
5995
+ | 'sg'
5996
+ | 'au'
5997
+ | 'ca'
5998
+ | 'other';
5999
+ accountType: 'checking' | 'savings' | 'credit' | 'debit' | 'investment';
6000
+ format: 'csv' | 'xlsx' | 'pdf' | 'ofx' | 'qif';
6001
+ institutionDisplayName?: string;
6002
+ encoding?: string;
6003
+ /**
6004
+ * CSV delimiter character: ",", ";", "\t" or "|"
6005
+ */
6006
+ delimiter?: string;
6007
+ /**
6008
+ * Header row count; the client omits the field when it is 1
6009
+ */
6010
+ headerRows?: number;
6011
+ notes?: string;
6012
+ };
6013
+
6014
+ export type region =
6015
+ | 'cn'
6016
+ | 'us'
6017
+ | 'de'
6018
+ | 'fr'
6019
+ | 'gb'
6020
+ | 'hk'
6021
+ | 'jp'
6022
+ | 'sg'
6023
+ | 'au'
6024
+ | 'ca'
6025
+ | 'other';
6026
+
6027
+ export type accountType =
6028
+ | 'checking'
6029
+ | 'savings'
6030
+ | 'credit'
6031
+ | 'debit'
6032
+ | 'investment';
6033
+
6034
+ export type format = 'csv' | 'xlsx' | 'pdf' | 'ofx' | 'qif';
6035
+
6036
+ export type ParserContributionSamplesDto = {
6037
+ /**
6038
+ * Client-sanitized sample rows (key = column name, value = cell)
6039
+ */
6040
+ rows: Array<{
6041
+ [key: string]: unknown;
6042
+ }>;
6043
+ rawHeaders?: Array<string>;
6044
+ };
6045
+
6046
+ export type FieldHintDto = {
6047
+ columnName: string;
6048
+ /**
6049
+ * Date format, e.g. yyyy-MM-dd HH:mm
6050
+ */
6051
+ format?: string;
6052
+ signConvention?: 'negative-expense' | 'positive-expense' | 'separate-columns';
6053
+ creditColumn?: string;
6054
+ debitColumn?: string;
6055
+ };
6056
+
6057
+ export type signConvention =
6058
+ | 'negative-expense'
6059
+ | 'positive-expense'
6060
+ | 'separate-columns';
6061
+
6062
+ export type ParserContributionFieldHintsDto = {
6063
+ date: FieldHintDto;
6064
+ amount: FieldHintDto;
6065
+ description?: FieldHintDto;
6066
+ balance?: FieldHintDto;
6067
+ payee?: FieldHintDto;
6068
+ reference?: FieldHintDto;
6069
+ category?: FieldHintDto;
6070
+ };
6071
+
6072
+ export type ExpectedTransactionDto = {
6073
+ date: string;
6074
+ amount: number;
6075
+ description: string;
6076
+ payee?: string;
6077
+ category?: string;
6078
+ };
6079
+
6080
+ export type ParserContributionExamplesDto = {
6081
+ expectedTransactions: Array<ExpectedTransactionDto>;
6082
+ };
6083
+
6084
+ export type ParserContributionRequestDto = {
6085
+ meta: ParserContributionMetaDto;
6086
+ samples: ParserContributionSamplesDto;
6087
+ fieldHints: ParserContributionFieldHintsDto;
6088
+ /**
6089
+ * Omitted entirely by the client when empty
6090
+ */
6091
+ examples?: ParserContributionExamplesDto;
6092
+ };
6093
+
6094
+ export type ParserContributionRelayResponseDto = {
6095
+ issueUrl: string;
6096
+ issueNumber: number;
6097
+ };
6098
+
5837
6099
  export type SymbolSearchResultDto = {
5838
6100
  symbol: string;
5839
- name?: {
5840
- [key: string]: unknown;
5841
- } | null;
5842
- exchange?: {
5843
- [key: string]: unknown;
5844
- } | null;
6101
+ name?: string | null;
6102
+ exchange?: string | null;
5845
6103
  /**
5846
6104
  * OpenBB asset_type (e.g. stock, etf)
5847
6105
  */
5848
- assetType?: {
5849
- [key: string]: unknown;
5850
- } | null;
6106
+ assetType?: string | null;
5851
6107
  /**
5852
6108
  * IGN asset class (region.types.ts ASSET_CLASSES)
5853
6109
  */
5854
- assetClass?: {
5855
- [key: string]: unknown;
5856
- } | null;
6110
+ assetClass?: string | null;
5857
6111
  /**
5858
6112
  * IGN asset sub-class (region.types.ts ASSET_SUB_CLASSES)
5859
6113
  */
5860
- assetSubClass?: {
5861
- [key: string]: unknown;
5862
- } | null;
6114
+ assetSubClass?: string | null;
5863
6115
  /**
5864
6116
  * Trading currency (extra_data or inferred from exchange)
5865
6117
  */
5866
- currency?: {
5867
- [key: string]: unknown;
5868
- } | null;
6118
+ currency?: string | null;
5869
6119
  };
5870
6120
 
5871
6121
  export type SymbolQuoteDto = {
5872
6122
  symbol?: string;
5873
- name?: {
5874
- [key: string]: unknown;
5875
- } | null;
5876
- exchange?: {
5877
- [key: string]: unknown;
5878
- } | null;
6123
+ name?: string | null;
6124
+ exchange?: string | null;
5879
6125
  /**
5880
6126
  * OpenBB asset_type
5881
6127
  */
5882
- assetType?: {
5883
- [key: string]: unknown;
5884
- } | null;
6128
+ assetType?: string | null;
5885
6129
  /**
5886
6130
  * IGN asset class
5887
6131
  */
5888
- assetClass?: {
5889
- [key: string]: unknown;
5890
- } | null;
6132
+ assetClass?: string | null;
5891
6133
  /**
5892
6134
  * IGN asset sub-class
5893
6135
  */
5894
- assetSubClass?: {
5895
- [key: string]: unknown;
5896
- } | null;
6136
+ assetSubClass?: string | null;
5897
6137
  /**
5898
6138
  * Trading currency (extra_data or inferred from exchange)
5899
6139
  */
5900
- currency?: {
5901
- [key: string]: unknown;
5902
- } | null;
6140
+ currency?: string | null;
5903
6141
  /**
5904
6142
  * Latest price (Decimal string)
5905
6143
  */
5906
- price?: {
5907
- [key: string]: unknown;
5908
- } | null;
6144
+ price?: string | null;
5909
6145
  /**
5910
6146
  * Date the price was observed (ISO yyyy-MM-dd)
5911
6147
  */
5912
- priceDate?: {
5913
- [key: string]: unknown;
5914
- } | null;
6148
+ priceDate?: string | null;
5915
6149
  /**
5916
6150
  * Change vs previous close, in percentage points (1.7 == 1.7%). openbb stores change_percent as a normalized decimal; this exposes percentage points for frontend convenience.
5917
6151
  */
5918
- changePercent?: {
5919
- [key: string]: unknown;
5920
- } | null;
6152
+ changePercent?: number | null;
5921
6153
  /**
5922
6154
  * Previous close (Decimal string)
5923
6155
  */
5924
- prevClose?: {
5925
- [key: string]: unknown;
5926
- } | null;
6156
+ prevClose?: string | null;
5927
6157
  /**
5928
6158
  * Day open (Decimal string)
5929
6159
  */
5930
- open?: {
5931
- [key: string]: unknown;
5932
- } | null;
6160
+ open?: string | null;
5933
6161
  /**
5934
6162
  * Day high (Decimal string)
5935
6163
  */
5936
- high?: {
5937
- [key: string]: unknown;
5938
- } | null;
6164
+ high?: string | null;
5939
6165
  /**
5940
6166
  * Day low (Decimal string)
5941
6167
  */
5942
- low?: {
5943
- [key: string]: unknown;
5944
- } | null;
6168
+ low?: string | null;
5945
6169
  /**
5946
6170
  * Day volume (Decimal string)
5947
6171
  */
5948
- volume?: {
5949
- [key: string]: unknown;
5950
- } | null;
6172
+ volume?: string | null;
5951
6173
  /**
5952
6174
  * 52-week high (Decimal string)
5953
6175
  */
5954
- yearHigh?: {
5955
- [key: string]: unknown;
5956
- } | null;
6176
+ yearHigh?: string | null;
5957
6177
  /**
5958
6178
  * 52-week low (Decimal string)
5959
6179
  */
5960
- yearLow?: {
5961
- [key: string]: unknown;
5962
- } | null;
6180
+ yearLow?: string | null;
5963
6181
  };
5964
6182
 
5965
6183
  export type AccountControllerCreateData = {
@@ -6319,7 +6537,7 @@ export type AccountStandardsControllerGetTemplatesData = {
6319
6537
  | 'tw'
6320
6538
  | 'us';
6321
6539
  /**
6322
- * Search term for path or description
6540
+ * Search term for path, description, aliases, or localized display name
6323
6541
  */
6324
6542
  search?: string;
6325
6543
  /**
@@ -6449,7 +6667,7 @@ export type TransactionControllerListData = {
6449
6667
  */
6450
6668
  accountId?: string;
6451
6669
  /**
6452
- * Filter by ADR-0075 functional category (Group segment); matches any posting to an Expenses/Income account whose derived Group segment equals this value
6670
+ * 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).
6453
6671
  */
6454
6672
  category?: string;
6455
6673
  /**
@@ -6460,6 +6678,10 @@ export type TransactionControllerListData = {
6460
6678
  * Filter by end date (inclusive), format: YYYY-MM-DD
6461
6679
  */
6462
6680
  dateTo?: string;
6681
+ /**
6682
+ * 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.
6683
+ */
6684
+ flow?: 'income' | 'expense';
6463
6685
  /**
6464
6686
  * Number of items per page (1-100, default: 20)
6465
6687
  */
@@ -6502,9 +6724,9 @@ export type TransactionControllerListData = {
6502
6724
  */
6503
6725
  search?: string;
6504
6726
  /**
6505
- * Filter by transaction status
6727
+ * 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).
6506
6728
  */
6507
- status?: 'ACTIVE' | 'VOIDED' | 'SUPERSEDED';
6729
+ status?: 'ACTIVE' | 'VOIDED' | 'SUPERSEDED' | 'ALL';
6508
6730
  };
6509
6731
 
6510
6732
  export type TransactionControllerListResponse = TransactionListResponseDto;
@@ -7261,8 +7483,7 @@ export type PayeeProfileAdminControllerUnverifyData = {
7261
7483
  id: string;
7262
7484
  };
7263
7485
 
7264
- export type PayeeProfileAdminControllerUnverifyResponse =
7265
- PayeeProfileResponseDto;
7486
+ export type PayeeProfileAdminControllerUnverifyResponse = void;
7266
7487
 
7267
7488
  export type CommodityControllerCreateData = {
7268
7489
  /**
@@ -7526,7 +7747,168 @@ export type CommodityControllerBulkCreateData = {
7526
7747
  | 'us';
7527
7748
  };
7528
7749
 
7529
- export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
7750
+ export type CommodityControllerBulkCreateResponse = Array<CommodityResponseDto>;
7751
+
7752
+ export type ReportingControllerGetPortfolioTrendsData = {
7753
+ /**
7754
+ * Data granularity
7755
+ */
7756
+ granularity?: 'day' | 'week' | 'month';
7757
+ /**
7758
+ * Time period
7759
+ */
7760
+ period?: '1m' | '3m' | '6m' | '1y';
7761
+ /**
7762
+ * Region code for tenant context
7763
+ */
7764
+ region:
7765
+ | 'ad'
7766
+ | 'ae'
7767
+ | 'af'
7768
+ | 'ag'
7769
+ | 'al'
7770
+ | 'am'
7771
+ | 'ao'
7772
+ | 'au'
7773
+ | 'br'
7774
+ | 'ca'
7775
+ | 'cn'
7776
+ | 'de'
7777
+ | 'dz'
7778
+ | 'es'
7779
+ | 'fr'
7780
+ | 'gb'
7781
+ | 'hk'
7782
+ | 'in'
7783
+ | 'it'
7784
+ | 'jp'
7785
+ | 'kr'
7786
+ | 'nl'
7787
+ | 'sg'
7788
+ | 'tw'
7789
+ | 'us';
7790
+ };
7791
+
7792
+ export type ReportingControllerGetPortfolioTrendsResponse =
7793
+ PortfolioTrendsResponseDto;
7794
+
7795
+ export type ReportingControllerGetCashFlowTrendsData = {
7796
+ /**
7797
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
7798
+ */
7799
+ granularity?: 'day' | 'week' | 'month';
7800
+ /**
7801
+ * Time period
7802
+ */
7803
+ period?: '1m' | '3m' | '6m' | '1y';
7804
+ /**
7805
+ * Region code for tenant context
7806
+ */
7807
+ region:
7808
+ | 'ad'
7809
+ | 'ae'
7810
+ | 'af'
7811
+ | 'ag'
7812
+ | 'al'
7813
+ | 'am'
7814
+ | 'ao'
7815
+ | 'au'
7816
+ | 'br'
7817
+ | 'ca'
7818
+ | 'cn'
7819
+ | 'de'
7820
+ | 'dz'
7821
+ | 'es'
7822
+ | 'fr'
7823
+ | 'gb'
7824
+ | 'hk'
7825
+ | 'in'
7826
+ | 'it'
7827
+ | 'jp'
7828
+ | 'kr'
7829
+ | 'nl'
7830
+ | 'sg'
7831
+ | 'tw'
7832
+ | 'us';
7833
+ };
7834
+
7835
+ export type ReportingControllerGetCashFlowTrendsResponse =
7836
+ CashFlowTrendsResponseDto;
7837
+
7838
+ export type ReportingControllerGenerateSnapshotData = {
7839
+ /**
7840
+ * Region code for tenant context
7841
+ */
7842
+ region:
7843
+ | 'ad'
7844
+ | 'ae'
7845
+ | 'af'
7846
+ | 'ag'
7847
+ | 'al'
7848
+ | 'am'
7849
+ | 'ao'
7850
+ | 'au'
7851
+ | 'br'
7852
+ | 'ca'
7853
+ | 'cn'
7854
+ | 'de'
7855
+ | 'dz'
7856
+ | 'es'
7857
+ | 'fr'
7858
+ | 'gb'
7859
+ | 'hk'
7860
+ | 'in'
7861
+ | 'it'
7862
+ | 'jp'
7863
+ | 'kr'
7864
+ | 'nl'
7865
+ | 'sg'
7866
+ | 'tw'
7867
+ | 'us';
7868
+ /**
7869
+ * Optional date (defaults to today)
7870
+ */
7871
+ requestBody: GenerateSnapshotBody;
7872
+ };
7873
+
7874
+ export type ReportingControllerGenerateSnapshotResponse =
7875
+ GenerateSnapshotResponse;
7876
+
7877
+ export type ReportingControllerBackfillSnapshotsData = {
7878
+ /**
7879
+ * Region code for tenant context
7880
+ */
7881
+ region:
7882
+ | 'ad'
7883
+ | 'ae'
7884
+ | 'af'
7885
+ | 'ag'
7886
+ | 'al'
7887
+ | 'am'
7888
+ | 'ao'
7889
+ | 'au'
7890
+ | 'br'
7891
+ | 'ca'
7892
+ | 'cn'
7893
+ | 'de'
7894
+ | 'dz'
7895
+ | 'es'
7896
+ | 'fr'
7897
+ | 'gb'
7898
+ | 'hk'
7899
+ | 'in'
7900
+ | 'it'
7901
+ | 'jp'
7902
+ | 'kr'
7903
+ | 'nl'
7904
+ | 'sg'
7905
+ | 'tw'
7906
+ | 'us';
7907
+ requestBody: BackfillSnapshotsBody;
7908
+ };
7909
+
7910
+ export type ReportingControllerBackfillSnapshotsResponse =
7911
+ BackfillSnapshotsResponse;
7530
7912
 
7531
7913
  export type PriceControllerCreateData = {
7532
7914
  /**
@@ -7775,6 +8157,93 @@ export type PriceControllerBulkCreateData = {
7775
8157
 
7776
8158
  export type PriceControllerBulkCreateResponse = Array<PriceResponseDto>;
7777
8159
 
8160
+ export type UserControllerDeleteOwnUserData = {
8161
+ requestBody: DeleteOwnUserDto;
8162
+ };
8163
+
8164
+ export type UserControllerDeleteOwnUserResponse = void;
8165
+
8166
+ export type UserControllerGetUserData = {
8167
+ acceptLanguage: string;
8168
+ };
8169
+
8170
+ export type UserControllerGetUserResponse = UserResponseDto;
8171
+
8172
+ export type UserControllerSignupUserData = {
8173
+ requestBody: SignupDto;
8174
+ };
8175
+
8176
+ export type UserControllerSignupUserResponse = SignupResponseDto;
8177
+
8178
+ export type UserControllerDeleteUserData = {
8179
+ /**
8180
+ * User ID to delete
8181
+ */
8182
+ id: string;
8183
+ };
8184
+
8185
+ export type UserControllerDeleteUserResponse = void;
8186
+
8187
+ export type UserControllerGetUserInfoData = {
8188
+ /**
8189
+ * User ID
8190
+ */
8191
+ id: string;
8192
+ };
8193
+
8194
+ export type UserControllerGetUserInfoResponse = unknown;
8195
+
8196
+ export type UserControllerUpdateUserSettingData = {
8197
+ requestBody: UpdateUserSettingDto;
8198
+ };
8199
+
8200
+ export type UserControllerUpdateUserSettingResponse = unknown;
8201
+
8202
+ export type UserControllerGetAllUserSettingsByPageData = {
8203
+ /**
8204
+ * Page number
8205
+ */
8206
+ pageNo: number;
8207
+ /**
8208
+ * Page size
8209
+ */
8210
+ pageSize: number;
8211
+ };
8212
+
8213
+ export type UserControllerGetAllUserSettingsByPageResponse = unknown;
8214
+
8215
+ export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
8216
+
8217
+ export type PropertyControllerGetAllResponse = unknown;
8218
+
8219
+ export type PropertyControllerGetByKeyData = {
8220
+ /**
8221
+ * Property key
8222
+ */
8223
+ key: string;
8224
+ };
8225
+
8226
+ export type PropertyControllerGetByKeyResponse = unknown;
8227
+
8228
+ export type PropertyControllerUpdateData = {
8229
+ /**
8230
+ * Property key
8231
+ */
8232
+ key: string;
8233
+ requestBody: UpdatePropertyDto;
8234
+ };
8235
+
8236
+ export type PropertyControllerUpdateResponse = unknown;
8237
+
8238
+ export type PropertyControllerDeleteData = {
8239
+ /**
8240
+ * Property key
8241
+ */
8242
+ key: string;
8243
+ };
8244
+
8245
+ export type PropertyControllerDeleteResponse = void;
8246
+
7778
8247
  export type RecurringRuleControllerCreateData = {
7779
8248
  /**
7780
8249
  * Region code for tenant context
@@ -8251,8 +8720,7 @@ export type ExpectedTransactionControllerUndoSkipData = {
8251
8720
  | 'us';
8252
8721
  };
8253
8722
 
8254
- export type ExpectedTransactionControllerUndoSkipResponse =
8255
- ExpectedTransactionResponseDto;
8723
+ export type ExpectedTransactionControllerUndoSkipResponse = void;
8256
8724
 
8257
8725
  export type ExpectedTransactionControllerConfirmMatchData = {
8258
8726
  /**
@@ -8329,7 +8797,7 @@ export type ExpectedTransactionControllerUnmatchData = {
8329
8797
  | 'us';
8330
8798
  };
8331
8799
 
8332
- export type ExpectedTransactionControllerUnmatchResponse = unknown;
8800
+ export type ExpectedTransactionControllerUnmatchResponse = void;
8333
8801
 
8334
8802
  export type ExpectedTransactionControllerEnterNowData = {
8335
8803
  /**
@@ -8368,172 +8836,13 @@ export type ExpectedTransactionControllerEnterNowData = {
8368
8836
  requestBody: EnterNowDto;
8369
8837
  };
8370
8838
 
8371
- export type ExpectedTransactionControllerEnterNowResponse = unknown;
8372
-
8373
- export type ForecastControllerGetForecastData = {
8374
- /**
8375
- * Number of months to forecast (1-12, default 3)
8376
- */
8377
- months?: number;
8378
- /**
8379
- * Region code for tenant context
8380
- */
8381
- region:
8382
- | 'ad'
8383
- | 'ae'
8384
- | 'af'
8385
- | 'ag'
8386
- | 'al'
8387
- | 'am'
8388
- | 'ao'
8389
- | 'au'
8390
- | 'br'
8391
- | 'ca'
8392
- | 'cn'
8393
- | 'de'
8394
- | 'dz'
8395
- | 'es'
8396
- | 'fr'
8397
- | 'gb'
8398
- | 'hk'
8399
- | 'in'
8400
- | 'it'
8401
- | 'jp'
8402
- | 'kr'
8403
- | 'nl'
8404
- | 'sg'
8405
- | 'tw'
8406
- | 'us';
8407
- };
8408
-
8409
- export type ForecastControllerGetForecastResponse = ForecastResponseDto;
8410
-
8411
- export type ReportingControllerGetPortfolioTrendsData = {
8412
- /**
8413
- * Data granularity
8414
- */
8415
- granularity?: 'day' | 'week' | 'month';
8416
- /**
8417
- * Time period
8418
- */
8419
- period?: '1m' | '3m' | '6m' | '1y';
8420
- /**
8421
- * Region code for tenant context
8422
- */
8423
- region:
8424
- | 'ad'
8425
- | 'ae'
8426
- | 'af'
8427
- | 'ag'
8428
- | 'al'
8429
- | 'am'
8430
- | 'ao'
8431
- | 'au'
8432
- | 'br'
8433
- | 'ca'
8434
- | 'cn'
8435
- | 'de'
8436
- | 'dz'
8437
- | 'es'
8438
- | 'fr'
8439
- | 'gb'
8440
- | 'hk'
8441
- | 'in'
8442
- | 'it'
8443
- | 'jp'
8444
- | 'kr'
8445
- | 'nl'
8446
- | 'sg'
8447
- | 'tw'
8448
- | 'us';
8449
- };
8450
-
8451
- export type ReportingControllerGetPortfolioTrendsResponse =
8452
- PortfolioTrendsResponseDto;
8453
-
8454
- export type ReportingControllerGetCashFlowTrendsData = {
8455
- /**
8456
- * Data granularity (accepted for API symmetry; v1 returns month buckets)
8457
- */
8458
- granularity?: 'day' | 'week' | 'month';
8459
- /**
8460
- * Time period
8461
- */
8462
- period?: '1m' | '3m' | '6m' | '1y';
8463
- /**
8464
- * Region code for tenant context
8465
- */
8466
- region:
8467
- | 'ad'
8468
- | 'ae'
8469
- | 'af'
8470
- | 'ag'
8471
- | 'al'
8472
- | 'am'
8473
- | 'ao'
8474
- | 'au'
8475
- | 'br'
8476
- | 'ca'
8477
- | 'cn'
8478
- | 'de'
8479
- | 'dz'
8480
- | 'es'
8481
- | 'fr'
8482
- | 'gb'
8483
- | 'hk'
8484
- | 'in'
8485
- | 'it'
8486
- | 'jp'
8487
- | 'kr'
8488
- | 'nl'
8489
- | 'sg'
8490
- | 'tw'
8491
- | 'us';
8492
- };
8493
-
8494
- export type ReportingControllerGetCashFlowTrendsResponse =
8495
- CashFlowTrendsResponseDto;
8496
-
8497
- export type ReportingControllerGenerateSnapshotData = {
8498
- /**
8499
- * Region code for tenant context
8500
- */
8501
- region:
8502
- | 'ad'
8503
- | 'ae'
8504
- | 'af'
8505
- | 'ag'
8506
- | 'al'
8507
- | 'am'
8508
- | 'ao'
8509
- | 'au'
8510
- | 'br'
8511
- | 'ca'
8512
- | 'cn'
8513
- | 'de'
8514
- | 'dz'
8515
- | 'es'
8516
- | 'fr'
8517
- | 'gb'
8518
- | 'hk'
8519
- | 'in'
8520
- | 'it'
8521
- | 'jp'
8522
- | 'kr'
8523
- | 'nl'
8524
- | 'sg'
8525
- | 'tw'
8526
- | 'us';
8527
- /**
8528
- * Optional date (defaults to today)
8529
- */
8530
- requestBody: GenerateSnapshotBody;
8531
- };
8532
-
8533
- export type ReportingControllerGenerateSnapshotResponse =
8534
- GenerateSnapshotResponse;
8535
-
8536
- export type ReportingControllerBackfillSnapshotsData = {
8839
+ export type ExpectedTransactionControllerEnterNowResponse = unknown;
8840
+
8841
+ export type ForecastControllerGetForecastData = {
8842
+ /**
8843
+ * Number of months to forecast (1-12, default 3)
8844
+ */
8845
+ months?: number;
8537
8846
  /**
8538
8847
  * Region code for tenant context
8539
8848
  */
@@ -8563,98 +8872,9 @@ export type ReportingControllerBackfillSnapshotsData = {
8563
8872
  | 'sg'
8564
8873
  | 'tw'
8565
8874
  | 'us';
8566
- requestBody: BackfillSnapshotsBody;
8567
- };
8568
-
8569
- export type ReportingControllerBackfillSnapshotsResponse =
8570
- BackfillSnapshotsResponse;
8571
-
8572
- export type UserControllerDeleteOwnUserData = {
8573
- requestBody: DeleteOwnUserDto;
8574
- };
8575
-
8576
- export type UserControllerDeleteOwnUserResponse = void;
8577
-
8578
- export type UserControllerGetUserData = {
8579
- acceptLanguage: string;
8580
- };
8581
-
8582
- export type UserControllerGetUserResponse = UserResponseDto;
8583
-
8584
- export type UserControllerSignupUserData = {
8585
- requestBody: SignupDto;
8586
- };
8587
-
8588
- export type UserControllerSignupUserResponse = SignupResponseDto;
8589
-
8590
- export type UserControllerDeleteUserData = {
8591
- /**
8592
- * User ID to delete
8593
- */
8594
- id: string;
8595
- };
8596
-
8597
- export type UserControllerDeleteUserResponse = void;
8598
-
8599
- export type UserControllerGetUserInfoData = {
8600
- /**
8601
- * User ID
8602
- */
8603
- id: string;
8604
- };
8605
-
8606
- export type UserControllerGetUserInfoResponse = unknown;
8607
-
8608
- export type UserControllerUpdateUserSettingData = {
8609
- requestBody: UpdateUserSettingDto;
8610
- };
8611
-
8612
- export type UserControllerUpdateUserSettingResponse = unknown;
8613
-
8614
- export type UserControllerGetAllUserSettingsByPageData = {
8615
- /**
8616
- * Page number
8617
- */
8618
- pageNo: number;
8619
- /**
8620
- * Page size
8621
- */
8622
- pageSize: number;
8623
- };
8624
-
8625
- export type UserControllerGetAllUserSettingsByPageResponse = unknown;
8626
-
8627
- export type UserControllerGetAssetLiabilitySummaryResponse = unknown;
8628
-
8629
- export type PropertyControllerGetAllResponse = unknown;
8630
-
8631
- export type PropertyControllerGetByKeyData = {
8632
- /**
8633
- * Property key
8634
- */
8635
- key: string;
8636
- };
8637
-
8638
- export type PropertyControllerGetByKeyResponse = unknown;
8639
-
8640
- export type PropertyControllerUpdateData = {
8641
- /**
8642
- * Property key
8643
- */
8644
- key: string;
8645
- requestBody: UpdatePropertyDto;
8646
- };
8647
-
8648
- export type PropertyControllerUpdateResponse = unknown;
8649
-
8650
- export type PropertyControllerDeleteData = {
8651
- /**
8652
- * Property key
8653
- */
8654
- key: string;
8655
8875
  };
8656
8876
 
8657
- export type PropertyControllerDeleteResponse = void;
8877
+ export type ForecastControllerGetForecastResponse = ForecastResponseDto;
8658
8878
 
8659
8879
  export type TransactionRuleControllerCreateData = {
8660
8880
  /**
@@ -9528,7 +9748,7 @@ export type ReconciliationControllerHistoryData = {
9528
9748
  export type ReconciliationControllerHistoryResponse =
9529
9749
  Array<ReconciliationRecordDto>;
9530
9750
 
9531
- export type ExportControllerExportBeancountResponse = unknown;
9751
+ export type ExportControllerExportBeancountResponse = Blob | File;
9532
9752
 
9533
9753
  export type FileImportControllerImportFileData = {
9534
9754
  /**
@@ -10286,6 +10506,24 @@ export type PlatformControllerMatchPlatformsData = {
10286
10506
 
10287
10507
  export type PlatformControllerMatchPlatformsResponse = PlatformMatchResponseDto;
10288
10508
 
10509
+ export type PlatformControllerGetPlatformStandardsData = {
10510
+ /**
10511
+ * Platform ID (from a match result)
10512
+ */
10513
+ id: string;
10514
+ /**
10515
+ * 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.
10516
+ */
10517
+ region?: string;
10518
+ /**
10519
+ * Filter templates by account type (path first segment)
10520
+ */
10521
+ type?: 'Assets' | 'Liabilities' | 'Income' | 'Expenses' | 'Equity';
10522
+ };
10523
+
10524
+ export type PlatformControllerGetPlatformStandardsResponse =
10525
+ PlatformStandardsResponseDto;
10526
+
10289
10527
  export type PlatformControllerUpdateData = {
10290
10528
  /**
10291
10529
  * Platform ID
@@ -10535,6 +10773,42 @@ export type AuthControllerAccessTokenLoginData = {
10535
10773
 
10536
10774
  export type AuthControllerAccessTokenLoginResponse = AnonymousLoginResponseDto;
10537
10775
 
10776
+ export type ParserContributionControllerCreateData = {
10777
+ /**
10778
+ * Region code for tenant context (routing only; the institution region rides in the payload meta)
10779
+ */
10780
+ region:
10781
+ | 'ad'
10782
+ | 'ae'
10783
+ | 'af'
10784
+ | 'ag'
10785
+ | 'al'
10786
+ | 'am'
10787
+ | 'ao'
10788
+ | 'au'
10789
+ | 'br'
10790
+ | 'ca'
10791
+ | 'cn'
10792
+ | 'de'
10793
+ | 'dz'
10794
+ | 'es'
10795
+ | 'fr'
10796
+ | 'gb'
10797
+ | 'hk'
10798
+ | 'in'
10799
+ | 'it'
10800
+ | 'jp'
10801
+ | 'kr'
10802
+ | 'nl'
10803
+ | 'sg'
10804
+ | 'tw'
10805
+ | 'us';
10806
+ requestBody: ParserContributionRequestDto;
10807
+ };
10808
+
10809
+ export type ParserContributionControllerCreateResponse =
10810
+ ParserContributionRelayResponseDto;
10811
+
10538
10812
  export type CacheControllerFlushCacheResponse = unknown;
10539
10813
 
10540
10814
  export type ExchangeRateControllerGetExchangeRateData = {
@@ -11228,7 +11502,7 @@ export type $OpenApiTs = {
11228
11502
  /**
11229
11503
  * Payee profile unverified successfully
11230
11504
  */
11231
- 200: PayeeProfileResponseDto;
11505
+ 204: void;
11232
11506
  /**
11233
11507
  * Admin access required
11234
11508
  */
@@ -11335,598 +11609,598 @@ export type $OpenApiTs = {
11335
11609
  };
11336
11610
  };
11337
11611
  };
11338
- '/api/v1/{region}/bean/prices': {
11339
- post: {
11340
- req: PriceControllerCreateData;
11612
+ '/api/v1/{region}/reporting/portfolio/trends': {
11613
+ get: {
11614
+ req: ReportingControllerGetPortfolioTrendsData;
11341
11615
  res: {
11342
11616
  /**
11343
- * Price created successfully
11344
- */
11345
- 201: PriceResponseDto;
11346
- /**
11347
- * Currency or quoteCurrency commodity not found
11348
- */
11349
- 404: unknown;
11350
- /**
11351
- * Price already exists for this currency pair and date
11617
+ * Trends retrieved successfully
11352
11618
  */
11353
- 409: unknown;
11354
- };
11355
- };
11356
- get: {
11357
- req: PriceControllerFindAllData;
11358
- res: {
11619
+ 200: PortfolioTrendsResponseDto;
11359
11620
  /**
11360
- * Prices retrieved successfully
11621
+ * User not authenticated
11361
11622
  */
11362
- 200: PriceListResponseDto;
11623
+ 401: unknown;
11363
11624
  };
11364
11625
  };
11365
11626
  };
11366
- '/api/v1/{region}/bean/prices/{id}': {
11627
+ '/api/v1/{region}/reporting/cash-flow/trends': {
11367
11628
  get: {
11368
- req: PriceControllerFindOneData;
11369
- res: {
11370
- /**
11371
- * Price retrieved successfully
11372
- */
11373
- 200: PriceResponseDto;
11374
- /**
11375
- * Price not found
11376
- */
11377
- 404: unknown;
11378
- };
11379
- };
11380
- put: {
11381
- req: PriceControllerUpdateData;
11629
+ req: ReportingControllerGetCashFlowTrendsData;
11382
11630
  res: {
11383
11631
  /**
11384
- * Price updated successfully
11385
- */
11386
- 200: PriceResponseDto;
11387
- /**
11388
- * Price not found
11632
+ * Cash-flow trends retrieved successfully
11389
11633
  */
11390
- 404: unknown;
11634
+ 200: CashFlowTrendsResponseDto;
11391
11635
  /**
11392
- * Updated price conflicts with existing price
11636
+ * User not authenticated
11393
11637
  */
11394
- 409: unknown;
11638
+ 401: unknown;
11395
11639
  };
11396
11640
  };
11397
- delete: {
11398
- req: PriceControllerDeleteData;
11641
+ };
11642
+ '/api/v1/{region}/reporting/snapshots/generate': {
11643
+ post: {
11644
+ req: ReportingControllerGenerateSnapshotData;
11399
11645
  res: {
11400
11646
  /**
11401
- * Price deleted successfully
11647
+ * Snapshot generated successfully
11402
11648
  */
11403
- 204: void;
11649
+ 200: GenerateSnapshotResponse;
11404
11650
  /**
11405
- * Price not found
11651
+ * Invalid date format
11406
11652
  */
11407
- 404: unknown;
11408
- };
11409
- };
11410
- };
11411
- '/api/v1/{region}/bean/prices/bulk': {
11412
- post: {
11413
- req: PriceControllerBulkCreateData;
11414
- res: {
11653
+ 400: unknown;
11415
11654
  /**
11416
- * Prices created successfully
11655
+ * User not authenticated
11417
11656
  */
11418
- 201: Array<PriceResponseDto>;
11657
+ 401: unknown;
11419
11658
  };
11420
11659
  };
11421
11660
  };
11422
- '/api/v1/{region}/bean/recurring-rules': {
11661
+ '/api/v1/{region}/reporting/snapshots/backfill': {
11423
11662
  post: {
11424
- req: RecurringRuleControllerCreateData;
11663
+ req: ReportingControllerBackfillSnapshotsData;
11425
11664
  res: {
11426
11665
  /**
11427
- * Rule created successfully
11666
+ * Backfill completed successfully
11428
11667
  */
11429
- 201: RecurringRuleResponseDto;
11668
+ 200: BackfillSnapshotsResponse;
11430
11669
  /**
11431
- * Invalid input data (e.g., autoCreate without accounts)
11670
+ * Invalid date format or range
11432
11671
  */
11433
11672
  400: unknown;
11434
11673
  /**
11435
- * Rule with same name already exists
11674
+ * User not authenticated
11436
11675
  */
11437
- 409: unknown;
11438
- };
11439
- };
11440
- get: {
11441
- req: RecurringRuleControllerFindAllData;
11442
- res: {
11676
+ 401: unknown;
11443
11677
  /**
11444
- * Rules retrieved successfully
11678
+ * Backfill already in progress for this user
11445
11679
  */
11446
- 200: Array<RecurringRuleResponseDto>;
11680
+ 409: unknown;
11447
11681
  };
11448
11682
  };
11449
11683
  };
11450
- '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}': {
11684
+ '/api/v1/{region}/bean/prices': {
11451
11685
  post: {
11452
- req: RecurringRuleControllerCreateFromTransactionData;
11686
+ req: PriceControllerCreateData;
11453
11687
  res: {
11454
11688
  /**
11455
- * Rule created successfully
11689
+ * Price created successfully
11690
+ */
11691
+ 201: PriceResponseDto;
11692
+ /**
11693
+ * Currency or quoteCurrency commodity not found
11456
11694
  */
11457
- 201: RecurringRuleResponseDto;
11695
+ 404: unknown;
11458
11696
  /**
11459
- * Transaction not found
11697
+ * Price already exists for this currency pair and date
11460
11698
  */
11461
- 404: ApiProblemResponseDto;
11699
+ 409: unknown;
11700
+ };
11701
+ };
11702
+ get: {
11703
+ req: PriceControllerFindAllData;
11704
+ res: {
11462
11705
  /**
11463
- * Rule with same name already exists or transaction already linked
11706
+ * Prices retrieved successfully
11464
11707
  */
11465
- 409: ApiProblemResponseDto;
11708
+ 200: PriceListResponseDto;
11466
11709
  };
11467
11710
  };
11468
11711
  };
11469
- '/api/v1/{region}/bean/recurring-rules/{id}': {
11712
+ '/api/v1/{region}/bean/prices/{id}': {
11470
11713
  get: {
11471
- req: RecurringRuleControllerFindOneData;
11714
+ req: PriceControllerFindOneData;
11472
11715
  res: {
11473
11716
  /**
11474
- * Rule retrieved successfully
11717
+ * Price retrieved successfully
11475
11718
  */
11476
- 200: RecurringRuleResponseDto;
11719
+ 200: PriceResponseDto;
11477
11720
  /**
11478
- * Rule not found
11721
+ * Price not found
11479
11722
  */
11480
11723
  404: unknown;
11481
11724
  };
11482
11725
  };
11483
- patch: {
11484
- req: RecurringRuleControllerUpdateData;
11726
+ put: {
11727
+ req: PriceControllerUpdateData;
11485
11728
  res: {
11486
11729
  /**
11487
- * Rule updated successfully
11730
+ * Price updated successfully
11488
11731
  */
11489
- 200: RecurringRuleResponseDto;
11732
+ 200: PriceResponseDto;
11490
11733
  /**
11491
- * Invalid input data
11734
+ * Price not found
11492
11735
  */
11493
- 400: unknown;
11736
+ 404: unknown;
11494
11737
  /**
11495
- * Rule not found
11738
+ * Updated price conflicts with existing price
11496
11739
  */
11497
- 404: unknown;
11740
+ 409: unknown;
11498
11741
  };
11499
11742
  };
11500
11743
  delete: {
11501
- req: RecurringRuleControllerDeleteData;
11744
+ req: PriceControllerDeleteData;
11502
11745
  res: {
11503
11746
  /**
11504
- * Rule deleted successfully
11747
+ * Price deleted successfully
11505
11748
  */
11506
11749
  204: void;
11507
11750
  /**
11508
- * Rule not found
11751
+ * Price not found
11509
11752
  */
11510
11753
  404: unknown;
11511
11754
  };
11512
11755
  };
11513
11756
  };
11514
- '/api/v1/{region}/bean/recurring-rules/{id}/stats': {
11515
- get: {
11516
- req: RecurringRuleControllerGetWithStatsData;
11757
+ '/api/v1/{region}/bean/prices/bulk': {
11758
+ post: {
11759
+ req: PriceControllerBulkCreateData;
11517
11760
  res: {
11518
11761
  /**
11519
- * Rule with stats retrieved successfully
11520
- */
11521
- 200: RecurringRuleWithStatsResponseDto;
11522
- /**
11523
- * Rule not found
11762
+ * Prices created successfully
11524
11763
  */
11525
- 404: unknown;
11764
+ 201: Array<PriceResponseDto>;
11526
11765
  };
11527
11766
  };
11528
11767
  };
11529
- '/api/v1/{region}/bean/expected-transactions': {
11530
- get: {
11531
- req: ExpectedTransactionControllerFindAllData;
11768
+ '/api/v1/users': {
11769
+ delete: {
11770
+ req: UserControllerDeleteOwnUserData;
11532
11771
  res: {
11533
11772
  /**
11534
- * Expected transactions retrieved successfully
11773
+ * User deleted successfully
11535
11774
  */
11536
- 200: ExpectedTransactionListResponseDto;
11537
- };
11538
- };
11539
- };
11540
- '/api/v1/{region}/bean/expected-transactions/overdue': {
11541
- get: {
11542
- req: ExpectedTransactionControllerFindOverdueData;
11543
- res: {
11775
+ 204: void;
11544
11776
  /**
11545
- * Overdue transactions retrieved successfully
11777
+ * Invalid access token
11546
11778
  */
11547
- 200: ExpectedTransactionListResponseDto;
11779
+ 403: unknown;
11548
11780
  };
11549
11781
  };
11550
- };
11551
- '/api/v1/{region}/bean/expected-transactions/{id}': {
11552
11782
  get: {
11553
- req: ExpectedTransactionControllerFindOneData;
11783
+ req: UserControllerGetUserData;
11554
11784
  res: {
11555
11785
  /**
11556
- * Expected transaction retrieved successfully
11557
- */
11558
- 200: ExpectedTransactionResponseDto;
11559
- /**
11560
- * Expected transaction not found
11786
+ * User retrieved successfully
11561
11787
  */
11562
- 404: unknown;
11788
+ 200: UserResponseDto;
11563
11789
  };
11564
11790
  };
11565
- };
11566
- '/api/v1/{region}/bean/expected-transactions/{id}/skip': {
11567
11791
  post: {
11568
- req: ExpectedTransactionControllerSkipData;
11792
+ req: UserControllerSignupUserData;
11569
11793
  res: {
11570
11794
  /**
11571
- * Expected transaction skipped successfully
11795
+ * User created successfully
11572
11796
  */
11573
- 200: ExpectedTransactionResponseDto;
11797
+ 201: SignupResponseDto;
11574
11798
  /**
11575
- * Cannot skip - not in PENDING status
11799
+ * Invalid Turnstile token (when Turnstile is enabled)
11576
11800
  */
11577
11801
  400: unknown;
11578
11802
  /**
11579
- * Expected transaction not found
11803
+ * User signup is disabled
11580
11804
  */
11581
- 404: unknown;
11805
+ 403: unknown;
11582
11806
  };
11583
11807
  };
11808
+ };
11809
+ '/api/v1/users/{id}': {
11584
11810
  delete: {
11585
- req: ExpectedTransactionControllerUndoSkipData;
11811
+ req: UserControllerDeleteUserData;
11586
11812
  res: {
11587
11813
  /**
11588
- * Skip undone successfully
11589
- */
11590
- 200: ExpectedTransactionResponseDto;
11591
- /**
11592
- * Cannot undo - not in SKIPPED status
11814
+ * User deleted successfully
11593
11815
  */
11594
- 400: unknown;
11816
+ 204: void;
11595
11817
  /**
11596
- * Expected transaction not found
11818
+ * Cannot delete own account or insufficient permissions
11597
11819
  */
11598
- 404: unknown;
11820
+ 403: unknown;
11599
11821
  };
11600
11822
  };
11601
11823
  };
11602
- '/api/v1/{region}/bean/expected-transactions/{id}/match': {
11603
- post: {
11604
- req: ExpectedTransactionControllerConfirmMatchData;
11824
+ '/api/v1/users/{id}/info': {
11825
+ get: {
11826
+ req: UserControllerGetUserInfoData;
11605
11827
  res: {
11606
11828
  /**
11607
- * Match confirmed successfully
11829
+ * User info retrieved successfully
11608
11830
  */
11609
11831
  200: unknown;
11610
11832
  /**
11611
- * Cannot match - not in PENDING status
11612
- */
11613
- 400: unknown;
11614
- /**
11615
- * Expected or actual transaction not found
11616
- */
11617
- 404: unknown;
11618
- /**
11619
- * Actual transaction already matched to another rule
11833
+ * Cannot access other user info without admin permission
11620
11834
  */
11621
- 409: unknown;
11835
+ 403: unknown;
11622
11836
  };
11623
11837
  };
11624
- delete: {
11625
- req: ExpectedTransactionControllerUnmatchData;
11838
+ };
11839
+ '/api/v1/users/setting': {
11840
+ put: {
11841
+ req: UserControllerUpdateUserSettingData;
11626
11842
  res: {
11627
11843
  /**
11628
- * Match removed successfully
11844
+ * Settings updated successfully
11629
11845
  */
11630
11846
  200: unknown;
11631
11847
  /**
11632
- * Cannot unmatch - not in COMPLETED status
11633
- */
11634
- 400: unknown;
11635
- /**
11636
- * Expected transaction not found
11848
+ * Insufficient permissions
11637
11849
  */
11638
- 404: unknown;
11850
+ 403: unknown;
11639
11851
  };
11640
11852
  };
11641
11853
  };
11642
- '/api/v1/{region}/bean/expected-transactions/{id}/enter': {
11643
- post: {
11644
- req: ExpectedTransactionControllerEnterNowData;
11854
+ '/api/v1/users/settings-by-page': {
11855
+ get: {
11856
+ req: UserControllerGetAllUserSettingsByPageData;
11645
11857
  res: {
11646
11858
  /**
11647
- * Transaction created successfully
11648
- */
11649
- 201: unknown;
11650
- /**
11651
- * Cannot enter - not in PENDING status or missing accounts
11652
- */
11653
- 400: unknown;
11654
- /**
11655
- * Expected transaction or accounts not found
11859
+ * Settings list retrieved successfully
11656
11860
  */
11657
- 404: unknown;
11861
+ 200: unknown;
11658
11862
  };
11659
11863
  };
11660
11864
  };
11661
- '/api/v1/{region}/bean/recurring/forecast': {
11865
+ '/api/v1/users/asset-liability-summary': {
11662
11866
  get: {
11663
- req: ForecastControllerGetForecastData;
11664
11867
  res: {
11665
11868
  /**
11666
- * Forecast retrieved successfully
11869
+ * Summary retrieved successfully
11667
11870
  */
11668
- 200: ForecastResponseDto;
11871
+ 200: unknown;
11669
11872
  };
11670
11873
  };
11671
11874
  };
11672
- '/api/v1/{region}/reporting/portfolio/trends': {
11875
+ '/api/v1/admin/properties': {
11673
11876
  get: {
11674
- req: ReportingControllerGetPortfolioTrendsData;
11675
11877
  res: {
11676
11878
  /**
11677
- * Trends retrieved successfully
11879
+ * Properties retrieved successfully
11678
11880
  */
11679
- 200: PortfolioTrendsResponseDto;
11881
+ 200: unknown;
11680
11882
  /**
11681
- * User not authenticated
11883
+ * Unauthorized
11682
11884
  */
11683
11885
  401: unknown;
11886
+ /**
11887
+ * Forbidden - insufficient permissions
11888
+ */
11889
+ 403: unknown;
11684
11890
  };
11685
11891
  };
11686
11892
  };
11687
- '/api/v1/{region}/reporting/cash-flow/trends': {
11893
+ '/api/v1/admin/properties/{key}': {
11688
11894
  get: {
11689
- req: ReportingControllerGetCashFlowTrendsData;
11895
+ req: PropertyControllerGetByKeyData;
11690
11896
  res: {
11691
11897
  /**
11692
- * Cash-flow trends retrieved successfully
11898
+ * Property retrieved successfully
11693
11899
  */
11694
- 200: CashFlowTrendsResponseDto;
11900
+ 200: unknown;
11695
11901
  /**
11696
- * User not authenticated
11902
+ * Unauthorized
11697
11903
  */
11698
11904
  401: unknown;
11905
+ /**
11906
+ * Forbidden - insufficient permissions
11907
+ */
11908
+ 403: unknown;
11909
+ /**
11910
+ * Property not found
11911
+ */
11912
+ 404: unknown;
11699
11913
  };
11700
11914
  };
11701
- };
11702
- '/api/v1/{region}/reporting/snapshots/generate': {
11703
- post: {
11704
- req: ReportingControllerGenerateSnapshotData;
11915
+ put: {
11916
+ req: PropertyControllerUpdateData;
11705
11917
  res: {
11706
11918
  /**
11707
- * Snapshot generated successfully
11919
+ * Property updated successfully
11708
11920
  */
11709
- 200: GenerateSnapshotResponse;
11921
+ 200: unknown;
11710
11922
  /**
11711
- * Invalid date format
11923
+ * Unauthorized
11712
11924
  */
11713
- 400: unknown;
11925
+ 401: unknown;
11714
11926
  /**
11715
- * User not authenticated
11927
+ * Forbidden - insufficient permissions
11928
+ */
11929
+ 403: unknown;
11930
+ };
11931
+ };
11932
+ delete: {
11933
+ req: PropertyControllerDeleteData;
11934
+ res: {
11935
+ /**
11936
+ * Property deleted successfully
11937
+ */
11938
+ 204: void;
11939
+ /**
11940
+ * Unauthorized
11716
11941
  */
11717
11942
  401: unknown;
11943
+ /**
11944
+ * Forbidden - insufficient permissions
11945
+ */
11946
+ 403: unknown;
11947
+ /**
11948
+ * Property not found
11949
+ */
11950
+ 404: unknown;
11718
11951
  };
11719
11952
  };
11720
11953
  };
11721
- '/api/v1/{region}/reporting/snapshots/backfill': {
11954
+ '/api/v1/{region}/bean/recurring-rules': {
11722
11955
  post: {
11723
- req: ReportingControllerBackfillSnapshotsData;
11956
+ req: RecurringRuleControllerCreateData;
11724
11957
  res: {
11725
11958
  /**
11726
- * Backfill completed successfully
11959
+ * Rule created successfully
11727
11960
  */
11728
- 200: BackfillSnapshotsResponse;
11961
+ 201: RecurringRuleResponseDto;
11729
11962
  /**
11730
- * Invalid date format or range
11963
+ * Invalid input data (e.g., autoCreate without accounts)
11731
11964
  */
11732
11965
  400: unknown;
11733
11966
  /**
11734
- * User not authenticated
11967
+ * Rule with same name already exists
11735
11968
  */
11736
- 401: unknown;
11969
+ 409: unknown;
11970
+ };
11971
+ };
11972
+ get: {
11973
+ req: RecurringRuleControllerFindAllData;
11974
+ res: {
11737
11975
  /**
11738
- * Backfill already in progress for this user
11976
+ * Rules retrieved successfully
11739
11977
  */
11740
- 409: unknown;
11978
+ 200: Array<RecurringRuleResponseDto>;
11741
11979
  };
11742
11980
  };
11743
11981
  };
11744
- '/api/v1/users': {
11745
- delete: {
11746
- req: UserControllerDeleteOwnUserData;
11982
+ '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}': {
11983
+ post: {
11984
+ req: RecurringRuleControllerCreateFromTransactionData;
11747
11985
  res: {
11748
11986
  /**
11749
- * User deleted successfully
11987
+ * Rule created successfully
11750
11988
  */
11751
- 204: void;
11989
+ 201: RecurringRuleResponseDto;
11752
11990
  /**
11753
- * Invalid access token
11991
+ * Transaction not found
11754
11992
  */
11755
- 403: unknown;
11993
+ 404: ApiProblemResponseDto;
11994
+ /**
11995
+ * Rule with same name already exists or transaction already linked
11996
+ */
11997
+ 409: ApiProblemResponseDto;
11756
11998
  };
11757
11999
  };
12000
+ };
12001
+ '/api/v1/{region}/bean/recurring-rules/{id}': {
11758
12002
  get: {
11759
- req: UserControllerGetUserData;
12003
+ req: RecurringRuleControllerFindOneData;
11760
12004
  res: {
11761
12005
  /**
11762
- * User retrieved successfully
12006
+ * Rule retrieved successfully
11763
12007
  */
11764
- 200: UserResponseDto;
12008
+ 200: RecurringRuleResponseDto;
12009
+ /**
12010
+ * Rule not found
12011
+ */
12012
+ 404: unknown;
11765
12013
  };
11766
12014
  };
11767
- post: {
11768
- req: UserControllerSignupUserData;
12015
+ patch: {
12016
+ req: RecurringRuleControllerUpdateData;
11769
12017
  res: {
11770
12018
  /**
11771
- * User created successfully
12019
+ * Rule updated successfully
11772
12020
  */
11773
- 201: SignupResponseDto;
12021
+ 200: RecurringRuleResponseDto;
11774
12022
  /**
11775
- * Invalid Turnstile token (when Turnstile is enabled)
12023
+ * Invalid input data
11776
12024
  */
11777
12025
  400: unknown;
11778
12026
  /**
11779
- * User signup is disabled
12027
+ * Rule not found
11780
12028
  */
11781
- 403: unknown;
12029
+ 404: unknown;
11782
12030
  };
11783
12031
  };
11784
- };
11785
- '/api/v1/users/{id}': {
11786
12032
  delete: {
11787
- req: UserControllerDeleteUserData;
12033
+ req: RecurringRuleControllerDeleteData;
11788
12034
  res: {
11789
12035
  /**
11790
- * User deleted successfully
12036
+ * Rule deleted successfully
11791
12037
  */
11792
12038
  204: void;
11793
12039
  /**
11794
- * Cannot delete own account or insufficient permissions
12040
+ * Rule not found
11795
12041
  */
11796
- 403: unknown;
12042
+ 404: unknown;
11797
12043
  };
11798
12044
  };
11799
12045
  };
11800
- '/api/v1/users/{id}/info': {
12046
+ '/api/v1/{region}/bean/recurring-rules/{id}/stats': {
11801
12047
  get: {
11802
- req: UserControllerGetUserInfoData;
12048
+ req: RecurringRuleControllerGetWithStatsData;
11803
12049
  res: {
11804
12050
  /**
11805
- * User info retrieved successfully
12051
+ * Rule with stats retrieved successfully
11806
12052
  */
11807
- 200: unknown;
12053
+ 200: RecurringRuleWithStatsResponseDto;
11808
12054
  /**
11809
- * Cannot access other user info without admin permission
12055
+ * Rule not found
11810
12056
  */
11811
- 403: unknown;
12057
+ 404: unknown;
11812
12058
  };
11813
12059
  };
11814
12060
  };
11815
- '/api/v1/users/setting': {
11816
- put: {
11817
- req: UserControllerUpdateUserSettingData;
12061
+ '/api/v1/{region}/bean/expected-transactions': {
12062
+ get: {
12063
+ req: ExpectedTransactionControllerFindAllData;
11818
12064
  res: {
11819
12065
  /**
11820
- * Settings updated successfully
11821
- */
11822
- 200: unknown;
11823
- /**
11824
- * Insufficient permissions
12066
+ * Expected transactions retrieved successfully
11825
12067
  */
11826
- 403: unknown;
12068
+ 200: ExpectedTransactionListResponseDto;
11827
12069
  };
11828
12070
  };
11829
12071
  };
11830
- '/api/v1/users/settings-by-page': {
12072
+ '/api/v1/{region}/bean/expected-transactions/overdue': {
11831
12073
  get: {
11832
- req: UserControllerGetAllUserSettingsByPageData;
12074
+ req: ExpectedTransactionControllerFindOverdueData;
11833
12075
  res: {
11834
12076
  /**
11835
- * Settings list retrieved successfully
12077
+ * Overdue transactions retrieved successfully
11836
12078
  */
11837
- 200: unknown;
12079
+ 200: ExpectedTransactionListResponseDto;
11838
12080
  };
11839
12081
  };
11840
12082
  };
11841
- '/api/v1/users/asset-liability-summary': {
12083
+ '/api/v1/{region}/bean/expected-transactions/{id}': {
11842
12084
  get: {
12085
+ req: ExpectedTransactionControllerFindOneData;
11843
12086
  res: {
11844
12087
  /**
11845
- * Summary retrieved successfully
12088
+ * Expected transaction retrieved successfully
11846
12089
  */
11847
- 200: unknown;
12090
+ 200: ExpectedTransactionResponseDto;
12091
+ /**
12092
+ * Expected transaction not found
12093
+ */
12094
+ 404: unknown;
11848
12095
  };
11849
12096
  };
11850
12097
  };
11851
- '/api/v1/admin/properties': {
11852
- get: {
12098
+ '/api/v1/{region}/bean/expected-transactions/{id}/skip': {
12099
+ post: {
12100
+ req: ExpectedTransactionControllerSkipData;
11853
12101
  res: {
11854
12102
  /**
11855
- * Properties retrieved successfully
12103
+ * Expected transaction skipped successfully
11856
12104
  */
11857
- 200: unknown;
12105
+ 200: ExpectedTransactionResponseDto;
11858
12106
  /**
11859
- * Unauthorized
12107
+ * Cannot skip - not in PENDING status
11860
12108
  */
11861
- 401: unknown;
12109
+ 400: unknown;
11862
12110
  /**
11863
- * Forbidden - insufficient permissions
12111
+ * Expected transaction not found
11864
12112
  */
11865
- 403: unknown;
12113
+ 404: unknown;
11866
12114
  };
11867
12115
  };
11868
- };
11869
- '/api/v1/admin/properties/{key}': {
11870
- get: {
11871
- req: PropertyControllerGetByKeyData;
12116
+ delete: {
12117
+ req: ExpectedTransactionControllerUndoSkipData;
11872
12118
  res: {
11873
12119
  /**
11874
- * Property retrieved successfully
11875
- */
11876
- 200: unknown;
11877
- /**
11878
- * Unauthorized
12120
+ * Skip undone successfully
11879
12121
  */
11880
- 401: unknown;
12122
+ 204: void;
11881
12123
  /**
11882
- * Forbidden - insufficient permissions
12124
+ * Cannot undo - not in SKIPPED status
11883
12125
  */
11884
- 403: unknown;
12126
+ 400: unknown;
11885
12127
  /**
11886
- * Property not found
12128
+ * Expected transaction not found
11887
12129
  */
11888
12130
  404: unknown;
11889
12131
  };
11890
12132
  };
11891
- put: {
11892
- req: PropertyControllerUpdateData;
12133
+ };
12134
+ '/api/v1/{region}/bean/expected-transactions/{id}/match': {
12135
+ post: {
12136
+ req: ExpectedTransactionControllerConfirmMatchData;
11893
12137
  res: {
11894
12138
  /**
11895
- * Property updated successfully
12139
+ * Match confirmed successfully
11896
12140
  */
11897
12141
  200: unknown;
11898
12142
  /**
11899
- * Unauthorized
12143
+ * Cannot match - not in PENDING status
11900
12144
  */
11901
- 401: unknown;
12145
+ 400: unknown;
11902
12146
  /**
11903
- * Forbidden - insufficient permissions
12147
+ * Expected or actual transaction not found
11904
12148
  */
11905
- 403: unknown;
12149
+ 404: unknown;
12150
+ /**
12151
+ * Actual transaction already matched to another rule
12152
+ */
12153
+ 409: unknown;
11906
12154
  };
11907
12155
  };
11908
12156
  delete: {
11909
- req: PropertyControllerDeleteData;
12157
+ req: ExpectedTransactionControllerUnmatchData;
11910
12158
  res: {
11911
12159
  /**
11912
- * Property deleted successfully
12160
+ * Match removed successfully
11913
12161
  */
11914
12162
  204: void;
11915
12163
  /**
11916
- * Unauthorized
12164
+ * Cannot unmatch - not in COMPLETED status
11917
12165
  */
11918
- 401: unknown;
12166
+ 400: unknown;
11919
12167
  /**
11920
- * Forbidden - insufficient permissions
12168
+ * Expected transaction not found
11921
12169
  */
11922
- 403: unknown;
12170
+ 404: unknown;
12171
+ };
12172
+ };
12173
+ };
12174
+ '/api/v1/{region}/bean/expected-transactions/{id}/enter': {
12175
+ post: {
12176
+ req: ExpectedTransactionControllerEnterNowData;
12177
+ res: {
11923
12178
  /**
11924
- * Property not found
12179
+ * Transaction created successfully
12180
+ */
12181
+ 201: unknown;
12182
+ /**
12183
+ * Cannot enter - not in PENDING status or missing accounts
12184
+ */
12185
+ 400: unknown;
12186
+ /**
12187
+ * Expected transaction or accounts not found
11925
12188
  */
11926
12189
  404: unknown;
11927
12190
  };
11928
12191
  };
11929
12192
  };
12193
+ '/api/v1/{region}/bean/recurring/forecast': {
12194
+ get: {
12195
+ req: ForecastControllerGetForecastData;
12196
+ res: {
12197
+ /**
12198
+ * Forecast retrieved successfully
12199
+ */
12200
+ 200: ForecastResponseDto;
12201
+ };
12202
+ };
12203
+ };
11930
12204
  '/api/v1/{region}/bean/transaction-rules': {
11931
12205
  post: {
11932
12206
  req: TransactionRuleControllerCreateData;
@@ -12324,7 +12598,10 @@ export type $OpenApiTs = {
12324
12598
  '/api/v1/{region}/bean/export/beancount': {
12325
12599
  get: {
12326
12600
  res: {
12327
- 200: unknown;
12601
+ /**
12602
+ * ZIP archive (application/zip) streamed as an attachment
12603
+ */
12604
+ 200: Blob | File;
12328
12605
  };
12329
12606
  };
12330
12607
  };
@@ -12705,6 +12982,17 @@ export type $OpenApiTs = {
12705
12982
  };
12706
12983
  };
12707
12984
  };
12985
+ '/api/v1/bean/platforms/{id}/standards': {
12986
+ get: {
12987
+ req: PlatformControllerGetPlatformStandardsData;
12988
+ res: {
12989
+ /**
12990
+ * Resolved region plus the merged account-standard catalog of that region (groupable by productCategory client-side)
12991
+ */
12992
+ 200: PlatformStandardsResponseDto;
12993
+ };
12994
+ };
12995
+ };
12708
12996
  '/api/v1/bean/platforms/{id}': {
12709
12997
  put: {
12710
12998
  req: PlatformControllerUpdateData;
@@ -12852,10 +13140,48 @@ export type $OpenApiTs = {
12852
13140
  };
12853
13141
  };
12854
13142
  };
13143
+ '/api/v1/{region}/community/parser-contributions': {
13144
+ post: {
13145
+ req: ParserContributionControllerCreateData;
13146
+ res: {
13147
+ /**
13148
+ * Issue created by the bot
13149
+ */
13150
+ 201: ParserContributionRelayResponseDto;
13151
+ /**
13152
+ * Unauthorized
13153
+ */
13154
+ 401: ApiProblemResponseDto;
13155
+ /**
13156
+ * Validation failed (institution slug, empty samples, row/cell size limits)
13157
+ */
13158
+ 422: ApiProblemResponseDto;
13159
+ /**
13160
+ * Rate limited (5 submissions per user per hour)
13161
+ */
13162
+ 429: ApiProblemResponseDto;
13163
+ /**
13164
+ * Relay not configured on this deployment — clients fall back to the clipboard flow
13165
+ */
13166
+ 501: ApiProblemResponseDto;
13167
+ /**
13168
+ * GitHub bot failure (upstream), safe to retry
13169
+ */
13170
+ 502: ApiProblemResponseDto;
13171
+ };
13172
+ };
13173
+ };
12855
13174
  '/api/v1/cache/flush': {
12856
13175
  post: {
12857
13176
  res: {
12858
- 201: unknown;
13177
+ /**
13178
+ * Cache flushed successfully
13179
+ */
13180
+ 200: unknown;
13181
+ /**
13182
+ * Admin access required
13183
+ */
13184
+ 403: ApiProblemResponseDto;
12859
13185
  };
12860
13186
  };
12861
13187
  };