@firela/api-types 0.0.0-canary.97006feb → 0.0.0-canary.a0b42138

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,49 @@ 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
+ 'ACCOUNTS_PAYABLE',
128
+ 'TAX_PAYABLE',
129
+ 'OTHER'
130
+ ],
131
+ nullable: true,
132
+ example: 'STOCK'
133
+ },
91
134
  status: {
92
135
  type: 'string',
93
136
  description: 'Account status',
@@ -354,9 +397,47 @@ export const $AccountStandardResponseDto = {
354
397
  type: 'string',
355
398
  description: 'Icon identifier for UI display',
356
399
  example: 'bank-icbc'
400
+ },
401
+ productCategory: {
402
+ type: 'string',
403
+ description:
404
+ 'Onboarding product category (coarse grouping derived from assetSubClass)',
405
+ enum: [
406
+ 'cash',
407
+ 'investment',
408
+ 'credit_card',
409
+ 'loan',
410
+ 'payable_tax',
411
+ 'other'
412
+ ],
413
+ example: 'investment'
414
+ },
415
+ assetClass: {
416
+ type: 'string',
417
+ description:
418
+ 'Asset class (LIQUIDITY/EQUITY/.../LIABILITY), derived at read time from classification rules',
419
+ enum: [
420
+ 'LIQUIDITY',
421
+ 'EQUITY',
422
+ 'FIXED_INCOME',
423
+ 'PRECIOUS_METALS',
424
+ 'COMMODITY',
425
+ 'INSURANCE',
426
+ 'ALTERNATIVE_INVESTMENT',
427
+ 'PERSONAL_ASSETS',
428
+ 'LIABILITY',
429
+ 'REAL_ESTATE',
430
+ 'INDEX'
431
+ ]
432
+ },
433
+ assetSubClass: {
434
+ type: 'string',
435
+ description:
436
+ 'Asset sub-class (product type, derived at read time from classification rules)',
437
+ example: 'STOCK'
357
438
  }
358
439
  },
359
- required: ['path', 'type', 'description', 'tags', 'icon']
440
+ required: ['path', 'type', 'description', 'tags', 'icon', 'productCategory']
360
441
  } as const;
361
442
 
362
443
  export const $AccountStandardListResponseDto = {
@@ -4042,6 +4123,50 @@ export const $DeleteOwnUserDto = {
4042
4123
  required: ['accessToken']
4043
4124
  } as const;
4044
4125
 
4126
+ export const $UserSettingsResponseDto = {
4127
+ type: 'object',
4128
+ properties: {
4129
+ baseCurrency: {
4130
+ type: 'string',
4131
+ description:
4132
+ 'Base currency (ISO 4217) for net-worth/report aggregation. Independent of region (ADR-0006).',
4133
+ example: 'USD',
4134
+ nullable: true
4135
+ }
4136
+ },
4137
+ required: ['baseCurrency']
4138
+ } as const;
4139
+
4140
+ export const $UserResponseDto = {
4141
+ type: 'object',
4142
+ properties: {
4143
+ id: {
4144
+ type: 'string',
4145
+ description: 'User ID'
4146
+ },
4147
+ role: {
4148
+ type: 'string',
4149
+ description: 'Assigned user role'
4150
+ },
4151
+ permissions: {
4152
+ description: 'Permission strings',
4153
+ type: 'array',
4154
+ items: {
4155
+ type: 'string'
4156
+ }
4157
+ },
4158
+ settings: {
4159
+ description: 'User settings',
4160
+ allOf: [
4161
+ {
4162
+ $ref: '#/components/schemas/UserSettingsResponseDto'
4163
+ }
4164
+ ]
4165
+ }
4166
+ },
4167
+ required: ['id', 'role', 'permissions', 'settings']
4168
+ } as const;
4169
+
4045
4170
  export const $SignupDto = {
4046
4171
  type: 'object',
4047
4172
  properties: {
@@ -4847,6 +4972,69 @@ export const $TestRuleResponseDto = {
4847
4972
  required: ['ruleId', 'matches', 'confidence', 'matchDetails']
4848
4973
  } as const;
4849
4974
 
4975
+ export const $CategoryCatalogEntryDto = {
4976
+ type: 'object',
4977
+ properties: {
4978
+ slug: {
4979
+ type: 'string',
4980
+ description: 'Category slug (single source-of-truth)',
4981
+ example: 'food'
4982
+ },
4983
+ scenario: {
4984
+ type: 'string',
4985
+ description: 'Display scenario group (maps to frontend picker _scenario)',
4986
+ enum: [
4987
+ 'expense',
4988
+ 'income',
4989
+ 'investment',
4990
+ 'banking',
4991
+ 'transfer',
4992
+ 'payment'
4993
+ ],
4994
+ example: 'expense'
4995
+ },
4996
+ icon: {
4997
+ type: 'string',
4998
+ description: 'Lucide icon name',
4999
+ example: 'utensils'
5000
+ },
5001
+ regions: {
5002
+ description: "Applicable regions ('*' = all, 'cn' = CN-only)",
5003
+ example: ['*'],
5004
+ type: 'array',
5005
+ items: {
5006
+ type: 'string'
5007
+ }
5008
+ }
5009
+ },
5010
+ required: ['slug', 'scenario', 'icon', 'regions']
5011
+ } as const;
5012
+
5013
+ export const $CategoryCatalogListResponseDto = {
5014
+ type: 'object',
5015
+ properties: {
5016
+ items: {
5017
+ description: 'Category entries (region-scoped, query-filtered)',
5018
+ type: 'array',
5019
+ items: {
5020
+ $ref: '#/components/schemas/CategoryCatalogEntryDto'
5021
+ }
5022
+ },
5023
+ total: {
5024
+ type: 'number',
5025
+ description:
5026
+ 'Total category entries for the region (before query filtering)',
5027
+ example: 30
5028
+ },
5029
+ region: {
5030
+ type: 'string',
5031
+ description: 'Region code',
5032
+ example: 'cn'
5033
+ }
5034
+ },
5035
+ required: ['items', 'total', 'region']
5036
+ } as const;
5037
+
4850
5038
  export const $CreateBeanEventDto = {
4851
5039
  type: 'object',
4852
5040
  properties: {
@@ -5589,7 +5777,8 @@ export const $UpdateMapperDefaultsDto = {
5589
5777
  type: 'string',
5590
5778
  description: 'Source account for transactions (Beancount format)',
5591
5779
  example: 'Assets:CN:Alipay:Balance',
5592
- pattern: '^[A-Z][a-zA-Z0-9-]*:[a-zA-Z0-9-:]+$'
5780
+ pattern:
5781
+ '^(Assets|Liabilities|Income|Expenses|Equity)(:[A-Za-z0-9][A-Za-z0-9-]*)+$'
5593
5782
  },
5594
5783
  currency: {
5595
5784
  type: 'string',
@@ -5603,13 +5792,15 @@ export const $UpdateMapperDefaultsDto = {
5603
5792
  type: 'string',
5604
5793
  description: 'Default expense account (optional)',
5605
5794
  example: 'Expenses:Unknown',
5606
- pattern: '^[A-Z][a-zA-Z0-9-]*:[a-zA-Z0-9-:]+$'
5795
+ pattern:
5796
+ '^(Assets|Liabilities|Income|Expenses|Equity)(:[A-Za-z0-9][A-Za-z0-9-]*)+$'
5607
5797
  },
5608
5798
  incomeAccount: {
5609
5799
  type: 'string',
5610
5800
  description: 'Default income account (optional)',
5611
5801
  example: 'Income:Unknown',
5612
- pattern: '^[A-Z][a-zA-Z0-9-]*:[a-zA-Z0-9-:]+$'
5802
+ pattern:
5803
+ '^(Assets|Liabilities|Income|Expenses|Equity)(:[A-Za-z0-9][A-Za-z0-9-]*)+$'
5613
5804
  },
5614
5805
  methodAccountMapping: {
5615
5806
  type: 'object',
@@ -5666,12 +5857,14 @@ export const $ProviderSyncConfigDto = {
5666
5857
  },
5667
5858
  defaultExpenseAccount: {
5668
5859
  type: 'string',
5669
- description: 'Default expense account for the second posting',
5860
+ description:
5861
+ 'Default expense account for the second posting. Omit when no real default exists; the pipeline routes to Review via the Uncategorized sentinel (#618).',
5670
5862
  example: 'Expenses:Unknown'
5671
5863
  },
5672
5864
  defaultIncomeAccount: {
5673
5865
  type: 'string',
5674
- description: 'Default income account for the second posting',
5866
+ description:
5867
+ 'Default income account for the second posting. Omit when no real default exists; the pipeline routes to Review via the Uncategorized sentinel (#618).',
5675
5868
  example: 'Income:Unknown'
5676
5869
  },
5677
5870
  filterPending: {
@@ -5686,12 +5879,7 @@ export const $ProviderSyncConfigDto = {
5686
5879
  example: 'acc_gocardless_001'
5687
5880
  }
5688
5881
  },
5689
- required: [
5690
- 'sourceAccount',
5691
- 'defaultCurrency',
5692
- 'defaultExpenseAccount',
5693
- 'defaultIncomeAccount'
5694
- ]
5882
+ required: ['sourceAccount', 'defaultCurrency']
5695
5883
  } as const;
5696
5884
 
5697
5885
  export const $ProviderSyncDto = {
@@ -5901,15 +6089,105 @@ export const $UncoveredFormatMissDto = {
5901
6089
  properties: {}
5902
6090
  } as const;
5903
6091
 
6092
+ export const $ClientParsedDataDto = {
6093
+ type: 'object',
6094
+ properties: {
6095
+ amount: {
6096
+ type: 'number',
6097
+ description: 'Transaction amount',
6098
+ example: 35
6099
+ },
6100
+ currency: {
6101
+ type: 'string',
6102
+ description: 'Currency code',
6103
+ example: 'CNY'
6104
+ },
6105
+ date: {
6106
+ type: 'string',
6107
+ description: 'Transaction date (ISO 8601)',
6108
+ example: '2026-08-15'
6109
+ },
6110
+ payee: {
6111
+ type: 'string',
6112
+ description: 'Payee/merchant name',
6113
+ example: 'Starbucks'
6114
+ },
6115
+ narration: {
6116
+ type: 'string',
6117
+ description: 'Transaction narration'
6118
+ },
6119
+ category: {
6120
+ type: 'string',
6121
+ description: 'Category slug',
6122
+ example: 'food_restaurant'
6123
+ },
6124
+ incomeType: {
6125
+ type: 'string',
6126
+ description: 'Income type',
6127
+ example: 'Salary'
6128
+ },
6129
+ incomeSource: {
6130
+ type: 'string',
6131
+ description: 'Income source',
6132
+ example: 'Anthropic Inc.'
6133
+ },
6134
+ symbol: {
6135
+ type: 'string',
6136
+ description: 'Security symbol code (e.g., 600519, AAPL)',
6137
+ example: 'AAPL'
6138
+ },
6139
+ quantity: {
6140
+ type: 'number',
6141
+ description: 'Quantity of shares/units',
6142
+ example: 100
6143
+ },
6144
+ price: {
6145
+ type: 'number',
6146
+ description: 'Unit price per share/unit',
6147
+ example: 1900
6148
+ },
6149
+ investmentAction: {
6150
+ type: 'string',
6151
+ description: 'Investment action',
6152
+ enum: ['buy', 'sell'],
6153
+ example: 'buy'
6154
+ },
6155
+ paymentSource: {
6156
+ type: 'string',
6157
+ description: 'Payment source: asset (default) or liability (credit card)',
6158
+ enum: ['asset', 'liability'],
6159
+ example: 'asset'
6160
+ },
6161
+ liabilityHint: {
6162
+ type: 'string',
6163
+ description: 'Liability account hint (CreditCard/Huabei/Baitiao)',
6164
+ example: 'CreditCard'
6165
+ },
6166
+ warning: {
6167
+ type: 'string',
6168
+ description:
6169
+ 'Display-only warning from the prior response; accepted but ignored.',
6170
+ example: 'Cross-currency settlement applies.'
6171
+ }
6172
+ }
6173
+ } as const;
6174
+
5904
6175
  export const $ProcessNlpDto = {
5905
6176
  type: 'object',
5906
6177
  properties: {
5907
6178
  message: {
5908
6179
  type: 'string',
5909
- description: 'Natural language text describing a transaction (Chinese)',
5910
- example: 'yesterday Starbucks spent 35 yuan',
6180
+ description:
6181
+ 'Natural language text describing a transaction. Optional when `confirm` is true (structured confirm); otherwise required.',
6182
+ example: 'Starbucks 35',
5911
6183
  maxLength: 500
5912
6184
  },
6185
+ confirm: {
6186
+ type: 'boolean',
6187
+ description:
6188
+ 'Structured confirm signal — bypasses NL confirm-word matching when true. Send parsedData field edits alongside. The NL word-list path is the fallback.',
6189
+ example: true
6190
+ },
5913
6191
  sessionId: {
5914
6192
  type: 'string',
5915
6193
  description:
@@ -5917,17 +6195,32 @@ export const $ProcessNlpDto = {
5917
6195
  example: 'session_abc123'
5918
6196
  },
5919
6197
  parsedData: {
5920
- type: 'object',
5921
6198
  description:
5922
6199
  'Parsed data from previous NLP response for session recovery. Send back the parsedData received in confirm_payee/confirm responses.',
5923
6200
  example: {
5924
6201
  amount: 35,
5925
6202
  currency: 'CNY',
5926
6203
  payee: 'Starbucks'
5927
- }
6204
+ },
6205
+ allOf: [
6206
+ {
6207
+ $ref: '#/components/schemas/ClientParsedDataDto'
6208
+ }
6209
+ ]
6210
+ },
6211
+ selectedRuleId: {
6212
+ type: 'string',
6213
+ description:
6214
+ '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.',
6215
+ example: 'rule_abc123'
6216
+ },
6217
+ selectedAccount: {
6218
+ type: 'string',
6219
+ description:
6220
+ '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.',
6221
+ example: 'Expenses:Food:Coffee'
5928
6222
  }
5929
- },
5930
- required: ['message']
6223
+ }
5931
6224
  } as const;
5932
6225
 
5933
6226
  export const $NlpTransactionInfoDto = {
@@ -6249,7 +6542,8 @@ export const $NlpAccountConfirmationDataDto = {
6249
6542
  },
6250
6543
  suggestedAccount: {
6251
6544
  type: 'string',
6252
- description: 'Suggested replacement account',
6545
+ description:
6546
+ 'Suggested replacement account (omitted when no clear candidate)',
6253
6547
  example: 'Expenses:Food:Drinks'
6254
6548
  },
6255
6549
  similarAccounts: {
@@ -6271,7 +6565,6 @@ export const $NlpAccountConfirmationDataDto = {
6271
6565
  },
6272
6566
  required: [
6273
6567
  'invalidAccount',
6274
- 'suggestedAccount',
6275
6568
  'similarAccounts',
6276
6569
  'errorMessage',
6277
6570
  'transactionContext'
@@ -6444,7 +6737,8 @@ export const $NlpSuggestedAccountDto = {
6444
6737
  },
6445
6738
  confidence: {
6446
6739
  type: 'number',
6447
- description: 'Confidence score for this suggestion (0-1)',
6740
+ description:
6741
+ 'Confidence score for this suggestion (0-1). Present = predicted (confirm/confirm_rule/confirm_account); omitted = actual persisted account (created). (#586)',
6448
6742
  example: 0.9
6449
6743
  }
6450
6744
  },
@@ -6480,23 +6774,31 @@ export const $NlpDefaultAccountsDto = {
6480
6774
  properties: {
6481
6775
  asset: {
6482
6776
  type: 'string',
6483
- description: 'Default asset account',
6484
- example: 'Assets:Checking'
6777
+ description:
6778
+ 'Default OPEN asset account (MRU when multiple), or null when none/ambiguous',
6779
+ example: 'Assets:Checking',
6780
+ nullable: true
6485
6781
  },
6486
6782
  expense: {
6487
6783
  type: 'string',
6488
- description: 'Default expense account',
6489
- example: 'Expenses:Uncategorized'
6784
+ description:
6785
+ 'Default OPEN expense account (MRU when multiple), or null when none/ambiguous',
6786
+ example: 'Expenses:Food:Coffee',
6787
+ nullable: true
6490
6788
  },
6491
6789
  income: {
6492
6790
  type: 'string',
6493
- description: 'Default income account',
6494
- example: 'Income:Uncategorized'
6791
+ description:
6792
+ 'Default OPEN income account (MRU when multiple), or null when none/ambiguous',
6793
+ example: 'Income:Salary',
6794
+ nullable: true
6495
6795
  },
6496
6796
  liability: {
6497
6797
  type: 'string',
6498
- description: 'Default liability account',
6499
- example: 'Liabilities:CreditCard'
6798
+ description:
6799
+ 'Default OPEN liability account (MRU when multiple), or null when none/ambiguous',
6800
+ example: 'Liabilities:CreditCard',
6801
+ nullable: true
6500
6802
  }
6501
6803
  },
6502
6804
  required: ['asset', 'expense', 'income', 'liability']
@@ -6536,7 +6838,7 @@ export const $NlpResponseDto = {
6536
6838
  type: 'string',
6537
6839
  description:
6538
6840
  'Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.',
6539
- enum: ['transfer', 'banking', 'investment'],
6841
+ enum: ['transfer', 'banking', 'investment', 'lend', 'lend_collect'],
6540
6842
  example: 'investment'
6541
6843
  },
6542
6844
  liabilitySubType: {
@@ -6684,7 +6986,7 @@ export const $NlpResponseDto = {
6684
6986
  },
6685
6987
  suggestedAccounts: {
6686
6988
  description:
6687
- 'Suggested accounts for this transaction. Contains recommended source and destination accounts based on the detected intent and rules.',
6989
+ 'Suggested accounts for this transaction (#586). confirm/confirm_rule/confirm_account: predicted (source/destination carry confidence); created: actual persisted accounts (confidence omitted). confirm_account destination is the suggested replacement, never the invalid account.',
6688
6990
  allOf: [
6689
6991
  {
6690
6992
  $ref: '#/components/schemas/NlpSuggestedAccountsDto'
@@ -6693,7 +6995,7 @@ export const $NlpResponseDto = {
6693
6995
  },
6694
6996
  defaultAccounts: {
6695
6997
  description:
6696
- 'Default accounts for the user/region. These are fallback accounts used when no specific suggestion is available.',
6998
+ 'Default fallback accounts for the user/region (#586). v1 returns universal constants; per-user personalization is planned.',
6697
6999
  allOf: [
6698
7000
  {
6699
7001
  $ref: '#/components/schemas/NlpDefaultAccountsDto'
@@ -6739,13 +7041,26 @@ export const $PlatformListItemDto = {
6739
7041
  suggestedSegment: {
6740
7042
  type: 'string',
6741
7043
  description:
6742
- 'Suggested path segment — canonical with first char uppercased (ACC_COMP_NAME_RE)'
7044
+ 'Suggested path segment — canonical PascalCased per hyphen-part, hyphens preserved (e.g. "Apple-Pay")'
6743
7045
  },
6744
7046
  logoUrl: {
6745
7047
  type: 'string',
6746
7048
  description: 'Logo URL',
6747
7049
  nullable: true
6748
7050
  },
7051
+ countryCode: {
7052
+ type: 'string',
7053
+ description: 'ISO 3166-1 alpha-2 (UPPERCASE); null = global platform',
7054
+ example: 'CN',
7055
+ nullable: true
7056
+ },
7057
+ category: {
7058
+ type: 'string',
7059
+ description:
7060
+ 'Region-aware category (institution vocab, e.g. DigitalWallet/Bank). null = no region-aware suggestion; fall back to type.',
7061
+ nullable: true,
7062
+ example: 'DigitalWallet'
7063
+ },
6749
7064
  isBound: {
6750
7065
  type: 'boolean',
6751
7066
  description: 'Whether user has accounts using this platform'
@@ -6759,6 +7074,8 @@ export const $PlatformListItemDto = {
6759
7074
  'canonical',
6760
7075
  'suggestedSegment',
6761
7076
  'logoUrl',
7077
+ 'countryCode',
7078
+ 'category',
6762
7079
  'isBound'
6763
7080
  ]
6764
7081
  } as const;
@@ -6794,13 +7111,26 @@ export const $PlatformMatchResultDto = {
6794
7111
  suggestedSegment: {
6795
7112
  type: 'string',
6796
7113
  description:
6797
- 'Suggested path segment — canonical, already in ACCOUNT_RE format'
7114
+ 'Suggested path segment — canonical PascalCased per hyphen-part, hyphens preserved (e.g. "Apple-Pay")'
6798
7115
  },
6799
7116
  logoUrl: {
6800
7117
  type: 'string',
6801
7118
  description: 'Logo URL',
6802
7119
  nullable: true
6803
7120
  },
7121
+ countryCode: {
7122
+ type: 'string',
7123
+ description: 'ISO 3166-1 alpha-2 (UPPERCASE); null = global platform',
7124
+ example: 'CN',
7125
+ nullable: true
7126
+ },
7127
+ category: {
7128
+ type: 'string',
7129
+ description:
7130
+ 'Region-aware category (institution vocab, e.g. DigitalWallet/Bank). null = no region-aware suggestion; fall back to type.',
7131
+ nullable: true,
7132
+ example: 'DigitalWallet'
7133
+ },
6804
7134
  matchType: {
6805
7135
  type: 'string',
6806
7136
  description: "How this row matched: 'exact' > 'prefix' > 'substring'",
@@ -6814,6 +7144,8 @@ export const $PlatformMatchResultDto = {
6814
7144
  'type',
6815
7145
  'suggestedSegment',
6816
7146
  'logoUrl',
7147
+ 'countryCode',
7148
+ 'category',
6817
7149
  'matchType'
6818
7150
  ]
6819
7151
  } as const;
@@ -8062,3 +8394,146 @@ export const $AnonymousLoginResponseDto = {
8062
8394
  },
8063
8395
  required: ['authToken']
8064
8396
  } as const;
8397
+
8398
+ export const $SymbolSearchResultDto = {
8399
+ type: 'object',
8400
+ properties: {
8401
+ symbol: {
8402
+ type: 'string',
8403
+ example: 'AAPL'
8404
+ },
8405
+ name: {
8406
+ type: 'object',
8407
+ example: 'Apple Inc.',
8408
+ nullable: true
8409
+ },
8410
+ exchange: {
8411
+ type: 'object',
8412
+ example: 'US',
8413
+ nullable: true
8414
+ },
8415
+ assetType: {
8416
+ type: 'object',
8417
+ description: 'OpenBB asset_type (e.g. stock, etf)',
8418
+ example: 'stock',
8419
+ nullable: true
8420
+ },
8421
+ assetClass: {
8422
+ type: 'object',
8423
+ description: 'IGN asset class (region.types.ts ASSET_CLASSES)',
8424
+ example: 'EQUITY',
8425
+ nullable: true
8426
+ },
8427
+ assetSubClass: {
8428
+ type: 'object',
8429
+ description: 'IGN asset sub-class (region.types.ts ASSET_SUB_CLASSES)',
8430
+ example: 'STOCK',
8431
+ nullable: true
8432
+ },
8433
+ currency: {
8434
+ type: 'object',
8435
+ description: 'Trading currency (extra_data or inferred from exchange)',
8436
+ example: 'USD',
8437
+ nullable: true
8438
+ }
8439
+ },
8440
+ required: ['symbol']
8441
+ } as const;
8442
+
8443
+ export const $SymbolQuoteDto = {
8444
+ type: 'object',
8445
+ properties: {
8446
+ symbol: {
8447
+ type: 'string',
8448
+ example: 'AAPL'
8449
+ },
8450
+ name: {
8451
+ type: 'object',
8452
+ example: 'Apple Inc.',
8453
+ nullable: true
8454
+ },
8455
+ exchange: {
8456
+ type: 'object',
8457
+ example: 'US',
8458
+ nullable: true
8459
+ },
8460
+ assetType: {
8461
+ type: 'object',
8462
+ description: 'OpenBB asset_type',
8463
+ example: 'stock',
8464
+ nullable: true
8465
+ },
8466
+ assetClass: {
8467
+ type: 'object',
8468
+ description: 'IGN asset class',
8469
+ example: 'EQUITY',
8470
+ nullable: true
8471
+ },
8472
+ assetSubClass: {
8473
+ type: 'object',
8474
+ description: 'IGN asset sub-class',
8475
+ example: 'STOCK',
8476
+ nullable: true
8477
+ },
8478
+ currency: {
8479
+ type: 'object',
8480
+ description: 'Trading currency (extra_data or inferred from exchange)',
8481
+ example: 'USD',
8482
+ nullable: true
8483
+ },
8484
+ price: {
8485
+ type: 'object',
8486
+ description: 'Latest price (Decimal string)',
8487
+ example: '189.84',
8488
+ nullable: true
8489
+ },
8490
+ priceDate: {
8491
+ type: 'object',
8492
+ description: 'Date the price was observed (ISO yyyy-MM-dd)',
8493
+ example: '2026-08-05',
8494
+ nullable: true
8495
+ },
8496
+ changePercent: {
8497
+ type: 'object',
8498
+ description:
8499
+ '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.',
8500
+ example: 1.7,
8501
+ nullable: true
8502
+ },
8503
+ prevClose: {
8504
+ type: 'object',
8505
+ description: 'Previous close (Decimal string)',
8506
+ nullable: true
8507
+ },
8508
+ open: {
8509
+ type: 'object',
8510
+ description: 'Day open (Decimal string)',
8511
+ nullable: true
8512
+ },
8513
+ high: {
8514
+ type: 'object',
8515
+ description: 'Day high (Decimal string)',
8516
+ nullable: true
8517
+ },
8518
+ low: {
8519
+ type: 'object',
8520
+ description: 'Day low (Decimal string)',
8521
+ nullable: true
8522
+ },
8523
+ volume: {
8524
+ type: 'object',
8525
+ description: 'Day volume (Decimal string)',
8526
+ nullable: true
8527
+ },
8528
+ yearHigh: {
8529
+ type: 'object',
8530
+ description: '52-week high (Decimal string)',
8531
+ nullable: true
8532
+ },
8533
+ yearLow: {
8534
+ type: 'object',
8535
+ description: '52-week low (Decimal string)',
8536
+ nullable: true
8537
+ }
8538
+ }
8539
+ } as const;