Skip to main content
A customer on a dynamic Nomos plan pays a different price every interval. Showing them that schedule (in your app, on a heat-pump display, in an email) turns a contract feature into a daily habit, and is usually the highest-leverage UI in the whole product. This guide is the smallest version that’s still useful: pull the prices, render a chart, label peak vs. cheap intervals.

What you’ll need

  • An access token. If this is your own backend acting on your organization’s data, Client Credentials is fine. If you’re rendering for a customer who consented through OAuth, use Authorization Code; see the HEMS guide for that flow.
  • An active subscription on a plan that exposes price data.

1. Fetch the price time series

Today + tomorrow is the most useful default range. Tomorrow’s prices appear once the day-ahead auction clears in the early afternoon, after which the full next 24 hours are available at once.
const today = new Date().toISOString().slice(0, 10);
const tomorrow = new Date(Date.now() + 86_400_000).toISOString().slice(0, 10);

const res = await fetch(
  `https://api.nomos.energy/subscriptions/${subscriptionId}/prices?start=${today}&end=${tomorrow}`,
  { headers: { Authorization: `Bearer ${access_token}` } },
);

const { items } = await res.json();
Each interval looks like:
{
  "object": "price_interval",
  "start": "2026-04-28T13:00:00+02:00",
  "end": "2026-04-28T13:15:00+02:00",
  "price": 28.4
}
price is cents per kWh, all-in: it already includes taxes, levies, grid fees, and your plan’s margins. You don’t have to do any further math to show “what the customer actually pays.”
Intervals are 15 minutes long. The EPEX day-ahead auction switched to quarter-hourly products on 1 October 2025, so that’s the native resolution of the underlying market and what we expose. See Price time series for the full schema.

2. Highlight cheap and expensive intervals

A flat list of numbers isn’t useful. The cheapest move: bucket each interval relative to the day’s range and color them.
function classify(prices) {
  const sorted = [...prices.map((p) => p.price)].sort((a, b) => a - b);
  const cheapCutoff = sorted[Math.floor(sorted.length * 0.25)];
  const expensiveCutoff = sorted[Math.floor(sorted.length * 0.75)];

  return prices.map((p) => ({
    ...p,
    band:
      p.price <= cheapCutoff
        ? "cheap"
        : p.price >= expensiveCutoff
          ? "expensive"
          : "normal",
  }));
}
Quartile-bucketing avoids hard-coding thresholds. A €0.20/kWh interval might be cheap in winter and expensive in summer; “today’s bottom quartile” stays meaningful regardless.

3. Render the chart

Any charting library works. With Recharts:
import { Bar, BarChart, XAxis, YAxis, Tooltip } from "recharts";

const colors = { cheap: "#10b981", normal: "#94a3b8", expensive: "#ef4444" };

export function PriceChart({ prices }) {
  const data = classify(prices).map((p) => ({
    time: new Date(p.start).toLocaleTimeString([], { hour: "2-digit" }),
    price: p.price,
    band: p.band,
  }));

  return (
    <BarChart width={720} height={240} data={data}>
      <XAxis dataKey="time" />
      <YAxis unit=" ct" />
      <Tooltip />
      <Bar
        dataKey="price"
        fill="#94a3b8"
        shape={(props) => <rect {...props} fill={colors[props.payload.band]} />}
      />
    </BarChart>
  );
}
For a heat-pump or EV-charger UI without React, the same data shape goes straight into a static SVG, an LED bar, or even a row of LEDs.

4. Refresh sensibly

You don’t need a websocket and you don’t need a polling loop. The day-ahead auction publishes the full next 24 hours once a day, in the early afternoon, and those prices are final. A reasonable refresh policy:
  • Fetch once per day, after the auction clears.
  • Re-fetch on demand if your UI is opened and you don’t yet have tomorrow’s prices.
  • Invalidate explicitly when you receive a subscription.activated or subscription.ended webhook; those flip whether prices are even available.

What’s next

Connect a HEMS

Don’t just display prices: shift the customer’s flexible loads against them.

Show invoices

Pair your price chart with monthly billing summaries.

Subscription state

React to lifecycle changes that affect price availability.

API reference

All query parameters and edge cases for the price endpoint.