Assets & Prices
Get Asset
GET /api/assets/:symbol Look up one asset by its symbol — AAPL, BTCUSD — to get its name, classification and market value.
Currency pairs such as EURUSD work too: when no asset record exists for a pair, the endpoint builds one from exchange-rate data — see Polymorphic FX fallback.
Example
curl https://api.bytetree.io/api/assets/AAPL \
-H "Authorization: Bearer YOUR_API_KEY" const res = await fetch("https://api.bytetree.io/api/assets/AAPL", {
headers: { "Authorization": "Bearer YOUR_API_KEY" },
});
const body = await res.json(); import requests
res = requests.get(
"https://api.bytetree.io/api/assets/AAPL",
headers={"Authorization": "Bearer YOUR_API_KEY"},
)
body = res.json() 200 {
"data": {
"symbol": "AAPL",
"name": "Apple Inc.",
"isin": "US0378331005",
"type": "stock",
"status": "active",
"sector": "Technology",
"industry": "Consumer Electronics",
"country": "US",
"region": "North America",
"universes": ["bytetrend"],
"dimensions": {
"raw": { "sector": "Technology", "industry": "Consumer Electronics", "country": "US" },
"override": { "sector": null, "industry": null, "country": null, "region": null }
},
"currency": "USD",
"rawCurrency": "USD",
"metadata": { "exchange": "NASDAQ" },
"mktCap": 3845418304554
}
} Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
symbol |
string |
Yes | Ticker symbol, case-insensitive (AAPL, BTCUSD, EURUSD) |
Response
| Field | Type | Description |
|---|---|---|
data |
object |
The asset document |
The asset object has the same fields as entries in List Assets: identity and classification, currency and rawCurrency, metadata (provider details such as exchange), mktCap, universes[], the dimensions object described below and, for ETFs, the etf object. The latest-metrics fields are left out: mktCapUsd, the Weekly and Daily ByteTrend score, regime and change, and the carry-over fields (dataQuality, carryOverReason, carriedOverFrom). Only list rows carry those. For the full set, use Latest Metrics.
With ?format=csv the document renders as a single row; nested objects flatten to dotted column names (metadata.exchange) — see How CSV is shaped.
Dimensions
region, sector, industry, country and type are the asset’s resolved values in the five global dimensions. type is ByteTree’s own classification and has no other layer. For the other four, the dimensions object exposes what the resolved value was built from:
| Field | Type | Description |
|---|---|---|
dimensions.raw |
object |
Provider-native sector, industry, country (each string | null) |
dimensions.override |
object |
Per-asset curated overrides for sector, industry, country, region (each string | null; null = no override). region has no raw slot because it is derived from country |
The top-level value is the override where one is set, otherwise the raw value (mapped through the dimension’s mapping for region). Always present; all null inside when nothing has been recorded.
ETF exposure
ETF rows (type: "etf") carry an etf object that describes what the fund holds. It is filled in by a monthly classification. Until a fund has been classified, the key is absent. Other asset types never carry it.
An ETF’s top-level sector, industry, country and region describe the issuer, not the holdings. A fund manager is usually Financial Services, and its country is where the fund is registered. To see what a fund invests in, read etf.
| Field | Type | Description |
|---|---|---|
etf.assetClass |
string or null |
One of Equity, Fixed income, Commodities, Alternatives, Real estate, Multi-asset, Currency or Digital assets (spot crypto funds, for example). null when the class is not known |
etf.exposureRegion |
string or null |
Where the fund invests. A single country when it holds 80% or more of the fund’s mapped country weight. Otherwise a single region when one region holds 80% or more. Otherwise "Global". null when the fund has no geographic exposure (gold, for example), or when too little of its country weight can be matched to a known country |
etf.exposureSector |
string or null |
Equity funds only. A single sector when it holds 60% or more of the fund. Otherwise "Theme" for sector or theme funds, or "Broad". null for funds that are not equity, and for equity funds with no sector weights. A null here means the sector is not known, not that the fund is broad |
etf.aum |
number or null |
Assets under management, in US dollars |
etf.expenseRatio |
number or null |
The annual fee in percent: 0.5 means 0.5% a year. Note that this is not a fraction, unlike the weights below |
etf.holdingsCount |
number or null |
Number of holdings |
etf.inceptionDate |
string or null |
Launch date, YYYY-MM-DD |
etf.domicile |
string or null |
Country code where the fund is registered, e.g. IE, US |
etf.etfCompany |
string or null |
The issuer, as reported by the data provider |
etf.sectorWeights |
object[] |
{ key, weight } per sector, with weight a fraction from 0 to 1. It can include a "Cash & Others" entry, the weights can add up to slightly more than 1, and the list can be empty when no sector data is available |
etf.countryWeights |
object[] |
{ key, weight } per country, weight a fraction from 0 to 1. Country names are as the data provider gives them, including "Other". Empty for commodity and crypto funds |
etf.status |
string or null |
classified: class, region and (for equity) sector are all derived. partial: the class is known but the region or sector could not be derived. unclassified: the asset class could not be determined. null only if the stored value is damaged |
etf.classifiedAt |
string or null |
When the fund was last classified (ISO 8601 timestamp). null only if the stored value is damaged |
Weights and counts are rounded below, and the lists are cut short:
{
"data": {
"symbol": "BLKC.AS",
"name": "iShares Blockchain Technology UCITS ETF",
"type": "etf",
"sector": "Financial Services",
"country": "IE",
"region": "Europe",
"etf": {
"assetClass": "Equity",
"exposureRegion": "United States",
"exposureSector": "Financial Services",
"aum": 353944825,
"expenseRatio": 0.5,
"holdingsCount": 40,
"inceptionDate": "2022-09-27",
"domicile": "IE",
"etfCompany": "IShares",
"sectorWeights": [
{ "key": "Financial Services", "weight": 0.6746 },
{ "key": "Technology", "weight": 0.2708 },
{ "key": "Communication Services", "weight": 0.0441 },
"..."
],
"countryWeights": [
{ "key": "United States", "weight": 0.8052 },
{ "key": "Australia", "weight": 0.0887 },
{ "key": "China", "weight": 0.0587 },
"..."
],
"status": "classified",
"classifiedAt": "2026-10-08T10:44:48.752Z"
},
"...": "..."
}
}
Here the fund is registered in Ireland (country: "IE"), but more than 80% of its holdings are in the United States (exposureRegion).
Polymorphic FX fallback
If :symbol is a tracked FX pair (e.g. EURUSD, GBPUSD) and no Asset document exists for it, the endpoint returns a synthesised row built from rate data.
The row carries symbol, name, base, quote, baseName, quoteName, type (fx), currency and rawCurrency (both USD), status, an empty metadata object, and isin, sector, industry, country, region and mktCap, all null. It has no universes or dimensions. name spells out the two currencies (e.g. "Euro / US Dollar"), falling back to slash form (e.g. "AED/USD") where a currency’s name isn’t known; baseName / quoteName are null in that case.
{
"data": {
"symbol": "EURUSD",
"name": "Euro / US Dollar",
"base": "EUR",
"quote": "USD",
"baseName": "Euro",
"quoteName": "US Dollar",
"type": "fx",
"currency": "USD",
"rawCurrency": "USD",
"isin": null,
"sector": null,
"industry": null,
"country": null,
"region": null,
"mktCap": null,
"status": "active",
"metadata": {}
}
}
For currency-only work, GET /api/fx/:symbol is the dedicated endpoint. This endpoint’s fallback exists for callers that resolve mixed asset types through a single path.
Errors
| Status | Description |
|---|---|
404 |
Asset not found and the symbol does not match a known FX pair |