# Run API demo

> Run a simplified version of our API against a simulated asset under real market conditions. No integration needed.

API reference

Run a simplified version of our API against a simulated asset under real market conditions. **No integration needed.** Make the right calls and see what you could have earned on the market today!

BESS\_01 is a 10 MW, 20 MWh battery already integrated into the EBX Platform, with live and steady telemetry. It is prequalified for **negative aFRR only**, so you earn money by absorbing energy from the grid.

How our market simulation works · Read this first · Hide

The demo replays two real days of the German aFRR market. Here's how that works:

BIDDING DAY · 5 AUG 2026 · The real aFRR capacity auction closes at 09:00 CEST on the day before delivery, and results are published shortly afterwards. Bids are ranked in a **merit order** until demand is met, so the **marginal price** of each 4-hour block and direction decides which of your blocks are awarded. Remuneration is **pay-as-bid**: an awarded block earns your own capacity bid price. · DELIVERY DAY · 6 AUG 2026 · A capacity award **obliges you to offer** the awarded volume as energy in every 15-minute period of that block. The real **activation prices** of the delivery day, and whether the system actually needed positive or negative aFRR, decide which of your energy bids are called. Activated energy is settled at the **marginal price** of that quarter-hour and direction, **not at your bid price**.

**Why we replay past days:** capacity is auctioned and cleared the day before delivery, energy bids close only 25 minutes before each 15-minute delivery period, and activation happens in real time within it. A complete set of real results therefore exists only once the delivery day has passed. Replaying dates in the past (5 and 6 August) lets us demo genuine market outcomes straight away.

[· 01 STATE](#w-step-state0) [· 02 CAP BIDS](#w-step-capbids) [· 03 AWARDS](#w-step-capres) [· 04 ENERGY BIDS](#w-step-enbids) [· 05 ACTIVATIONS](#w-step-enres) [· 06 END STATE](#w-step-stateEnd) [· 07 SETTLE](#w-step-settle)

0 of 7 calls made

## Check your asset status

Everything starts from the physical state of your asset. Read **how much power and energy it has available** before you commit anything to the market.

· 01

### Check the asset

· GET

/v1/assets/{asset\_id}/state · Read the asset state: power, energy available to charge, availability.

Available charging power and headroom are the **physical ceiling on what you can offer**: power caps the MW per block, headroom caps the MWh you can charge before the battery is full.

200 OK · Asset operational · idle at 0.0 MW · SoC 16.0 % · 16.8 MWh to charge

STATE OF CHARGE · 16.0 %

0 % · 100 %

STATUS · Operational ·

POWER · 0.0 MW ·

AVAILABLE · CHARGE · 10 MW ·

HEADROOM · 16.8 MWh ·

## Bid in the market

Bid negative aFRR capacity, then energy in the blocks you win. You can only offer what your asset is able to deliver, so its **available power is your upper limit here**. Finding the most profitable bid within that limit is a complex optimisation problem in practice.

· 02

### Bid aFRR capacity

· POST

/v1/assets/{asset\_id}/markets/afrr/capacity/bids · Bid negative aFRR capacity for each of the delivery day’s six 4-hour blocks.

Each block has a marginal price: you win wherever your bid is at or below it. German aFRR capacity is **pay-as-bid**, so you are paid your own price: bidding low wins more blocks but earns less per MW.

Hint: Capacity marginal prices of the previous day auction

0.48 €/MW/h

00–04

0.55 €/MW/h

04–08

26.07 €/MW/h

08–12

96.48 €/MW/h

12–16

30.15 €/MW/h

16–20

0.41 €/MW/h

20–24

YOUR INPUT

Set a capacity price and the power you offer for each 4-hour block. Use the reference prices above as a guide.

00–04 · 04–08 · 08–12 · 12–16 · 16–20 · 20–24 · Price €/MW/h ·  ·  ·  ·  ·  ·  · Power MW ·  ·  ·  ·  ·  · 

COMMITTED IF FULLY ACTIVATED · 0.0 / 16.8 MWh

A bid is a commitment. Once a block is awarded the TSO can call your full offered power for all four hours, so every block you bid counts here in full, whether or not it is actually called.

Read the reference prices, set your price and power per block, then submit your bids.

201 CREATED · 0 bids submitted

BLOCK · PRODUCT · POWER · PRICE · STATUS

00–04 · aFRR NEG capacity · — · — · No bid

04–08 · aFRR NEG capacity · — · — · No bid

08–12 · aFRR NEG capacity · — · — · No bid

12–16 · aFRR NEG capacity · — · — · No bid

16–20 · aFRR NEG capacity · — · — · No bid

20–24 · aFRR NEG capacity · — · — · No bid

· 03

### Read the auction results

· GET

/v1/assets/{asset\_id}/markets/afrr/capacity/results · Check the auction outcome: which blocks you won, and at what price.

Your bids against the real marginal price of each block, as cleared on the day. You win every block where your price is **at or below it**, and are paid your own bid price for the capacity you reserved.

200 OK · 0 of 0 bids awarded

MERIT ORDER · €/MW/h · MARGINAL PRICE · YOUR BID · AWARDED · NOT AWARDED

0.47

—

00–04 · — · Not bid

0.53

—

04–08 · — · Not bid

44.3

—

08–12 · — · Not bid

96.74

—

12–16 · — · Not bid

37.83

—

16–20 · — · Not bid

0.42

—

20–24 · — · Not bid

· 04

### Bid aFRR energy

· POST

/v1/assets/{asset\_id}/markets/afrr/energy/bids · Place aFRR energy bids for every 4-hour block you won.

A capacity award **obliges you to offer energy** in those blocks, at their **full awarded power**. The TSO activates the cheapest offers first, so a lower price means more activations and more MWh charged. Energy is paid at the period's marginal price. In reality you bid per 15-minute period; this demo simplifies that to one average price per 4-hour block.

Hint: Median and Peak activation price of the previous day

211 €/MWh

147 €/MWh

00–04

179 €/MWh

170 €/MWh

04–08

310 €/MWh

85 €/MWh

08–12

187 €/MWh

0 €/MWh

12–16

317 €/MWh

0 €/MWh

16–20

259 €/MWh

147 €/MWh

20–24

YOUR INPUT

Set an energy price for every block you were awarded. An award obliges its full power in every quarter-hour. Blocks you did not win are locked.

00–04 · 04–08 · 08–12 · 12–16 · 16–20 · 20–24 · Price €/MWh ·  ·  ·  ·  ·  ·  · Power MW· set by your award ·  ·  ·  ·  ·  · 

COMMITTED IF FULLY ACTIVATED · 0.0 / 0.0 MWh

A bid is a commitment. Once a block is awarded the TSO can call your full offered power for all four hours, so every block you bid counts here in full, whether or not it is actually called.

Set your energy price in the awarded blocks, then submit your bids.

201 CREATED · 0 energy bids placed (16 × 15 min per awarded block) · 0 MW

BLOCK · PRODUCT · POWER · PRICE · STATUS

00–04 · aFRR NEG energy · — · — · Not awarded

04–08 · aFRR NEG energy · — · — · Not awarded

08–12 · aFRR NEG energy · — · — · Not awarded

12–16 · aFRR NEG energy · — · — · Not awarded

16–20 · aFRR NEG energy · — · — · Not awarded

20–24 · aFRR NEG energy · — · — · Not awarded

## Deliver & Monitor

Inside each awarded block, energy bids close 25 minutes before delivery, and the TSO activates your asset in real time when the grid needs it. **EBX runs this end to end**, so all that is left for you is to read the results and check the state your asset ends the day in.

· 05

### Read the activations

· GET

/v1/assets/{asset\_id}/markets/afrr/energy/results · Check the aFRR energy auction outcome, and which periods the TSO called over the day.

Your bids against the real activations on the delivery day. You are called wherever your bid is **at or below the activation price**, and paid that marginal price. In reality you bid per 15-minute period; this demo simplifies that to one price per 4-hour block.

200 OK · 0 of 0 offered periods activated · 0.00 MWh

DELIVERY DAY · ACTIVATED · BID · NOT CALLED

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

00–04 · 04–08 · 08–12 · 12–16 · 16–20 · 20–24

ACTIVATED · 0 / 0 ·

ENERGY DELIVERED · 0.00 MWh ·

· 06

### Check the asset again

· GET

/v1/assets/{asset\_id}/state · Read the asset state again and see where the delivery day left the battery.

Every activation charges the battery. What the API returns here is where the day leaves you: the **headroom you have left** is the ceiling on tomorrow’s bids, and every MWh cycled through the battery counts toward its degradation. The ideal optimisation **maximises revenue per cycle**.

200 OK · Asset operational · idle at 0.0 MW · SoC 16.0 % · 16.8 MWh to charge

STATE OF CHARGE · +0.0 % · 16.0 %

·

0 % · 100 %

STATUS · Operational ·

POWER · 0.0 MW ·

AVAILABLE · CHARGE · 10 MW ·

HEADROOM · 16.8 MWh ·

## Settle

One day after delivery, EBX publishes **preliminary** figures per market. The official TSO settlement can take up to a month to arrive.

· 07

### Check the settlement

· GET

/v1/settlements · See the preliminary settlement for the day you bid and delivered.

**Capacity is paid for the award** whether or not you were activated; **energy is paid for what you actually delivered**. Quality deductions appear only after a delivery break.

200 OK · Preliminary total € 0.00

MARKET · BASIS · AMOUNT

aFRR capacity · NEG · 0 blocks · 0 MW · pay-as-bid × 4 h · € 0.00

aFRR energy · NEG · 0 periods · 0.00 MWh charged · avg 0 €/MWh · € 0.00

Quality deductions · No delivery break recorded · € 0.00

Preliminary total · € 0.00

All requests and responses in this demo are **simplified versions of our real API**. Want to try out the real thing?

[API reference →](https://docs.ebx.energy/reference.md)
