A time series REST API that remembers every version

Connect any application, script or BI tool to your time series over plain HTTP and JSON. Read the latest data, or any series exactly as it was known at a past date.

Interactive Swagger documentation of the Timeseries Refinery REST API
Every instance serves its own interactive API documentation (Swagger / OpenAPI).

Why teams use it

Integrate with any stack

Series are identified by name, values travel as JSON, timestamps follow ISO 8601 with their time zone. Any language that speaks HTTP can read and write data: ETL jobs, trading applications, BI tools, cloud functions. There is no proprietary driver to install and no SQL to write.

Read the past as it was

Every series is versioned. One extra parameter returns any series as it was known at a given date: the forecast that was on screen when a decision was made, the data a report was built on. Backtests and audits rely on what was available at the time, not on what is known today.

Every write is traced

Each change to a series creates a new version, stamped with its date and its author. Writing data that has not changed creates nothing. You always know who changed what, and when.

Secure by design

Every script and application gets its own credentials, and read-only, read-write and admin roles control what each of them can do.

See it in action

Reading a wind power forecast, published four times a day, as it was known on 3 October at 09:00:

$ curl -G https://refinery.example.com/api/series/state \
    -H "Authorization: Bearer $TOKEN" \
    --data-urlencode name=power.fr.wind.forecast \
    --data-urlencode from_value_date=2026-10-05T10:00Z \
    --data-urlencode to_value_date=2026-10-05T13:00Z \
    --data-urlencode insertion_date=2026-10-03T09:00Z
{
  "2026-10-05T10:00:00+00:00": 7805.0,
  "2026-10-05T11:00:00+00:00": 7667.0,
  "2026-10-05T12:00:00+00:00": 7533.0,
  "2026-10-05T13:00:00+00:00": 7412.0
}

Writing works the same way. When a provider republishes its data, only what actually changed is stored, and the API answers with exactly that:

$ cat prices.json
{"2026-11-10T00:00Z": 112.4, "2026-11-10T01:00Z": 104.9}
$ curl -X PATCH https://refinery.example.com/api/series/state \
    -H "Authorization: Bearer $TOKEN" \
    --data-urlencode name=power.fr.price.da \
    --data-urlencode author=etl-bot \
    --data-urlencode series@prices.json
{
  "2026-11-10T00:00:00+00:00": 112.4,
  "2026-11-10T01:00:00+00:00": 104.9
}
$ cat prices.json
{"2026-11-10T00:00Z": 112.4, "2026-11-10T01:00Z": 106.2}
$ curl -X PATCH https://refinery.example.com/api/series/state \
    -H "Authorization: Bearer $TOKEN" \
    --data-urlencode name=power.fr.price.da \
    --data-urlencode author=etl-bot \
    --data-urlencode series@prices.json
{
  "2026-11-10T01:00:00+00:00": 106.2
}

What you can do with it

The same operations are available from the Python API, as pandas objects. The complete reference is in the API documentation.

Request a demo Read the API documentation

References

Designed and used by experts from:

TotalEnergies Engie PetroIneos Mercuria eFlower WirelessCar Elax Energie Greenalp EPYR KallistaEnergy

The Timeseries Refinery is an open-source platform for storing, computing and visualising versioned time series data — built for data-driven teams in energy, trading and industry. Its bitemporal storage keeps every version of every series: any series can be queried as it was known at any past date (as-of queries) — and computed series follow the same law: formulas evaluate against the versions known at that date. It provides a traceable formula engine, real-time dashboarding, an Excel client, and full Python and REST APIs. Learn more