Post or update ancillary bids for a given virtual asset.
Post or update ancillary bids for a virtual asset
The endpoint expects a list of ancillary bids.
The endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT).
Request body
The request body is a list of ancillary product bids you would like to place.
You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests.
product:
- aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format:
{{direction}}_{{quarterHourInDay}}, e.g.POS_001for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days arePOS_096orNEG_096. The final products on the CET to CEST clock change day arePOS_092orNEG_092. The final products on the CEST to CET clock change day arePOS_100orNEG_100. - aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format:
{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}, e.g.POS_00_04for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24. - FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format:
{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}, e.g.NEGPOS_00_04for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24.
deliveryDay: The delivery day of the bid. It must be in the format YYYY-MM-DD, e.g. 2026-05-30 (full day according to RFC3339).
bids: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of maxBidsPerProduct setting on the virtual asset.
Each bid in the list contains the following fields whose contents can vary depending on the market:
offeredCapacity:
The offered capacity of the bid in kilowatts, e.g. 2000.
The value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected.
capacityPrice:
The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (< 0), you pay the TSO.
- aFRR Energy: This field can be removed or left as
null. - aFRR Capacity: The capacity price of the bid in EUR/MW/h, e.g.
100.00. This price is used to determine the position of the bid in the TSO’s merit order. - FCR: The capacity price of the FCR bid in EUR/MW, e.g.
100.00. This price is used to determine the position of the bid in the TSO’s merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below.
energyPrice:
The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (< 0), you pay the TSO.
- aFRR Energy: The energy price of the bid in EUR/MWh, e.g.
100.00. This price is used to determine the position of the bid in the TSO’s merit order. - aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in EUR/MWh, e.g.
100.00. - FCR: This field can be removed or left as
null.
Bidding deadlines
aFRR Energy
All bids must be placed before the following deadline: 30 minutes before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after 12:00pm CET/CEST on the day before delivery. If bids are made before that time, they are rejected.
aFRR Capacity
All bids must be placed before the following deadline: 8:40am CET/CEST on the day before delivery. The auction opens a week before the delivery day.
FCR
All bids must be placed before the following deadline: 7:30 am CET/CEST on the day before delivery. The auction opens a week before the delivery day.
Additional context for aFRR bids
aFRR Capacity bids and implicit aFRR Energy bids
When submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid.
This is done by providing a mandatory energyPrice on each Capacity bid. You do not need to submit the implicit Energy bids yourself, they are automatically created upon submission of an aFRR Capacity bid and returned as part of the response body.
Each of the 16 Energy bids will have the same offeredCapacity as the corresponding Capacity bid.
These Energy bids can still be updated in their energyPrice and offeredCapacity after the Capacity bid has received a result. However, if the Capacity bid was accepted, the offeredCapacity of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected.
Individual aFRR Energy bids
You may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid.
These must be submitted within the aFRR Energy bidding deadlines.
Determining available bidding capacity
Individual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation.
Combined validation: Validation 1 + 2 in a single step (recommended)
We recommend a simplified validation process which combines the individual market validation and the cross-market validation.
The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailableMinusFcr, afrrPosCapacityAvailableMinusFcr and fcrCapacityAvailable respectively.
These categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation.
Example:
maxTotalAncillaryCapacityDischargeAvailable: 5000 kWmaxTotalAncillaryCapacityChargeAvailable: 5000 kWfcrCommitmentforNEGPOS_00_04: 4000 kWafrrPosCapacityAvailable: 3000 kWafrrNegCapacityAvailable: 3000 kWafrrPosCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW))afrrNegCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW))- Remaining capacity for product
POS_00_04: 1000 kW - Remaining capacity for products
POS_001-POS_016: 1000 kW - Remaining capacity for product
NEG_00_04: 1000 kW - Remaining capacity for products
NEG_001-NEG_016: 1000 kW
As becomes clear from the example, the minusFcr timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the minusFcr timeseries ensures your aFRR bids will pass both validations.
The following formula is used for this calculation:
afrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable)
afrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable)
Two step validation (more complex)
Validation 1: Individual market validation
The offeredCapacity for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset.
The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailable, afrrPosCapacityAvailable and fcrCapacityAvailable respectively.
Example:
afrrPosCapacityAvailablefrom 00:00-04:00 am: 4000 kWafrrNegCapacityAvailablefrom 00:00-04:00 am: 5000 kW- Remaining capacity for product
POS_00_04: 4000 kW - Remaining capacity for products
POS_001-POS_016: 4000 kW - Remaining capacity for product
NEG_00_04: 5000 kW - Remaining capacity for products
NEG_001-NEG_016: 5000 kW
Validation 2: Cross-market validation
The offeredCapacity for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset.
An aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity.
An aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity.
An FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity.
The max total ancillary capacity can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category maxTotalAncillaryCapacityChargeAvailable (negative direction) and maxTotalAncillaryCapacityDischargeAvailable (positive direction) respectively.
Example:
maxTotalAncillaryCapacityDischargeAvailable: 5000 kWmaxTotalAncillaryCapacityChargeAvailable: 4000 kWfcrCommitmentforNEGPOS_00_04: 3000 kWafrrPosCapacityAvailable: 3000 kWafrrNegCapacityAvailable: 3000 kW- Remaining capacity for product
POS_00_04: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for products
POS_001-POS_016: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for product
NEG_00_04: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) - Remaining capacity for products
NEG_001-NEG_016: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))
Deleting bids
To delete a bid, set the bid body as an empty array:
[
{
"bids": [],
"deliveryDay": "2026-04-10",
"product": "POS_00_04"
}
]
Ancillary commitments and wholesale capacity
Behaviour during full availability
Once a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted.
You can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained.
You can check your ancillary commitments per market through the operationalData endpoint on the virtual asset, by requesting the following categories: fcrCommitment, afrrPosCommitment, afrrNegCommitment.
You can check your available wholesale capacity by requesting the following categories: wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable.
If you place a FCR bid, the value of the fcrCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity.
If you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the afrrNegCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable operational data timeseries is reduced by offeredCapacity.
If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the afrrPosCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity.
Behaviour during unavailability
If a virtual asset is affected by an unavailability, we may:
1, Reduce a result to a lower acceptedCapacity and adjust the ancillary commitments timeseries accordingly.
2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly.
Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids.
To be informed about the state of your ancillary commitments and the available wholesale capacity, make sure to always monitor the following operational data categories: afrrPosCommitment, afrrNegCommitment, fcrCommitment, wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable.
Response format
Returns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields:
bidID: The uuid of the individual product bid.
market: The market of the submitted product bid. One of: AFRRCapacity, AFRREnergy, FCR.
status:
- The status of the bid, one of:
pending,submitted. submittedconfirms that the bid has been placed successfully with the TSO.pendingindicates that the process of placing the bid with the TSO is still in progress. While a bid has statuspending, it cannot be updated to avoid double bidding.
Headers
Access token
Path Parameters
Organisation ID
Virtual Asset ID
Body
Bids to be posted or updated