@firela/api-types 0.0.0-canary.84b23d91 → 0.0.0-canary.888f4d12

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.
package/dist/index.js CHANGED
@@ -556,7 +556,7 @@ var BeanAccountsService = class {
556
556
  }
557
557
  /**
558
558
  * Delete account
559
- * Deletes an account (only if no transactions)
559
+ * Deletes an account (only if no active transactions; voided/superseded residual postings are cleaned up)
560
560
  * @param data The data for the request.
561
561
  * @param data.id Account UUID
562
562
  * @param data.region Region code for tenant context
@@ -573,7 +573,7 @@ var BeanAccountsService = class {
573
573
  },
574
574
  errors: {
575
575
  404: "Account not found",
576
- 409: "Account has transactions and cannot be deleted"
576
+ 409: "Account has active transactions and cannot be deleted"
577
577
  }
578
578
  });
579
579
  }
package/dist/index.mjs CHANGED
@@ -524,7 +524,7 @@ var BeanAccountsService = class {
524
524
  }
525
525
  /**
526
526
  * Delete account
527
- * Deletes an account (only if no transactions)
527
+ * Deletes an account (only if no active transactions; voided/superseded residual postings are cleaned up)
528
528
  * @param data The data for the request.
529
529
  * @param data.id Account UUID
530
530
  * @param data.region Region code for tenant context
@@ -541,7 +541,7 @@ var BeanAccountsService = class {
541
541
  },
542
542
  errors: {
543
543
  404: "Account not found",
544
- 409: "Account has transactions and cannot be deleted"
544
+ 409: "Account has active transactions and cannot be deleted"
545
545
  }
546
546
  });
547
547
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firela/api-types",
3
- "version": "0.0.0-canary.84b23d91",
3
+ "version": "0.0.0-canary.888f4d12",
4
4
  "description": "TypeScript types generated from IGN OpenAPI specification",
5
5
  "license": "MIT",
6
6
  "author": "FireLa Team",
@@ -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,14 +6195,18 @@ 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
+ ]
5969
6210
  },
5970
6211
  selectedRuleId: {
5971
6212
  type: 'string',
@@ -5979,8 +6220,7 @@ export const $ProcessNlpDto = {
5979
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.',
5980
6221
  example: 'Expenses:Food:Coffee'
5981
6222
  }
5982
- },
5983
- required: ['message']
6223
+ }
5984
6224
  } as const;
5985
6225
 
5986
6226
  export const $NlpTransactionInfoDto = {
@@ -6497,7 +6737,8 @@ export const $NlpSuggestedAccountDto = {
6497
6737
  },
6498
6738
  confidence: {
6499
6739
  type: 'number',
6500
- 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)',
6501
6742
  example: 0.9
6502
6743
  }
6503
6744
  },
@@ -6533,23 +6774,31 @@ export const $NlpDefaultAccountsDto = {
6533
6774
  properties: {
6534
6775
  asset: {
6535
6776
  type: 'string',
6536
- description: 'Default asset account',
6537
- 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
6538
6781
  },
6539
6782
  expense: {
6540
6783
  type: 'string',
6541
- description: 'Default expense account',
6542
- 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
6543
6788
  },
6544
6789
  income: {
6545
6790
  type: 'string',
6546
- description: 'Default income account',
6547
- 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
6548
6795
  },
6549
6796
  liability: {
6550
6797
  type: 'string',
6551
- description: 'Default liability account',
6552
- 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
6553
6802
  }
6554
6803
  },
6555
6804
  required: ['asset', 'expense', 'income', 'liability']
@@ -6737,7 +6986,7 @@ export const $NlpResponseDto = {
6737
6986
  },
6738
6987
  suggestedAccounts: {
6739
6988
  description:
6740
- '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.',
6741
6990
  allOf: [
6742
6991
  {
6743
6992
  $ref: '#/components/schemas/NlpSuggestedAccountsDto'
@@ -6746,7 +6995,7 @@ export const $NlpResponseDto = {
6746
6995
  },
6747
6996
  defaultAccounts: {
6748
6997
  description:
6749
- '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.',
6750
6999
  allOf: [
6751
7000
  {
6752
7001
  $ref: '#/components/schemas/NlpDefaultAccountsDto'
@@ -6792,13 +7041,26 @@ export const $PlatformListItemDto = {
6792
7041
  suggestedSegment: {
6793
7042
  type: 'string',
6794
7043
  description:
6795
- '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")'
6796
7045
  },
6797
7046
  logoUrl: {
6798
7047
  type: 'string',
6799
7048
  description: 'Logo URL',
6800
7049
  nullable: true
6801
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
+ },
6802
7064
  isBound: {
6803
7065
  type: 'boolean',
6804
7066
  description: 'Whether user has accounts using this platform'
@@ -6812,6 +7074,8 @@ export const $PlatformListItemDto = {
6812
7074
  'canonical',
6813
7075
  'suggestedSegment',
6814
7076
  'logoUrl',
7077
+ 'countryCode',
7078
+ 'category',
6815
7079
  'isBound'
6816
7080
  ]
6817
7081
  } as const;
@@ -6847,13 +7111,26 @@ export const $PlatformMatchResultDto = {
6847
7111
  suggestedSegment: {
6848
7112
  type: 'string',
6849
7113
  description:
6850
- 'Suggested path segment — canonical, already in ACCOUNT_RE format'
7114
+ 'Suggested path segment — canonical PascalCased per hyphen-part, hyphens preserved (e.g. "Apple-Pay")'
6851
7115
  },
6852
7116
  logoUrl: {
6853
7117
  type: 'string',
6854
7118
  description: 'Logo URL',
6855
7119
  nullable: true
6856
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
+ },
6857
7134
  matchType: {
6858
7135
  type: 'string',
6859
7136
  description: "How this row matched: 'exact' > 'prefix' > 'substring'",
@@ -6867,6 +7144,8 @@ export const $PlatformMatchResultDto = {
6867
7144
  'type',
6868
7145
  'suggestedSegment',
6869
7146
  'logoUrl',
7147
+ 'countryCode',
7148
+ 'category',
6870
7149
  'matchType'
6871
7150
  ]
6872
7151
  } as const;
@@ -8115,3 +8394,146 @@ export const $AnonymousLoginResponseDto = {
8115
8394
  },
8116
8395
  required: ['authToken']
8117
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;