The price file
Every number on this site is read out of one public JSON file. It is not an API we built for you — it is the file the board itself fetches, and you are welcome to fetch the same one.
No key. No signup. No quota. It is a static file served with an open
Access-Control-Allow-Origin, so a browser can read it straight from your own page.
There is no /api/ path and no versioned endpoint hiding behind this one — this URL is
all there is.
How often it changes
A scan runs every 15 minutes and rewrites the file. A platform whose scrape fails keeps its
previous number and gets an age_min in minutes; past three hours it is also flagged
stale and drops out of the rankings. Polling faster than the scan gains you nothing.
What is in it
| Field | What it holds |
|---|---|
generated_at | ISO-8601 UTC timestamp of the scan that wrote the file. |
count | How many platforms are in platforms. |
platforms | The array below — one object per platform. |
stats | live / stale / no_data counts for this scan. |
meta | The volumes and terms the board uses, and the ratios that fill gaps. |
filled | How many price cells in this scan are estimates rather than quotes. |
errors | Scrapers that failed outright, empty when they all ran. |
Each entry in platforms:
| Field | What it holds |
|---|---|
platform_id | Our slug, stable and lower-case — netts, tr_energy. Key on this. |
platform_name | How the platform spells itself. |
url | The platform's own page, no referral code attached. |
referral_url | Our paid link, or an empty string. See has_referral. |
has_referral | true when that platform pays us for a click. It changes nothing about the price or the order. |
<volume>_<term>_price | Price in TRX as a number, or the string "N/A". Volumes are 65k and 130k; terms are 15m, 1h, 1d, 3d, 10d. Ten keys per platform. |
estimated_keys | Which of those ten we worked out from the platform's other rates instead of reading a quote. The board marks them ≈. |
price_note | A sentence from the scraper when the quote needs explaining — a minimum order, a members-only rate, a deposit. Empty for most. |
minimum_order_energy, maximum_order_energy | Order limits in energy units, or "N/A". |
ts | When this platform in particular was last read. |
age_min | Minutes since that read. |
stale | true once that read is older than three hours. |
has_prices | false when the scan produced no number at all for this platform. |
Two history files sit alongside it and carry the same platform ids:
history_7d.json at 15-minute resolution and
history_30d.json hourly. Both are keyed
services_data[<platform_id>][<price_key>] as arrays of
[epoch_ms, price_or_null], with market medians under aggregates.
Reading it
curl -s https://energypriceboard.com/result.json \
| jq '[.platforms[] | select(.["65k_1h_price"] | type == "number")]
| sort_by(.["65k_1h_price"])[0]
| {platform_name, price: .["65k_1h_price"]}'
const r = await fetch('https://energypriceboard.com/result.json');
const { platforms } = await r.json();
const live = platforms.filter(p => typeof p['65k_1h_price'] === 'number' && !p.stale);
console.log(live.sort((a, b) => a['65k_1h_price'] - b['65k_1h_price'])[0]);
Two things worth guarding for: a price can be the string "N/A" rather than a
number, and a platform can be stale while still carrying its last known price. Check
the type, and check the flag.
What we do not promise
This file is not versioned and we will not pretend otherwise. When the board needs a new field it appears; if a field stops earning its place it goes; if we change how a price is derived, the number changes with it. Nothing here is a contract, and there is no deprecation window — the board is the only consumer we design for. If that matters to your build, pin a copy on your own side.
Using the data
The prices are facts read from public pages, and we claim nothing over a fact. The compilation — the ids, the normalised terms, the estimates and the history — is ours, and the Terms of Service ask one thing in return: if you publish it anywhere, put a visible link back to energypriceboard.com. That is the whole licence.
We have no rate limit of our own, but be reasonable: it is a static file behind a CDN and it only changes four times an hour. If something breaks or a field confuses you, write to fivex56@gmail.com — we would rather know.
Related: which platforms run an API of their own · building a bot against them · the board.