Docs/API Reference/Time Series

Time Series

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.

/v1/workspaces/{workspaceId}
Series Types (read-only)Value Type Schemas (read-only)Scalar ValuesComposite ValuesComposite Value ItemsTags & AssignmentsSideloading

Series Types read-only

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.

Request body
{ "instrument_id": "bhp.ax", "type_id": "close-price", "timestamp": "2026-04-15T00:00:00Z", "value": 45.82 }
Response — 201 Created
{ "id": "uuid", "instrument_id": "uuid", "type_id": "uuid", "timestamp": "2026-04-15T00:00:00Z", "value": "45.82", "archived_at": null, "created_at": "2026-04-15T09:30:00Z" }
GET/time-series-values/{id}Get a scalar valueViewer+
PATCH/time-series-values/{id}Update a scalar valueMember
DELETE/time-series-values/{id}Archive a scalar valueMember
POST/time-series-values/{id}/restoreRestore a scalar valueMember
POST/time-series-values/filterFilter scalar valuesViewer+
POST/time-series-values/countCount scalar valuesViewer+

Composite Values

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.
GET/composite-time-series-valuesList composite valuesViewer+
POST/composite-time-series-valuesCreate a composite valueMember

Creates a composite value and all its items atomically. Omitting required fields returns 422.

Request body
{ "instrument_id": "bhp.ax", "type_id": "ohlcv-daily", "timestamp": "2026-04-15T00:00:00Z", "items": [{ "field_key": "open", "value": "45.10" }, { "field_key": "high", "value": "46.20" }, { "field_key": "low", "value": "44.85" }, { "field_key": "close", "value": "45.82" }, { "field_key": "volume", "value": "3240000" }] }
GET/composite-time-series-values/{id}Get a composite valueViewer+
PATCH/composite-time-series-values/{id}Update a composite valueMember
DELETE/composite-time-series-values/{id}Archive a composite valueMember
POST/composite-time-series-values/{id}/restoreRestore a composite valueMember
POST/composite-time-series-values/filterFilter composite valuesViewer+
POST/composite-time-series-values/countCount composite valuesViewer+

Composite Value Items

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.

EndpointTokensDot-notation
/seriestags, default_units_instrument
/time-series-valuestype, tags, series, instrument, units_instrumentinstrument.type, instrument.tags, series.default_units_instrument, series.tags
/composite-time-series-valuestype, tags, series, instrument, units_instrument, itemsinstrument.type, instrument.tags, series.default_units_instrument, series.tags, items.ref_instrument, items.units_instrument
/composite-time-series-value-itemstype, tags, composite_value, ref_instrument, units_instrumentcomposite_value.type, composite_value.series, composite_value.instrument, composite_value.units_instrument, ref_instrument.type
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:

Request — expand the full override chain
GET /v1/workspaces/{workspaceId}/composite-time-series-values ?include=units_instrument,series.default_units_instrument,items
Response — included block (abbreviated)
{ "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
GET /v1/workspaces/{workspaceId}/composite-time-series-values ?include=items,items.units_instrument,items.ref_instrument
PrivacyTermsStatus© 2025 Ptolemy Pty Ltd