@firela/api-types 0.0.0-canary.ce7c9749 → 0.0.0-canary.d190ee29

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.
@@ -124,6 +124,8 @@ export const $AccountResponseDto = {
124
124
  'STUDENT_LOAN',
125
125
  'CREDIT_CARD',
126
126
  'PERSONAL_LOAN',
127
+ 'ACCOUNTS_PAYABLE',
128
+ 'TAX_PAYABLE',
127
129
  'OTHER'
128
130
  ],
129
131
  nullable: true,
@@ -395,9 +397,47 @@ export const $AccountStandardResponseDto = {
395
397
  type: 'string',
396
398
  description: 'Icon identifier for UI display',
397
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'
398
438
  }
399
439
  },
400
- required: ['path', 'type', 'description', 'tags', 'icon']
440
+ required: ['path', 'type', 'description', 'tags', 'icon', 'productCategory']
401
441
  } as const;
402
442
 
403
443
  export const $AccountStandardListResponseDto = {
@@ -4083,6 +4123,50 @@ export const $DeleteOwnUserDto = {
4083
4123
  required: ['accessToken']
4084
4124
  } as const;
4085
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
+
4086
4170
  export const $SignupDto = {
4087
4171
  type: 'object',
4088
4172
  properties: {
@@ -4888,6 +4972,69 @@ export const $TestRuleResponseDto = {
4888
4972
  required: ['ruleId', 'matches', 'confidence', 'matchDetails']
4889
4973
  } as const;
4890
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
+
4891
5038
  export const $CreateBeanEventDto = {
4892
5039
  type: 'object',
4893
5040
  properties: {
@@ -5630,7 +5777,8 @@ export const $UpdateMapperDefaultsDto = {
5630
5777
  type: 'string',
5631
5778
  description: 'Source account for transactions (Beancount format)',
5632
5779
  example: 'Assets:CN:Alipay:Balance',
5633
- 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-]*)+$'
5634
5782
  },
5635
5783
  currency: {
5636
5784
  type: 'string',
@@ -5644,13 +5792,15 @@ export const $UpdateMapperDefaultsDto = {
5644
5792
  type: 'string',
5645
5793
  description: 'Default expense account (optional)',
5646
5794
  example: 'Expenses:Unknown',
5647
- 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-]*)+$'
5648
5797
  },
5649
5798
  incomeAccount: {
5650
5799
  type: 'string',
5651
5800
  description: 'Default income account (optional)',
5652
5801
  example: 'Income:Unknown',
5653
- 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-]*)+$'
5654
5804
  },
5655
5805
  methodAccountMapping: {
5656
5806
  type: 'object',
@@ -5707,12 +5857,14 @@ export const $ProviderSyncConfigDto = {
5707
5857
  },
5708
5858
  defaultExpenseAccount: {
5709
5859
  type: 'string',
5710
- 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).',
5711
5862
  example: 'Expenses:Unknown'
5712
5863
  },
5713
5864
  defaultIncomeAccount: {
5714
5865
  type: 'string',
5715
- 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).',
5716
5868
  example: 'Income:Unknown'
5717
5869
  },
5718
5870
  filterPending: {
@@ -5727,12 +5879,7 @@ export const $ProviderSyncConfigDto = {
5727
5879
  example: 'acc_gocardless_001'
5728
5880
  }
5729
5881
  },
5730
- required: [
5731
- 'sourceAccount',
5732
- 'defaultCurrency',
5733
- 'defaultExpenseAccount',
5734
- 'defaultIncomeAccount'
5735
- ]
5882
+ required: ['sourceAccount', 'defaultCurrency']
5736
5883
  } as const;
5737
5884
 
5738
5885
  export const $ProviderSyncDto = {
@@ -5942,15 +6089,105 @@ export const $UncoveredFormatMissDto = {
5942
6089
  properties: {}
5943
6090
  } as const;
5944
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
+
5945
6175
  export const $ProcessNlpDto = {
5946
6176
  type: 'object',
5947
6177
  properties: {
5948
6178
  message: {
5949
6179
  type: 'string',
5950
- description: 'Natural language text describing a transaction (Chinese)',
5951
- 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',
5952
6183
  maxLength: 500
5953
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
+ },
5954
6191
  sessionId: {
5955
6192
  type: 'string',
5956
6193
  description:
@@ -5958,17 +6195,32 @@ export const $ProcessNlpDto = {
5958
6195
  example: 'session_abc123'
5959
6196
  },
5960
6197
  parsedData: {
5961
- type: 'object',
5962
6198
  description:
5963
6199
  'Parsed data from previous NLP response for session recovery. Send back the parsedData received in confirm_payee/confirm responses.',
5964
6200
  example: {
5965
6201
  amount: 35,
5966
6202
  currency: 'CNY',
5967
6203
  payee: 'Starbucks'
5968
- }
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'
5969
6222
  }
5970
- },
5971
- required: ['message']
6223
+ }
5972
6224
  } as const;
5973
6225
 
5974
6226
  export const $NlpTransactionInfoDto = {
@@ -6290,7 +6542,8 @@ export const $NlpAccountConfirmationDataDto = {
6290
6542
  },
6291
6543
  suggestedAccount: {
6292
6544
  type: 'string',
6293
- description: 'Suggested replacement account',
6545
+ description:
6546
+ 'Suggested replacement account (omitted when no clear candidate)',
6294
6547
  example: 'Expenses:Food:Drinks'
6295
6548
  },
6296
6549
  similarAccounts: {
@@ -6312,7 +6565,6 @@ export const $NlpAccountConfirmationDataDto = {
6312
6565
  },
6313
6566
  required: [
6314
6567
  'invalidAccount',
6315
- 'suggestedAccount',
6316
6568
  'similarAccounts',
6317
6569
  'errorMessage',
6318
6570
  'transactionContext'
@@ -6485,7 +6737,8 @@ export const $NlpSuggestedAccountDto = {
6485
6737
  },
6486
6738
  confidence: {
6487
6739
  type: 'number',
6488
- 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)',
6489
6742
  example: 0.9
6490
6743
  }
6491
6744
  },
@@ -6521,23 +6774,31 @@ export const $NlpDefaultAccountsDto = {
6521
6774
  properties: {
6522
6775
  asset: {
6523
6776
  type: 'string',
6524
- description: 'Default asset account',
6525
- 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
6526
6781
  },
6527
6782
  expense: {
6528
6783
  type: 'string',
6529
- description: 'Default expense account',
6530
- 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
6531
6788
  },
6532
6789
  income: {
6533
6790
  type: 'string',
6534
- description: 'Default income account',
6535
- 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
6536
6795
  },
6537
6796
  liability: {
6538
6797
  type: 'string',
6539
- description: 'Default liability account',
6540
- 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
6541
6802
  }
6542
6803
  },
6543
6804
  required: ['asset', 'expense', 'income', 'liability']
@@ -6577,7 +6838,7 @@ export const $NlpResponseDto = {
6577
6838
  type: 'string',
6578
6839
  description:
6579
6840
  'Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.',
6580
- enum: ['transfer', 'banking', 'investment'],
6841
+ enum: ['transfer', 'banking', 'investment', 'lend', 'lend_collect'],
6581
6842
  example: 'investment'
6582
6843
  },
6583
6844
  liabilitySubType: {
@@ -6725,7 +6986,7 @@ export const $NlpResponseDto = {
6725
6986
  },
6726
6987
  suggestedAccounts: {
6727
6988
  description:
6728
- '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.',
6729
6990
  allOf: [
6730
6991
  {
6731
6992
  $ref: '#/components/schemas/NlpSuggestedAccountsDto'
@@ -6734,7 +6995,7 @@ export const $NlpResponseDto = {
6734
6995
  },
6735
6996
  defaultAccounts: {
6736
6997
  description:
6737
- '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.',
6738
6999
  allOf: [
6739
7000
  {
6740
7001
  $ref: '#/components/schemas/NlpDefaultAccountsDto'
@@ -6780,13 +7041,26 @@ export const $PlatformListItemDto = {
6780
7041
  suggestedSegment: {
6781
7042
  type: 'string',
6782
7043
  description:
6783
- '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")'
6784
7045
  },
6785
7046
  logoUrl: {
6786
7047
  type: 'string',
6787
7048
  description: 'Logo URL',
6788
7049
  nullable: true
6789
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
+ },
6790
7064
  isBound: {
6791
7065
  type: 'boolean',
6792
7066
  description: 'Whether user has accounts using this platform'
@@ -6800,6 +7074,8 @@ export const $PlatformListItemDto = {
6800
7074
  'canonical',
6801
7075
  'suggestedSegment',
6802
7076
  'logoUrl',
7077
+ 'countryCode',
7078
+ 'category',
6803
7079
  'isBound'
6804
7080
  ]
6805
7081
  } as const;
@@ -6835,13 +7111,26 @@ export const $PlatformMatchResultDto = {
6835
7111
  suggestedSegment: {
6836
7112
  type: 'string',
6837
7113
  description:
6838
- 'Suggested path segment — canonical, already in ACCOUNT_RE format'
7114
+ 'Suggested path segment — canonical PascalCased per hyphen-part, hyphens preserved (e.g. "Apple-Pay")'
6839
7115
  },
6840
7116
  logoUrl: {
6841
7117
  type: 'string',
6842
7118
  description: 'Logo URL',
6843
7119
  nullable: true
6844
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
+ },
6845
7134
  matchType: {
6846
7135
  type: 'string',
6847
7136
  description: "How this row matched: 'exact' > 'prefix' > 'substring'",
@@ -6855,6 +7144,8 @@ export const $PlatformMatchResultDto = {
6855
7144
  'type',
6856
7145
  'suggestedSegment',
6857
7146
  'logoUrl',
7147
+ 'countryCode',
7148
+ 'category',
6858
7149
  'matchType'
6859
7150
  ]
6860
7151
  } as const;
@@ -8103,3 +8394,146 @@ export const $AnonymousLoginResponseDto = {
8103
8394
  },
8104
8395
  required: ['authToken']
8105
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;