Asset Taxonomy Metadata
Overview
Asset taxonomy metadata returns the structure of datonomy itself, rather than the classification of any particular asset. It answers the question: what categories exist, and how do they nest? For a given taxonomy version it returns the complete set of subsectors, each carrying its class, sector, and subsector codes and names, so the full three-level hierarchy can be reconstructed from one response. It is the right source for populating a category picker, validating a code before querying, or labelling classifications retrieved from Asset Taxonomy.
At a Glance
Taxonomy structure (reference data)
Taxonomy versions
Reference data, changes only when a new taxonomy version is published
Categorical (codes and names)
/taxonomy-metadata/assets
Schema
The response returns one object per taxonomy version. Each object carries the version's effective window and the complete list of its subsectors, flattened so that every entry repeats its parent class and sector.
taxonomy_version
string
Version identifier, in <major>.<minor> form.
Required
taxonomy_start_time
string (date-time)
Date from which this taxonomy version is in effect.
Required. Served as YYYY-MM-DD
taxonomy_end_time
string (date-time)
Date at which this version stopped being in effect. Absent for the current version. See Version windows.
Optional. Served as YYYY-MM-DD
subsectors
array[object]
Every subsector defined in this version, ordered by subsector_id. See the sub-fields below.
Required
subsectors sub-fields
Each element of the subsectors array is one leaf of the hierarchy, denormalized to carry its full ancestry.
class_id
string
Two-digit code for the class.
Optional
class
string
First level of the taxonomy, describing the asset's fundamental purpose.
Optional
sector_id
string
Four-digit code for the sector. The first two digits are the class_id.
Optional
sector
string
Second level of the taxonomy, describing the asset's focus area within its class.
Optional
subsector_id
string
Six-digit code for the subsector. The first four digits are the sector_id.
Optional
subsector
string
Third level of the taxonomy, describing the asset's specific product, service, or function.
Optional
Methodology
One row per subsector, ancestry repeated
The taxonomy is authored as a tree of classes, each containing sectors, each containing subsectors. Before it is served, the tree is flattened into one entry per subsector, and each entry is stamped with the names and codes of the sector and class it descends from. The array is then sorted by subsector_id, which also groups it by sector and by class because the codes are positional. Reading the hierarchy back therefore needs no recursion: the distinct pairs of class_id and class are the classes, and the distinct pairs of sector_id and sector are the sectors.
The consequence worth noting is that a class or sector exists in the response only if it has at least one subsector. There is no separate listing of empty branches.
Version windows
Every version has a start time, and every version except the current one has an end time. These windows are validated when the data is loaded, and they must be strictly ordered and must not overlap. Where a version is authored without an explicit end and a later version exists, its end is set to the start of that next version, so the timeline is continuous with no gaps. The current version is served with no taxonomy_end_time at all rather than with an open-ended sentinel value.
Version selection
The version parameter controls which versions are returned:
No
versionand no time parameters: the latest version only.version=<x.y>: that specific version.version=*: every version, which is how to retrieve the full history of the structure.start_timeorend_timewithout an explicitversion: all versions are considered, then filtered by the time range.
A start_time filter keeps versions that begin at or after the given time. An end_time filter keeps only versions that have actually ended, and whose end falls at or before the given time, so the current version is excluded from an end_time query.
Accessing the Data
Asset taxonomy metadata is served by the /taxonomy-metadata/assets endpoint. There are no entity filters. Requests are scoped by version or by a time range over the version windows.
Use .to_list() on this endpoint, not .to_dataframe(). The version time fields are returned as calendar dates with no zone offset, which the client's dataframe conversion cannot parse. The nested subsectors array is also more natural to work with as plain dictionaries.
Responses are paginated by version, so a request for a single version returns a single page. The Python client follows pagination automatically, while direct HTTP callers page through results using next_page_token. Full parameter reference: see the API Reference for /taxonomy-metadata/assets.
Examples
Example: the current taxonomy structure
The latest taxonomy version with its effective window and its subsector list. The subsectors array is truncated to its first four entries here. The live response carries the full set, and taxonomy_end_time is absent because this version is current. Run this query.
Coverage
Usage
This endpoint is the structural companion to Asset Taxonomy. The usual pattern is to read the structure once and the classifications as often as needed.
Load the hierarchy. Call
/taxonomy-metadata/assetsto get every subsector for the current version, and derive the class and sector levels from the distinct codes.Validate or present codes. Use it to populate a category selector, or to check that a
class_ids,sector_ids, orsubsector_idsfilter refers to a code that actually exists before querying classifications.Label historical classifications. When reconstructing point-in-time classifications with
version=*on the assets endpoint, pull the matching versions here so that each historical code is labelled with the names that were in effect at the time.
Limitations
Structure only, no assets. This endpoint never tells you which assets are in a subsector, or how many. That is the Asset Taxonomy endpoint.
Flat, not nested. Classes and sectors are not returned as their own objects. They are recovered from the repeated fields on each subsector, so a branch with no subsectors would not appear at all.
Names can change across versions. A code retains its position in the hierarchy, but its name can be revised in a later version. Code written against category names rather than codes may break across a version change.
FAQ
How do I get the classes and sectors rather than the subsectors?
Take the distinct values from the subsectors array. The pairs of class_id and class give the classes, and the pairs of sector_id and sector give the sectors. The Python Client tab above shows this in two lines.
Why does a sector sometimes have the same name as its subsector?
Where a sector has not been subdivided, it contains a single subsector representing the whole sector, and the name is repeated at both levels. This keeps every asset classified at the same depth.
Why is taxonomy_end_time missing from the response?
The field is present only once a version has been superseded. The current version has no end time.
How do I see how the taxonomy has changed over time?
Pass version=* to return every version with its own effective window and subsector list, then diff the subsector sets between adjacent versions.
Related
datonomy Overview: what datonomy is, how the hierarchy is structured, and how the pieces fit together.
Asset Taxonomy: the classification of each covered asset into this structure.
datonomy Methodology: the published classification methodology.
Last updated

