The Time Series API lets you record scalar and composite values against instruments over time. Scalar values hold a single number per data point; composite values bundle multiple named fields into one record.
Series types define named time series tracked against instruments (e.g. close-price, volume). They are created by workspace Editors and read by all robot roles.
GET/seriesList series typesViewer+▶
GET/series/{id}Get a series typeViewer+▶
POST/series/filterFilter series typesViewer+▶
POST/series/countCount series typesViewer+▶
Composite Value Schemas read-only
Composite series types have a schema defining the named fields within each composite value record. Read these to understand what items to include when creating composite values.
GET/time-series-type-fieldsList composite type fieldsViewer+▶
GET/time-series-type-fields/{id}Get a composite type fieldViewer+▶
POST/time-series-type-fields/filterFilter composite type fieldsViewer+▶
Scalar Values
Scalar time series values associate a single numeric value with an instrument at a specific point in time. Each value belongs to a series type and an instrument.
GET/time-series-valuesList scalar valuesViewer+▶
POST/time-series-valuesCreate a scalar valueMember▶
Records a new time series data point. Use PATCH to update an existing value at the same timestamp.
Composite time series values group multiple named field values (e.g. OHLCV bars) into a single timestamped record. Each record has a type and instrument; the individual field values are stored as items.
When creating a composite value, supply all required fields in the items array in a single request. Missing required fields return 422 Unprocessable Entity.
Individual field values within a composite record. Items are normally managed through the parent composite value endpoints, but can be accessed directly for filtering and auditing.
GET/composite-time-series-value-itemsList composite value itemsViewer+▶
GET/composite-time-series-value-items/{id}Get a composite value itemViewer+▶
POST/composite-time-series-value-items/filterFilter composite value itemsViewer+▶
POST/composite-time-series-value-items/countCount composite value itemsViewer+▶
Time Series Tags & Assignments
Time series types can be tagged the same way instruments are. Tags are hierarchical and workspace-scoped.
GET/time-series-tagsList time series tagsViewer+▶
POST/time-series-tagsCreate a time series tagMember▶
GET/time-series-tags/{id}Get a time series tagViewer+▶
PATCH/time-series-tags/{id}Update a time series tagMember▶
POST/time-series-tags/{id}/archiveArchive a time series tagMember▶
POST/time-series-tags/{id}/restoreRestore a time series tagMember▶
DELETE/time-series-tags/{id}Hard delete a time series tagMember▶
GET/series/{typeId}/tagsList tags on a series typeViewer+▶
POST/series/{typeId}/tagsAdd a tag to a series typeMember▶
DELETE/series/{typeId}/tags/{tagId}Remove a tag from a series typeMember▶
PUT/series/{typeId}/tagsBulk replace tags on a series typeMember▶
Sideloading related resources
Time series list, single-resource, and filter endpoints support ?include= for sideloading related resources into a deduplicated included block. See Response envelope & sideloading for the envelope shape, dot-notation rules, dedup semantics, and validation behaviour.
On POST /filter endpoints, pass include as a JSON body array (e.g. "include": ["type", "tags"]) instead of a query string. POST /count endpoints do not support sideloading.
Worked example — units override chain
Each level can declare a units_instrument reference: a series type sets a workspace default via default_units_instrument, an individual composite value can override it via units_instrument, and individual composite items can override it again via their own units_instrument. The new tokens make every layer expressible in a single request:
{
"data": [{
"id": "cv-1",
"series_id": "ohlcv-daily-id",
"units_instrument_id": "usd-id",
"item_ids": ["cvi-open", "cvi-volume"]
}],
"included": {
// series-level default — applies to every value in the series"series": [
{ "id": "ohlcv-daily-id", "default_units_instrument_id": "aud-id" }
],
// the composite-level override (USD) and the series default (AUD), deduped"instruments": [
{ "id": "aud-id", "identifier": "aud" },
{ "id": "usd-id", "identifier": "usd" }
],
// items expanded via include=items (each item may carry its own units_instrument_id)"items": [
{ "id": "cvi-open", "field_key": "open", "units_instrument_id": null },
{ "id": "cvi-volume", "field_key": "volume", "units_instrument_id": "shares-id" }
]
}
}
Resolution from the response: the open item leaves units_instrument_id null, so it inherits the composite-level USD override. The volume item declares its own shares-id, so it overrides both layers. The series default (AUD) only applies to values that don’t set their own units_instrument at any level.
To expand the units and reference instruments referenced from items in the same request, add the dot-notation tokens items.units_instrument and items.ref_instrument:
Expanding item-level instrument references in one request