@firela/api-types 0.0.0-canary.2d71872c → 0.0.0-canary.2e2a26ba

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.
@@ -88,6 +88,47 @@ export const $AccountResponseDto = {
88
88
  enum: ['Assets', 'Liabilities', 'Income', 'Expenses', 'Equity'],
89
89
  example: 'Assets'
90
90
  },
91
+ assetSubClass: {
92
+ type: 'string',
93
+ description:
94
+ 'Account-level asset sub-class (product type, e.g. STOCK/DEPOSIT/CREDIT_CARD/PERSONAL_LOAN). Computed from the account path via the asset-classifier (ADR-0077). Null for non-asset accounts (Income/Expenses/Equity) or unmatched paths.',
95
+ enum: [
96
+ 'DEPOSIT',
97
+ 'CASH',
98
+ 'MONEY_MARKET_FUND',
99
+ 'STOCK',
100
+ 'ETF',
101
+ 'MUTUAL_FUND',
102
+ 'EQUITY_COMPENSATION',
103
+ 'GOVERNMENT_BOND',
104
+ 'CORPORATE_BOND',
105
+ 'BOND_FUND',
106
+ 'PRIMARY_RESIDENCE',
107
+ 'INVESTMENT_PROPERTY',
108
+ 'REIT',
109
+ 'GOLD',
110
+ 'SILVER',
111
+ 'PRECIOUS_METAL',
112
+ 'PRECIOUS_METAL_FUND',
113
+ 'COMMODITY',
114
+ 'COMMODITY_FUND',
115
+ 'CRYPTOCURRENCY',
116
+ 'RETIREMENT_ACCOUNT',
117
+ 'HEALTH_ACCOUNT',
118
+ 'EDUCATION_ACCOUNT',
119
+ 'INSURANCE',
120
+ 'PRIVATE_EQUITY',
121
+ 'HEDGE_FUND',
122
+ 'COLLECTIBLES',
123
+ 'MORTGAGE',
124
+ 'STUDENT_LOAN',
125
+ 'CREDIT_CARD',
126
+ 'PERSONAL_LOAN',
127
+ 'OTHER'
128
+ ],
129
+ nullable: true,
130
+ example: 'STOCK'
131
+ },
91
132
  status: {
92
133
  type: 'string',
93
134
  description: 'Account status',
@@ -3751,202 +3792,649 @@ export const $ForecastResponseDto = {
3751
3792
  ]
3752
3793
  } as const;
3753
3794
 
3754
- export const $CreateTransactionRuleDto = {
3795
+ export const $CurrencyBalanceDto = {
3755
3796
  type: 'object',
3756
3797
  properties: {
3757
- name: {
3798
+ currency: {
3758
3799
  type: 'string',
3759
- minLength: 1,
3760
- maxLength: 100
3800
+ description: 'ISO 4217 currency code',
3801
+ example: 'CNY'
3761
3802
  },
3762
- description: {
3803
+ balance: {
3763
3804
  type: 'string',
3764
- maxLength: 500
3765
- },
3766
- narrationKeywords: {
3767
- items: {
3768
- type: 'array'
3769
- },
3770
- maxItems: 50,
3771
- type: 'array'
3772
- },
3773
- payeeKeywords: {
3774
- items: {
3775
- type: 'array'
3776
- },
3777
- maxItems: 50,
3778
- type: 'array'
3779
- },
3780
- categoryKeywords: {
3781
- items: {
3782
- type: 'array'
3783
- },
3784
- maxItems: 50,
3785
- type: 'array'
3786
- },
3787
- methodKeywords: {
3788
- items: {
3789
- type: 'array'
3790
- },
3791
- maxItems: 50,
3792
- description: 'Payment method keywords (e.g., HuaBei, YuEBao)',
3793
- type: 'array'
3794
- },
3795
- categoryAccount: {
3805
+ description: 'Balance amount',
3806
+ example: '500000.00'
3807
+ }
3808
+ },
3809
+ required: ['currency', 'balance']
3810
+ } as const;
3811
+
3812
+ export const $TimeSeriesPointDto = {
3813
+ type: 'object',
3814
+ properties: {
3815
+ date: {
3796
3816
  type: 'string',
3797
- maxLength: 200,
3798
- description:
3799
- 'Destination account for expenses/income (e.g., Expenses:Food:Coffee)'
3817
+ description: 'Date in YYYY-MM-DD format',
3818
+ example: '2024-06-15'
3800
3819
  },
3801
- matchLogic: {
3820
+ value: {
3802
3821
  type: 'string',
3803
- enum: ['OR', 'AND'],
3804
- default: 'OR'
3822
+ description: 'Value at this date (in base currency)',
3823
+ example: '500000.00'
3805
3824
  },
3806
- amountMin: {
3807
- type: 'number',
3808
- minimum: 0,
3809
- description: 'Minimum transaction amount (inclusive)'
3825
+ change: {
3826
+ type: 'object',
3827
+ description: 'Change from previous point',
3828
+ example: '5000.00'
3810
3829
  },
3811
- amountMax: {
3812
- type: 'number',
3813
- minimum: 0,
3814
- description: 'Maximum transaction amount (inclusive)'
3830
+ assets: {
3831
+ type: 'string',
3832
+ description: 'Total assets at this date (in base currency)',
3833
+ example: '494338.00'
3815
3834
  },
3816
- priority: {
3817
- type: 'number',
3818
- default: 50,
3819
- minimum: 0,
3820
- maximum: 1000
3835
+ liabilities: {
3836
+ type: 'string',
3837
+ description: 'Total liabilities at this date (in base currency)',
3838
+ example: '310098.00'
3821
3839
  },
3822
- additionalTags: {
3840
+ byCurrency: {
3841
+ description: 'Multi-currency breakdown for this point',
3842
+ type: 'array',
3823
3843
  items: {
3824
- type: 'array'
3825
- },
3826
- maxItems: 20,
3827
- type: 'array'
3828
- },
3829
- additionalMetadata: {
3830
- type: 'object'
3831
- },
3832
- upsertByPayee: {
3833
- type: 'boolean',
3834
- description:
3835
- 'If true, update existing rule with matching payeeKeywords[0] instead of creating new rule'
3844
+ $ref: '#/components/schemas/CurrencyBalanceDto'
3845
+ }
3836
3846
  }
3837
3847
  },
3838
- required: ['name', 'matchLogic', 'priority']
3848
+ required: ['date', 'value']
3839
3849
  } as const;
3840
3850
 
3841
- export const $AmountRangeDto = {
3851
+ export const $TrendSummaryDto = {
3842
3852
  type: 'object',
3843
3853
  properties: {
3844
- min: {
3845
- type: 'number',
3846
- description: 'Minimum amount'
3854
+ startValue: {
3855
+ type: 'string',
3856
+ description: 'Value at start of period',
3857
+ example: '450000.00'
3847
3858
  },
3848
- max: {
3849
- type: 'number',
3850
- description: 'Maximum amount'
3859
+ endValue: {
3860
+ type: 'string',
3861
+ description: 'Value at end of period',
3862
+ example: '500000.00'
3863
+ },
3864
+ totalChange: {
3865
+ type: 'string',
3866
+ description: 'Total change over period',
3867
+ example: '50000.00'
3868
+ },
3869
+ totalChangePercentage: {
3870
+ type: 'string',
3871
+ description: 'Total change percentage',
3872
+ example: '+11.11%'
3851
3873
  }
3852
- }
3874
+ },
3875
+ required: ['startValue', 'endValue', 'totalChange', 'totalChangePercentage']
3853
3876
  } as const;
3854
3877
 
3855
- export const $TransactionRuleResponseDto = {
3878
+ export const $MultiCurrencyPointDto = {
3856
3879
  type: 'object',
3857
3880
  properties: {
3858
- id: {
3859
- type: 'string',
3860
- description: 'Rule ID'
3861
- },
3862
- name: {
3863
- type: 'string',
3864
- description: 'Rule name'
3865
- },
3866
- description: {
3881
+ date: {
3867
3882
  type: 'string',
3868
- description: 'Rule description'
3869
- },
3870
- narrationKeywords: {
3871
- description: 'Keywords to match in transaction narration',
3872
- type: 'array',
3873
- items: {
3874
- type: 'string'
3875
- }
3876
- },
3877
- payeeKeywords: {
3878
- description: 'Keywords to match in payee name',
3879
- type: 'array',
3880
- items: {
3881
- type: 'string'
3882
- }
3883
+ description: 'Date in YYYY-MM-DD format',
3884
+ example: '2024-06-15'
3883
3885
  },
3884
- categoryKeywords: {
3885
- description: 'Keywords to match in category',
3886
+ byCurrency: {
3887
+ description: 'Balances by currency',
3886
3888
  type: 'array',
3887
3889
  items: {
3888
- type: 'string'
3890
+ $ref: '#/components/schemas/CurrencyBalanceDto'
3889
3891
  }
3890
- },
3891
- methodKeywords: {
3892
- description: 'Keywords to match in payment method',
3892
+ }
3893
+ },
3894
+ required: ['date', 'byCurrency']
3895
+ } as const;
3896
+
3897
+ export const $PortfolioTrendsResponseDto = {
3898
+ type: 'object',
3899
+ properties: {
3900
+ series: {
3901
+ description: 'Time series data points',
3893
3902
  type: 'array',
3894
3903
  items: {
3895
- type: 'string'
3904
+ $ref: '#/components/schemas/TimeSeriesPointDto'
3896
3905
  }
3897
3906
  },
3898
- categoryAccount: {
3899
- type: 'string',
3900
- description: 'Destination account for categorization'
3901
- },
3902
- matchLogic: {
3903
- type: 'string',
3904
- description: 'Keyword matching logic',
3905
- enum: ['OR', 'AND'],
3906
- example: 'OR'
3907
- },
3908
- amountRange: {
3909
- description: 'Amount range for matching',
3907
+ summary: {
3908
+ description: 'Period summary',
3910
3909
  allOf: [
3911
3910
  {
3912
- $ref: '#/components/schemas/AmountRangeDto'
3911
+ $ref: '#/components/schemas/TrendSummaryDto'
3913
3912
  }
3914
3913
  ]
3915
3914
  },
3916
- priority: {
3917
- type: 'number',
3918
- description: 'Rule priority (0-1000, higher = first match)',
3919
- example: 50
3920
- },
3921
- enabled: {
3922
- type: 'boolean',
3923
- description: 'Whether the rule is enabled'
3924
- },
3925
- learningSource: {
3915
+ period: {
3926
3916
  type: 'string',
3927
- description: 'Learning source: NLP, REVIEW_CENTER, or null for manual',
3928
- enum: ['NLP', 'REVIEW_CENTER'],
3929
- nullable: true,
3930
- example: 'REVIEW_CENTER'
3917
+ description: 'Period requested',
3918
+ example: '6m'
3931
3919
  },
3932
- autoApplyEnabled: {
3933
- type: 'boolean',
3934
- description: 'Whether auto-apply is enabled for this rule'
3920
+ granularity: {
3921
+ type: 'string',
3922
+ description: 'Data granularity',
3923
+ example: 'month'
3935
3924
  },
3936
- confirmationCount: {
3937
- type: 'number',
3938
- description: 'Number of confirmations for NLP-learned rules',
3939
- example: 3
3925
+ currency: {
3926
+ type: 'string',
3927
+ description: 'Base currency for converted values',
3928
+ example: 'CNY'
3940
3929
  },
3941
- additionalTags: {
3942
- description: 'Additional tags',
3930
+ byCurrency: {
3931
+ description:
3932
+ 'Multi-currency time series (each point has currency breakdown)',
3943
3933
  type: 'array',
3944
3934
  items: {
3945
- type: 'string'
3935
+ $ref: '#/components/schemas/MultiCurrencyPointDto'
3946
3936
  }
3947
3937
  },
3948
- additionalMetadata: {
3949
- type: 'object',
3938
+ warnings: {
3939
+ description: 'Exchange rate warnings',
3940
+ type: 'array',
3941
+ items: {
3942
+ $ref: '#/components/schemas/ExchangeRateWarningDto'
3943
+ }
3944
+ }
3945
+ },
3946
+ required: ['series', 'summary', 'period', 'granularity', 'currency']
3947
+ } as const;
3948
+
3949
+ export const $CashFlowPointDto = {
3950
+ type: 'object',
3951
+ properties: {
3952
+ month: {
3953
+ type: 'string',
3954
+ description: 'Month key (YYYY-MM)',
3955
+ example: '2024-03'
3956
+ },
3957
+ income: {
3958
+ type: 'string',
3959
+ description: 'Income in base currency (absolute, converted)',
3960
+ example: '10000.00'
3961
+ },
3962
+ expense: {
3963
+ type: 'string',
3964
+ description: 'Expense in base currency (absolute, converted)',
3965
+ example: '5000.00'
3966
+ },
3967
+ netSavings: {
3968
+ type: 'string',
3969
+ description: 'netSavings = income − expense (savings positive)',
3970
+ example: '5000.00'
3971
+ }
3972
+ },
3973
+ required: ['month', 'income', 'expense', 'netSavings']
3974
+ } as const;
3975
+
3976
+ export const $CashFlowTrendSummaryDto = {
3977
+ type: 'object',
3978
+ properties: {
3979
+ totalIncome: {
3980
+ type: 'string',
3981
+ description: 'Total income across the period',
3982
+ example: '60000.00'
3983
+ },
3984
+ totalExpense: {
3985
+ type: 'string',
3986
+ description: 'Total expense across the period',
3987
+ example: '30000.00'
3988
+ },
3989
+ totalNetSavings: {
3990
+ type: 'string',
3991
+ description: 'income − expense across the period',
3992
+ example: '30000.00'
3993
+ },
3994
+ averageMonthlyNetSavings: {
3995
+ type: 'string',
3996
+ description:
3997
+ 'totalNetSavings divided by the window length (N months, incl. zero-filled)',
3998
+ example: '5000.00'
3999
+ }
4000
+ },
4001
+ required: [
4002
+ 'totalIncome',
4003
+ 'totalExpense',
4004
+ 'totalNetSavings',
4005
+ 'averageMonthlyNetSavings'
4006
+ ]
4007
+ } as const;
4008
+
4009
+ export const $CashFlowTrendsResponseDto = {
4010
+ type: 'object',
4011
+ properties: {
4012
+ series: {
4013
+ description:
4014
+ 'Monthly cash-flow series (fixed N-month window, zero-filled)',
4015
+ type: 'array',
4016
+ items: {
4017
+ $ref: '#/components/schemas/CashFlowPointDto'
4018
+ }
4019
+ },
4020
+ summary: {
4021
+ description: 'Period totals',
4022
+ allOf: [
4023
+ {
4024
+ $ref: '#/components/schemas/CashFlowTrendSummaryDto'
4025
+ }
4026
+ ]
4027
+ },
4028
+ period: {
4029
+ type: 'string',
4030
+ description: 'Period requested',
4031
+ example: '6m'
4032
+ },
4033
+ granularity: {
4034
+ type: 'string',
4035
+ description: 'Data granularity (v1 returns month buckets)',
4036
+ example: 'month'
4037
+ },
4038
+ currency: {
4039
+ type: 'string',
4040
+ description: 'Base currency for converted values',
4041
+ example: 'CNY'
4042
+ },
4043
+ warnings: {
4044
+ description: 'Exchange rate warnings (e.g. missing rate for a currency)',
4045
+ type: 'array',
4046
+ items: {
4047
+ $ref: '#/components/schemas/ExchangeRateWarningDto'
4048
+ }
4049
+ }
4050
+ },
4051
+ required: ['series', 'summary', 'period', 'granularity', 'currency']
4052
+ } as const;
4053
+
4054
+ export const $GenerateSnapshotBody = {
4055
+ type: 'object',
4056
+ properties: {}
4057
+ } as const;
4058
+
4059
+ export const $GenerateSnapshotResponse = {
4060
+ type: 'object',
4061
+ properties: {}
4062
+ } as const;
4063
+
4064
+ export const $BackfillSnapshotsBody = {
4065
+ type: 'object',
4066
+ properties: {}
4067
+ } as const;
4068
+
4069
+ export const $BackfillSnapshotsResponse = {
4070
+ type: 'object',
4071
+ properties: {}
4072
+ } as const;
4073
+
4074
+ export const $DeleteOwnUserDto = {
4075
+ type: 'object',
4076
+ properties: {
4077
+ accessToken: {
4078
+ type: 'string',
4079
+ description: 'Access token for user verification',
4080
+ example: 'abc123xyz'
4081
+ }
4082
+ },
4083
+ required: ['accessToken']
4084
+ } as const;
4085
+
4086
+ export const $SignupDto = {
4087
+ type: 'object',
4088
+ properties: {
4089
+ turnstileToken: {
4090
+ type: 'string',
4091
+ description:
4092
+ 'Cloudflare Turnstile verification token (optional when Turnstile disabled)',
4093
+ example: '0.abc123def456...'
4094
+ }
4095
+ }
4096
+ } as const;
4097
+
4098
+ export const $SignupResponseDto = {
4099
+ type: 'object',
4100
+ properties: {
4101
+ authToken: {
4102
+ type: 'string',
4103
+ description: 'JWT auth token',
4104
+ example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
4105
+ },
4106
+ accessToken: {
4107
+ type: 'string',
4108
+ description: 'Auto-generated access token'
4109
+ },
4110
+ role: {
4111
+ type: 'string',
4112
+ description: 'Assigned user role',
4113
+ enum: ['USER', 'ADMIN', 'DEMO', 'INACTIVE', 'PAID', 'OPS']
4114
+ }
4115
+ },
4116
+ required: ['authToken', 'accessToken', 'role']
4117
+ } as const;
4118
+
4119
+ export const $UpdateUserSettingDto = {
4120
+ type: 'object',
4121
+ properties: {
4122
+ secId: {
4123
+ type: 'number',
4124
+ description: 'Security ID'
4125
+ },
4126
+ annualInterestRate: {
4127
+ type: 'number',
4128
+ description: 'Annual interest rate',
4129
+ example: 0.05
4130
+ },
4131
+ currency: {
4132
+ type: 'string',
4133
+ description: 'Currency code',
4134
+ example: 'USD'
4135
+ },
4136
+ baseCurrency: {
4137
+ type: 'string',
4138
+ description: 'Base currency code',
4139
+ example: 'USD'
4140
+ },
4141
+ benchmark: {
4142
+ type: 'string',
4143
+ description: 'Benchmark symbol',
4144
+ example: 'SPY'
4145
+ },
4146
+ colorScheme: {
4147
+ type: 'string',
4148
+ description: 'Color scheme',
4149
+ enum: ['DARK', 'LIGHT']
4150
+ },
4151
+ dateRange: {
4152
+ type: 'string',
4153
+ description: 'Date range filter',
4154
+ example: '1y'
4155
+ },
4156
+ emergencyFund: {
4157
+ type: 'number',
4158
+ description: 'Emergency fund amount',
4159
+ example: 10000
4160
+ },
4161
+ 'filters.accounts': {
4162
+ description: 'Account filter IDs',
4163
+ type: 'array',
4164
+ items: {
4165
+ type: 'string'
4166
+ }
4167
+ },
4168
+ 'filters.assetClasses': {
4169
+ description: 'Asset class filters',
4170
+ type: 'array',
4171
+ items: {
4172
+ type: 'string'
4173
+ }
4174
+ },
4175
+ 'filters.dataSource': {
4176
+ type: 'string',
4177
+ description: 'Data source filter'
4178
+ },
4179
+ 'filters.symbol': {
4180
+ type: 'string',
4181
+ description: 'Symbol filter'
4182
+ },
4183
+ 'filters.tags': {
4184
+ description: 'Tag filters',
4185
+ type: 'array',
4186
+ items: {
4187
+ type: 'string'
4188
+ }
4189
+ },
4190
+ isExperimentalFeatures: {
4191
+ type: 'boolean',
4192
+ description: 'Enable experimental features'
4193
+ },
4194
+ isRestrictedView: {
4195
+ type: 'boolean',
4196
+ description: 'Enable restricted view mode'
4197
+ },
4198
+ language: {
4199
+ type: 'string',
4200
+ description: 'Language code',
4201
+ example: 'en'
4202
+ },
4203
+ locale: {
4204
+ type: 'string',
4205
+ description: 'Locale code',
4206
+ example: 'en-US'
4207
+ },
4208
+ projectedTotalAmount: {
4209
+ type: 'number',
4210
+ description: 'Projected total amount',
4211
+ example: 1000000
4212
+ },
4213
+ retirementDate: {
4214
+ type: 'string',
4215
+ description: 'Retirement date in ISO 8601 format',
4216
+ example: '2050-01-01'
4217
+ },
4218
+ savingsRate: {
4219
+ type: 'number',
4220
+ description: 'Savings rate percentage',
4221
+ example: 0.2
4222
+ },
4223
+ viewMode: {
4224
+ type: 'string',
4225
+ description: 'View mode',
4226
+ enum: ['DEFAULT', 'ZEN']
4227
+ }
4228
+ }
4229
+ } as const;
4230
+
4231
+ export const $UpdatePropertyDto = {
4232
+ type: 'object',
4233
+ properties: {
4234
+ value: {
4235
+ type: 'string',
4236
+ description: 'Property value'
4237
+ }
4238
+ },
4239
+ required: ['value']
4240
+ } as const;
4241
+
4242
+ export const $CreateTransactionRuleDto = {
4243
+ type: 'object',
4244
+ properties: {
4245
+ name: {
4246
+ type: 'string',
4247
+ minLength: 1,
4248
+ maxLength: 100
4249
+ },
4250
+ description: {
4251
+ type: 'string',
4252
+ maxLength: 500
4253
+ },
4254
+ narrationKeywords: {
4255
+ items: {
4256
+ type: 'array'
4257
+ },
4258
+ maxItems: 50,
4259
+ type: 'array'
4260
+ },
4261
+ payeeKeywords: {
4262
+ items: {
4263
+ type: 'array'
4264
+ },
4265
+ maxItems: 50,
4266
+ type: 'array'
4267
+ },
4268
+ categoryKeywords: {
4269
+ items: {
4270
+ type: 'array'
4271
+ },
4272
+ maxItems: 50,
4273
+ type: 'array'
4274
+ },
4275
+ methodKeywords: {
4276
+ items: {
4277
+ type: 'array'
4278
+ },
4279
+ maxItems: 50,
4280
+ description: 'Payment method keywords (e.g., HuaBei, YuEBao)',
4281
+ type: 'array'
4282
+ },
4283
+ categoryAccount: {
4284
+ type: 'string',
4285
+ maxLength: 200,
4286
+ description:
4287
+ 'Destination account for expenses/income (e.g., Expenses:Food:Coffee)'
4288
+ },
4289
+ matchLogic: {
4290
+ type: 'string',
4291
+ enum: ['OR', 'AND'],
4292
+ default: 'OR'
4293
+ },
4294
+ amountMin: {
4295
+ type: 'number',
4296
+ minimum: 0,
4297
+ description: 'Minimum transaction amount (inclusive)'
4298
+ },
4299
+ amountMax: {
4300
+ type: 'number',
4301
+ minimum: 0,
4302
+ description: 'Maximum transaction amount (inclusive)'
4303
+ },
4304
+ priority: {
4305
+ type: 'number',
4306
+ default: 50,
4307
+ minimum: 0,
4308
+ maximum: 1000
4309
+ },
4310
+ additionalTags: {
4311
+ items: {
4312
+ type: 'array'
4313
+ },
4314
+ maxItems: 20,
4315
+ type: 'array'
4316
+ },
4317
+ additionalMetadata: {
4318
+ type: 'object'
4319
+ },
4320
+ upsertByPayee: {
4321
+ type: 'boolean',
4322
+ description:
4323
+ 'If true, update existing rule with matching payeeKeywords[0] instead of creating new rule'
4324
+ }
4325
+ },
4326
+ required: ['name', 'matchLogic', 'priority']
4327
+ } as const;
4328
+
4329
+ export const $AmountRangeDto = {
4330
+ type: 'object',
4331
+ properties: {
4332
+ min: {
4333
+ type: 'number',
4334
+ description: 'Minimum amount'
4335
+ },
4336
+ max: {
4337
+ type: 'number',
4338
+ description: 'Maximum amount'
4339
+ }
4340
+ }
4341
+ } as const;
4342
+
4343
+ export const $TransactionRuleResponseDto = {
4344
+ type: 'object',
4345
+ properties: {
4346
+ id: {
4347
+ type: 'string',
4348
+ description: 'Rule ID'
4349
+ },
4350
+ name: {
4351
+ type: 'string',
4352
+ description: 'Rule name'
4353
+ },
4354
+ description: {
4355
+ type: 'string',
4356
+ description: 'Rule description'
4357
+ },
4358
+ narrationKeywords: {
4359
+ description: 'Keywords to match in transaction narration',
4360
+ type: 'array',
4361
+ items: {
4362
+ type: 'string'
4363
+ }
4364
+ },
4365
+ payeeKeywords: {
4366
+ description: 'Keywords to match in payee name',
4367
+ type: 'array',
4368
+ items: {
4369
+ type: 'string'
4370
+ }
4371
+ },
4372
+ categoryKeywords: {
4373
+ description: 'Keywords to match in category',
4374
+ type: 'array',
4375
+ items: {
4376
+ type: 'string'
4377
+ }
4378
+ },
4379
+ methodKeywords: {
4380
+ description: 'Keywords to match in payment method',
4381
+ type: 'array',
4382
+ items: {
4383
+ type: 'string'
4384
+ }
4385
+ },
4386
+ categoryAccount: {
4387
+ type: 'string',
4388
+ description: 'Destination account for categorization'
4389
+ },
4390
+ matchLogic: {
4391
+ type: 'string',
4392
+ description: 'Keyword matching logic',
4393
+ enum: ['OR', 'AND'],
4394
+ example: 'OR'
4395
+ },
4396
+ amountRange: {
4397
+ description: 'Amount range for matching',
4398
+ allOf: [
4399
+ {
4400
+ $ref: '#/components/schemas/AmountRangeDto'
4401
+ }
4402
+ ]
4403
+ },
4404
+ priority: {
4405
+ type: 'number',
4406
+ description: 'Rule priority (0-1000, higher = first match)',
4407
+ example: 50
4408
+ },
4409
+ enabled: {
4410
+ type: 'boolean',
4411
+ description: 'Whether the rule is enabled'
4412
+ },
4413
+ learningSource: {
4414
+ type: 'string',
4415
+ description: 'Learning source: NLP, REVIEW_CENTER, or null for manual',
4416
+ enum: ['NLP', 'REVIEW_CENTER'],
4417
+ nullable: true,
4418
+ example: 'REVIEW_CENTER'
4419
+ },
4420
+ autoApplyEnabled: {
4421
+ type: 'boolean',
4422
+ description: 'Whether auto-apply is enabled for this rule'
4423
+ },
4424
+ confirmationCount: {
4425
+ type: 'number',
4426
+ description: 'Number of confirmations for NLP-learned rules',
4427
+ example: 3
4428
+ },
4429
+ additionalTags: {
4430
+ description: 'Additional tags',
4431
+ type: 'array',
4432
+ items: {
4433
+ type: 'string'
4434
+ }
4435
+ },
4436
+ additionalMetadata: {
4437
+ type: 'object',
3950
4438
  description: 'Additional metadata',
3951
4439
  additionalProperties: {
3952
4440
  type: 'string'
@@ -4360,191 +4848,44 @@ export const $TestRuleDto = {
4360
4848
  type: 'string',
4361
4849
  maxLength: 200
4362
4850
  },
4363
- amount: {
4364
- type: 'number'
4365
- },
4366
- currency: {
4367
- type: 'string',
4368
- maxLength: 10
4369
- }
4370
- },
4371
- required: ['narration']
4372
- } as const;
4373
-
4374
- export const $TestRuleResponseDto = {
4375
- type: 'object',
4376
- properties: {
4377
- ruleId: {
4378
- type: 'string',
4379
- description: 'Rule ID that was tested'
4380
- },
4381
- matches: {
4382
- type: 'boolean',
4383
- description: 'Whether the rule matched the test data'
4384
- },
4385
- confidence: {
4386
- type: 'number',
4387
- description: 'Match confidence score (0-1)',
4388
- example: 0.85
4389
- },
4390
- matchDetails: {
4391
- type: 'object',
4392
- description: 'Details of which fields matched',
4393
- example: {
4394
- narration: true,
4395
- payee: false,
4396
- categoryAccount: false
4397
- }
4398
- }
4399
- },
4400
- required: ['ruleId', 'matches', 'confidence', 'matchDetails']
4401
- } as const;
4402
-
4403
- export const $DeleteOwnUserDto = {
4404
- type: 'object',
4405
- properties: {
4406
- accessToken: {
4407
- type: 'string',
4408
- description: 'Access token for user verification',
4409
- example: 'abc123xyz'
4410
- }
4411
- },
4412
- required: ['accessToken']
4413
- } as const;
4414
-
4415
- export const $SignupDto = {
4416
- type: 'object',
4417
- properties: {
4418
- turnstileToken: {
4419
- type: 'string',
4420
- description:
4421
- 'Cloudflare Turnstile verification token (optional when Turnstile disabled)',
4422
- example: '0.abc123def456...'
4423
- }
4424
- }
4425
- } as const;
4426
-
4427
- export const $UpdateUserSettingDto = {
4428
- type: 'object',
4429
- properties: {
4430
- secId: {
4431
- type: 'number',
4432
- description: 'Security ID'
4433
- },
4434
- annualInterestRate: {
4435
- type: 'number',
4436
- description: 'Annual interest rate',
4437
- example: 0.05
4438
- },
4439
- currency: {
4440
- type: 'string',
4441
- description: 'Currency code',
4442
- example: 'USD'
4443
- },
4444
- baseCurrency: {
4445
- type: 'string',
4446
- description: 'Base currency code',
4447
- example: 'USD'
4448
- },
4449
- benchmark: {
4450
- type: 'string',
4451
- description: 'Benchmark symbol',
4452
- example: 'SPY'
4453
- },
4454
- colorScheme: {
4455
- type: 'string',
4456
- description: 'Color scheme',
4457
- enum: ['DARK', 'LIGHT']
4458
- },
4459
- dateRange: {
4460
- type: 'string',
4461
- description: 'Date range filter',
4462
- example: '1y'
4463
- },
4464
- emergencyFund: {
4465
- type: 'number',
4466
- description: 'Emergency fund amount',
4467
- example: 10000
4468
- },
4469
- 'filters.accounts': {
4470
- description: 'Account filter IDs',
4471
- type: 'array',
4472
- items: {
4473
- type: 'string'
4474
- }
4475
- },
4476
- 'filters.assetClasses': {
4477
- description: 'Asset class filters',
4478
- type: 'array',
4479
- items: {
4480
- type: 'string'
4481
- }
4482
- },
4483
- 'filters.dataSource': {
4484
- type: 'string',
4485
- description: 'Data source filter'
4486
- },
4487
- 'filters.symbol': {
4488
- type: 'string',
4489
- description: 'Symbol filter'
4490
- },
4491
- 'filters.tags': {
4492
- description: 'Tag filters',
4493
- type: 'array',
4494
- items: {
4495
- type: 'string'
4496
- }
4497
- },
4498
- isExperimentalFeatures: {
4499
- type: 'boolean',
4500
- description: 'Enable experimental features'
4501
- },
4502
- isRestrictedView: {
4503
- type: 'boolean',
4504
- description: 'Enable restricted view mode'
4505
- },
4506
- language: {
4507
- type: 'string',
4508
- description: 'Language code',
4509
- example: 'en'
4510
- },
4511
- locale: {
4512
- type: 'string',
4513
- description: 'Locale code',
4514
- example: 'en-US'
4515
- },
4516
- projectedTotalAmount: {
4517
- type: 'number',
4518
- description: 'Projected total amount',
4519
- example: 1000000
4520
- },
4521
- retirementDate: {
4522
- type: 'string',
4523
- description: 'Retirement date in ISO 8601 format',
4524
- example: '2050-01-01'
4525
- },
4526
- savingsRate: {
4527
- type: 'number',
4528
- description: 'Savings rate percentage',
4529
- example: 0.2
4851
+ amount: {
4852
+ type: 'number'
4530
4853
  },
4531
- viewMode: {
4854
+ currency: {
4532
4855
  type: 'string',
4533
- description: 'View mode',
4534
- enum: ['DEFAULT', 'ZEN']
4856
+ maxLength: 10
4535
4857
  }
4536
- }
4858
+ },
4859
+ required: ['narration']
4537
4860
  } as const;
4538
4861
 
4539
- export const $UpdatePropertyDto = {
4862
+ export const $TestRuleResponseDto = {
4540
4863
  type: 'object',
4541
4864
  properties: {
4542
- value: {
4865
+ ruleId: {
4543
4866
  type: 'string',
4544
- description: 'Property value'
4867
+ description: 'Rule ID that was tested'
4868
+ },
4869
+ matches: {
4870
+ type: 'boolean',
4871
+ description: 'Whether the rule matched the test data'
4872
+ },
4873
+ confidence: {
4874
+ type: 'number',
4875
+ description: 'Match confidence score (0-1)',
4876
+ example: 0.85
4877
+ },
4878
+ matchDetails: {
4879
+ type: 'object',
4880
+ description: 'Details of which fields matched',
4881
+ example: {
4882
+ narration: true,
4883
+ payee: false,
4884
+ categoryAccount: false
4885
+ }
4545
4886
  }
4546
4887
  },
4547
- required: ['value']
4888
+ required: ['ruleId', 'matches', 'confidence', 'matchDetails']
4548
4889
  } as const;
4549
4890
 
4550
4891
  export const $CreateBeanEventDto = {
@@ -5625,6 +5966,18 @@ export const $ProcessNlpDto = {
5625
5966
  currency: 'CNY',
5626
5967
  payee: 'Starbucks'
5627
5968
  }
5969
+ },
5970
+ selectedRuleId: {
5971
+ type: 'string',
5972
+ description:
5973
+ 'confirm_rule echo-back: rule id selected from the prior confirm_rule response (matchedRule.id or alternatives[i].ruleId). Applied directly when the session is confirming_rule — no NL re-parse.',
5974
+ example: 'rule_abc123'
5975
+ },
5976
+ selectedAccount: {
5977
+ type: 'string',
5978
+ description:
5979
+ '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.',
5980
+ example: 'Expenses:Food:Coffee'
5628
5981
  }
5629
5982
  },
5630
5983
  required: ['message']
@@ -5949,7 +6302,8 @@ export const $NlpAccountConfirmationDataDto = {
5949
6302
  },
5950
6303
  suggestedAccount: {
5951
6304
  type: 'string',
5952
- description: 'Suggested replacement account',
6305
+ description:
6306
+ 'Suggested replacement account (omitted when no clear candidate)',
5953
6307
  example: 'Expenses:Food:Drinks'
5954
6308
  },
5955
6309
  similarAccounts: {
@@ -5971,7 +6325,6 @@ export const $NlpAccountConfirmationDataDto = {
5971
6325
  },
5972
6326
  required: [
5973
6327
  'invalidAccount',
5974
- 'suggestedAccount',
5975
6328
  'similarAccounts',
5976
6329
  'errorMessage',
5977
6330
  'transactionContext'
@@ -6221,7 +6574,8 @@ export const $NlpResponseDto = {
6221
6574
  'confirm_rule',
6222
6575
  'confirm_account',
6223
6576
  'confirm_payee',
6224
- 'cancel'
6577
+ 'cancel',
6578
+ 'aborted'
6225
6579
  ]
6226
6580
  },
6227
6581
  intent: {
@@ -6462,6 +6816,89 @@ export const $PlatformListItemDto = {
6462
6816
  ]
6463
6817
  } as const;
6464
6818
 
6819
+ export const $PlatformMatchResultDto = {
6820
+ type: 'object',
6821
+ properties: {
6822
+ id: {
6823
+ type: 'string',
6824
+ description: 'Global platform ID'
6825
+ },
6826
+ name: {
6827
+ type: 'string',
6828
+ description: 'Platform name (e.g., "ICBC")'
6829
+ },
6830
+ canonical: {
6831
+ type: 'string',
6832
+ description: 'Canonical identifier in ACCOUNT_RE format (e.g., "icbc")'
6833
+ },
6834
+ type: {
6835
+ type: 'string',
6836
+ description: 'Platform type',
6837
+ enum: [
6838
+ 'BANK',
6839
+ 'BROKERAGE',
6840
+ 'CRYPTO_EXCHANGE',
6841
+ 'PAYMENT',
6842
+ 'INVESTMENT',
6843
+ 'INSURANCE',
6844
+ 'OTHER'
6845
+ ]
6846
+ },
6847
+ suggestedSegment: {
6848
+ type: 'string',
6849
+ description:
6850
+ 'Suggested path segment — canonical, already in ACCOUNT_RE format'
6851
+ },
6852
+ logoUrl: {
6853
+ type: 'string',
6854
+ description: 'Logo URL',
6855
+ nullable: true
6856
+ },
6857
+ matchType: {
6858
+ type: 'string',
6859
+ description: "How this row matched: 'exact' > 'prefix' > 'substring'",
6860
+ enum: ['exact', 'prefix', 'substring']
6861
+ }
6862
+ },
6863
+ required: [
6864
+ 'id',
6865
+ 'name',
6866
+ 'canonical',
6867
+ 'type',
6868
+ 'suggestedSegment',
6869
+ 'logoUrl',
6870
+ 'matchType'
6871
+ ]
6872
+ } as const;
6873
+
6874
+ export const $PlatformMatchResponseDto = {
6875
+ type: 'object',
6876
+ properties: {
6877
+ platforms: {
6878
+ description: 'Ranked matches, best tier first (at most 10 rows)',
6879
+ type: 'array',
6880
+ items: {
6881
+ $ref: '#/components/schemas/PlatformMatchResultDto'
6882
+ }
6883
+ },
6884
+ matchType: {
6885
+ type: 'string',
6886
+ description:
6887
+ "Overall match quality — top row's tier, or 'none' when no hits",
6888
+ enum: ['none', 'exact', 'prefix', 'substring']
6889
+ },
6890
+ total: {
6891
+ type: 'number',
6892
+ description: 'Total matches before LIMIT (truncation transparency)'
6893
+ },
6894
+ hasMore: {
6895
+ type: 'boolean',
6896
+ description: 'true when total > platforms.length (more matches exist)'
6897
+ }
6898
+ },
6899
+ required: ['platforms', 'matchType', 'total', 'hasMore']
6900
+ } as const;
6901
+
6465
6902
  export const $CreatePlatformDto = {
6466
6903
  type: 'object',
6467
6904
  properties: {
@@ -7604,344 +8041,220 @@ export const $HoldingPnlWarningDto = {
7604
8041
  'OVERSOLD_LOTS',
7605
8042
  'NO_PRICE',
7606
8043
  'MIXED_COST_CURRENCY'
7607
- ]
7608
- },
7609
- symbol: {
7610
- type: 'object',
7611
- nullable: true
7612
- },
7613
- accountId: {
7614
- type: 'object',
7615
- nullable: true
7616
- },
7617
- currency: {
7618
- type: 'object',
7619
- nullable: true
7620
- }
7621
- },
7622
- required: ['type']
7623
- } as const;
7624
-
7625
- export const $HoldingPnlResponseDto = {
7626
- type: 'object',
7627
- properties: {
7628
- asOfDate: {
7629
- type: 'string',
7630
- example: '2026-07-08'
7631
- },
7632
- baseCurrency: {
7633
- type: 'string',
7634
- example: 'CNY'
7635
- },
7636
- method: {
7637
- type: 'string',
7638
- description:
7639
- 'Realized-P&L lot-matching method (FIFO or average). Unrealized cost basis remains average regardless of this value (#473).',
7640
- enum: ['average', 'FIFO'],
7641
- example: 'average'
7642
- },
7643
- rows: {
7644
- type: 'array',
7645
- items: {
7646
- $ref: '#/components/schemas/HoldingPnlRowDto'
7647
- }
7648
- },
7649
- warnings: {
7650
- type: 'array',
7651
- items: {
7652
- $ref: '#/components/schemas/HoldingPnlWarningDto'
7653
- }
7654
- }
7655
- },
7656
- required: ['asOfDate', 'baseCurrency', 'method', 'rows', 'warnings']
7657
- } as const;
7658
-
7659
- export const $CurrencyBalanceDto = {
7660
- type: 'object',
7661
- properties: {
7662
- currency: {
7663
- type: 'string',
7664
- description: 'ISO 4217 currency code',
7665
- example: 'CNY'
7666
- },
7667
- balance: {
7668
- type: 'string',
7669
- description: 'Balance amount',
7670
- example: '500000.00'
7671
- }
7672
- },
7673
- required: ['currency', 'balance']
7674
- } as const;
7675
-
7676
- export const $TimeSeriesPointDto = {
7677
- type: 'object',
7678
- properties: {
7679
- date: {
7680
- type: 'string',
7681
- description: 'Date in YYYY-MM-DD format',
7682
- example: '2024-06-15'
7683
- },
7684
- value: {
7685
- type: 'string',
7686
- description: 'Value at this date (in base currency)',
7687
- example: '500000.00'
7688
- },
7689
- change: {
7690
- type: 'object',
7691
- description: 'Change from previous point',
7692
- example: '5000.00'
7693
- },
7694
- assets: {
7695
- type: 'string',
7696
- description: 'Total assets at this date (in base currency)',
7697
- example: '494338.00'
7698
- },
7699
- liabilities: {
7700
- type: 'string',
7701
- description: 'Total liabilities at this date (in base currency)',
7702
- example: '310098.00'
7703
- },
7704
- byCurrency: {
7705
- description: 'Multi-currency breakdown for this point',
7706
- type: 'array',
7707
- items: {
7708
- $ref: '#/components/schemas/CurrencyBalanceDto'
7709
- }
7710
- }
7711
- },
7712
- required: ['date', 'value']
7713
- } as const;
7714
-
7715
- export const $TrendSummaryDto = {
7716
- type: 'object',
7717
- properties: {
7718
- startValue: {
7719
- type: 'string',
7720
- description: 'Value at start of period',
7721
- example: '450000.00'
7722
- },
7723
- endValue: {
7724
- type: 'string',
7725
- description: 'Value at end of period',
7726
- example: '500000.00'
7727
- },
7728
- totalChange: {
7729
- type: 'string',
7730
- description: 'Total change over period',
7731
- example: '50000.00'
7732
- },
7733
- totalChangePercentage: {
7734
- type: 'string',
7735
- description: 'Total change percentage',
7736
- example: '+11.11%'
7737
- }
7738
- },
7739
- required: ['startValue', 'endValue', 'totalChange', 'totalChangePercentage']
7740
- } as const;
7741
-
7742
- export const $MultiCurrencyPointDto = {
7743
- type: 'object',
7744
- properties: {
7745
- date: {
7746
- type: 'string',
7747
- description: 'Date in YYYY-MM-DD format',
7748
- example: '2024-06-15'
8044
+ ]
7749
8045
  },
7750
- byCurrency: {
7751
- description: 'Balances by currency',
7752
- type: 'array',
7753
- items: {
7754
- $ref: '#/components/schemas/CurrencyBalanceDto'
7755
- }
8046
+ symbol: {
8047
+ type: 'object',
8048
+ nullable: true
8049
+ },
8050
+ accountId: {
8051
+ type: 'object',
8052
+ nullable: true
8053
+ },
8054
+ currency: {
8055
+ type: 'object',
8056
+ nullable: true
7756
8057
  }
7757
8058
  },
7758
- required: ['date', 'byCurrency']
8059
+ required: ['type']
7759
8060
  } as const;
7760
8061
 
7761
- export const $PortfolioTrendsResponseDto = {
8062
+ export const $HoldingPnlResponseDto = {
7762
8063
  type: 'object',
7763
8064
  properties: {
7764
- series: {
7765
- description: 'Time series data points',
7766
- type: 'array',
7767
- items: {
7768
- $ref: '#/components/schemas/TimeSeriesPointDto'
7769
- }
7770
- },
7771
- summary: {
7772
- description: 'Period summary',
7773
- allOf: [
7774
- {
7775
- $ref: '#/components/schemas/TrendSummaryDto'
7776
- }
7777
- ]
7778
- },
7779
- period: {
7780
- type: 'string',
7781
- description: 'Period requested',
7782
- example: '6m'
7783
- },
7784
- granularity: {
8065
+ asOfDate: {
7785
8066
  type: 'string',
7786
- description: 'Data granularity',
7787
- example: 'month'
8067
+ example: '2026-07-08'
7788
8068
  },
7789
- currency: {
8069
+ baseCurrency: {
7790
8070
  type: 'string',
7791
- description: 'Base currency for converted values',
7792
8071
  example: 'CNY'
7793
8072
  },
7794
- byCurrency: {
8073
+ method: {
8074
+ type: 'string',
7795
8075
  description:
7796
- 'Multi-currency time series (each point has currency breakdown)',
8076
+ 'Realized-P&L lot-matching method (FIFO or average). Unrealized cost basis remains average regardless of this value (#473).',
8077
+ enum: ['average', 'FIFO'],
8078
+ example: 'average'
8079
+ },
8080
+ rows: {
7797
8081
  type: 'array',
7798
8082
  items: {
7799
- $ref: '#/components/schemas/MultiCurrencyPointDto'
8083
+ $ref: '#/components/schemas/HoldingPnlRowDto'
7800
8084
  }
7801
8085
  },
7802
8086
  warnings: {
7803
- description: 'Exchange rate warnings',
7804
8087
  type: 'array',
7805
8088
  items: {
7806
- $ref: '#/components/schemas/ExchangeRateWarningDto'
8089
+ $ref: '#/components/schemas/HoldingPnlWarningDto'
7807
8090
  }
7808
8091
  }
7809
8092
  },
7810
- required: ['series', 'summary', 'period', 'granularity', 'currency']
8093
+ required: ['asOfDate', 'baseCurrency', 'method', 'rows', 'warnings']
7811
8094
  } as const;
7812
8095
 
7813
- export const $CashFlowPointDto = {
8096
+ export const $AnonymousLoginDto = {
7814
8097
  type: 'object',
7815
8098
  properties: {
7816
- month: {
7817
- type: 'string',
7818
- description: 'Month key (YYYY-MM)',
7819
- example: '2024-03'
7820
- },
7821
- income: {
7822
- type: 'string',
7823
- description: 'Income in base currency (absolute, converted)',
7824
- example: '10000.00'
7825
- },
7826
- expense: {
7827
- type: 'string',
7828
- description: 'Expense in base currency (absolute, converted)',
7829
- example: '5000.00'
7830
- },
7831
- netSavings: {
8099
+ accessToken: {
7832
8100
  type: 'string',
7833
- description: 'netSavings = income − expense (savings positive)',
7834
- example: '5000.00'
8101
+ description: 'Access token for anonymous login'
7835
8102
  }
7836
8103
  },
7837
- required: ['month', 'income', 'expense', 'netSavings']
8104
+ required: ['accessToken']
7838
8105
  } as const;
7839
8106
 
7840
- export const $CashFlowTrendSummaryDto = {
8107
+ export const $AnonymousLoginResponseDto = {
7841
8108
  type: 'object',
7842
8109
  properties: {
7843
- totalIncome: {
7844
- type: 'string',
7845
- description: 'Total income across the period',
7846
- example: '60000.00'
7847
- },
7848
- totalExpense: {
7849
- type: 'string',
7850
- description: 'Total expense across the period',
7851
- example: '30000.00'
7852
- },
7853
- totalNetSavings: {
7854
- type: 'string',
7855
- description: 'income − expense across the period',
7856
- example: '30000.00'
7857
- },
7858
- averageMonthlyNetSavings: {
8110
+ authToken: {
7859
8111
  type: 'string',
7860
- description:
7861
- 'totalNetSavings divided by the window length (N months, incl. zero-filled)',
7862
- example: '5000.00'
8112
+ description: 'JWT auth token',
8113
+ example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
7863
8114
  }
7864
8115
  },
7865
- required: [
7866
- 'totalIncome',
7867
- 'totalExpense',
7868
- 'totalNetSavings',
7869
- 'averageMonthlyNetSavings'
7870
- ]
8116
+ required: ['authToken']
7871
8117
  } as const;
7872
8118
 
7873
- export const $CashFlowTrendsResponseDto = {
8119
+ export const $SymbolSearchResultDto = {
7874
8120
  type: 'object',
7875
8121
  properties: {
7876
- series: {
7877
- description:
7878
- 'Monthly cash-flow series (fixed N-month window, zero-filled)',
7879
- type: 'array',
7880
- items: {
7881
- $ref: '#/components/schemas/CashFlowPointDto'
7882
- }
8122
+ symbol: {
8123
+ type: 'string',
8124
+ example: 'AAPL'
7883
8125
  },
7884
- summary: {
7885
- description: 'Period totals',
7886
- allOf: [
7887
- {
7888
- $ref: '#/components/schemas/CashFlowTrendSummaryDto'
7889
- }
7890
- ]
8126
+ name: {
8127
+ type: 'object',
8128
+ example: 'Apple Inc.',
8129
+ nullable: true
7891
8130
  },
7892
- period: {
7893
- type: 'string',
7894
- description: 'Period requested',
7895
- example: '6m'
8131
+ exchange: {
8132
+ type: 'object',
8133
+ example: 'US',
8134
+ nullable: true
7896
8135
  },
7897
- granularity: {
7898
- type: 'string',
7899
- description: 'Data granularity (v1 returns month buckets)',
7900
- example: 'month'
8136
+ assetType: {
8137
+ type: 'object',
8138
+ description: 'OpenBB asset_type (e.g. stock, etf)',
8139
+ example: 'stock',
8140
+ nullable: true
7901
8141
  },
7902
- currency: {
7903
- type: 'string',
7904
- description: 'Base currency for converted values',
7905
- example: 'CNY'
8142
+ assetClass: {
8143
+ type: 'object',
8144
+ description: 'IGN asset class (region.types.ts ASSET_CLASSES)',
8145
+ example: 'EQUITY',
8146
+ nullable: true
7906
8147
  },
7907
- warnings: {
7908
- description: 'Exchange rate warnings (e.g. missing rate for a currency)',
7909
- type: 'array',
7910
- items: {
7911
- $ref: '#/components/schemas/ExchangeRateWarningDto'
7912
- }
8148
+ assetSubClass: {
8149
+ type: 'object',
8150
+ description: 'IGN asset sub-class (region.types.ts ASSET_SUB_CLASSES)',
8151
+ example: 'STOCK',
8152
+ nullable: true
8153
+ },
8154
+ currency: {
8155
+ type: 'object',
8156
+ description: 'Trading currency (extra_data or inferred from exchange)',
8157
+ example: 'USD',
8158
+ nullable: true
7913
8159
  }
7914
8160
  },
7915
- required: ['series', 'summary', 'period', 'granularity', 'currency']
7916
- } as const;
7917
-
7918
- export const $GenerateSnapshotBody = {
7919
- type: 'object',
7920
- properties: {}
7921
- } as const;
7922
-
7923
- export const $GenerateSnapshotResponse = {
7924
- type: 'object',
7925
- properties: {}
7926
- } as const;
7927
-
7928
- export const $BackfillSnapshotsBody = {
7929
- type: 'object',
7930
- properties: {}
7931
- } as const;
7932
-
7933
- export const $BackfillSnapshotsResponse = {
7934
- type: 'object',
7935
- properties: {}
8161
+ required: ['symbol']
7936
8162
  } as const;
7937
8163
 
7938
- export const $AnonymousLoginDto = {
8164
+ export const $SymbolQuoteDto = {
7939
8165
  type: 'object',
7940
8166
  properties: {
7941
- accessToken: {
8167
+ symbol: {
7942
8168
  type: 'string',
7943
- description: 'Access token for anonymous login'
8169
+ example: 'AAPL'
8170
+ },
8171
+ name: {
8172
+ type: 'object',
8173
+ example: 'Apple Inc.',
8174
+ nullable: true
8175
+ },
8176
+ exchange: {
8177
+ type: 'object',
8178
+ example: 'US',
8179
+ nullable: true
8180
+ },
8181
+ assetType: {
8182
+ type: 'object',
8183
+ description: 'OpenBB asset_type',
8184
+ example: 'stock',
8185
+ nullable: true
8186
+ },
8187
+ assetClass: {
8188
+ type: 'object',
8189
+ description: 'IGN asset class',
8190
+ example: 'EQUITY',
8191
+ nullable: true
8192
+ },
8193
+ assetSubClass: {
8194
+ type: 'object',
8195
+ description: 'IGN asset sub-class',
8196
+ example: 'STOCK',
8197
+ nullable: true
8198
+ },
8199
+ currency: {
8200
+ type: 'object',
8201
+ description: 'Trading currency (extra_data or inferred from exchange)',
8202
+ example: 'USD',
8203
+ nullable: true
8204
+ },
8205
+ price: {
8206
+ type: 'object',
8207
+ description: 'Latest price (Decimal string)',
8208
+ example: '189.84',
8209
+ nullable: true
8210
+ },
8211
+ priceDate: {
8212
+ type: 'object',
8213
+ description: 'Date the price was observed (ISO yyyy-MM-dd)',
8214
+ example: '2026-08-05',
8215
+ nullable: true
8216
+ },
8217
+ changePercent: {
8218
+ type: 'object',
8219
+ description:
8220
+ '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.',
8221
+ example: 1.7,
8222
+ nullable: true
8223
+ },
8224
+ prevClose: {
8225
+ type: 'object',
8226
+ description: 'Previous close (Decimal string)',
8227
+ nullable: true
8228
+ },
8229
+ open: {
8230
+ type: 'object',
8231
+ description: 'Day open (Decimal string)',
8232
+ nullable: true
8233
+ },
8234
+ high: {
8235
+ type: 'object',
8236
+ description: 'Day high (Decimal string)',
8237
+ nullable: true
8238
+ },
8239
+ low: {
8240
+ type: 'object',
8241
+ description: 'Day low (Decimal string)',
8242
+ nullable: true
8243
+ },
8244
+ volume: {
8245
+ type: 'object',
8246
+ description: 'Day volume (Decimal string)',
8247
+ nullable: true
8248
+ },
8249
+ yearHigh: {
8250
+ type: 'object',
8251
+ description: '52-week high (Decimal string)',
8252
+ nullable: true
8253
+ },
8254
+ yearLow: {
8255
+ type: 'object',
8256
+ description: '52-week low (Decimal string)',
8257
+ nullable: true
7944
8258
  }
7945
- },
7946
- required: ['accessToken']
8259
+ }
7947
8260
  } as const;