Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.
This guide explains how to participate in ancillary service markets at the virtual asset level: which markets you can bid into, which endpoints to implement, how much you can bid, and how bids, results, commitments and activations behave over time.
Ancillary services are a set of markets that are critical for the moment-to-moment balancing of the grid at a stable frequency, voltage and power load to guarantee a reliable power supply. Stabilizing the grid via ancillary services is done by the Transmission Grid Operators (TSO).Bidding into ancillary services is equivalent to offering a certain amount of your available power capacity to the TSO which it can use to balance the grid. This is done via activation signals that are sent by the TSO to a physical asset that has placed a successful ancillary bid. These activation signals have a positive (discharge) or negative (charge) direction as well as a power capacity and must immediately be carried out by the physical asset that receives them.
FCR (Frequency Containment Reserve) is the primary reserve which is activated as a first response to frequency disturbances. It is traded in six 4-hour EFA Blocks that span the entire day.
The product name of an FCR bid consists of the product direction and the EFA block for which the bid is submitted.Since FCR bids are bi-directional, they always have the product direction NEGPOS. That means the capacity offered via an FCR bid can be requested as a positive (discharge) or negative (charge) activation by the TSO.The product name must be in the following format:
{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}
ExampleFor a bid in the FCR market during the first EFA block of the day (00:00-04:00 am CET/CEST), the product name is NEGPOS_00_04. The product name of the sixth and final EFA block is NEGPOS_20_24.
Given their importance as the primary reserve, FCR bids require us to leave an additional 25% wholesale buffer available on top of the offered capacity of the bid.For more details see 8.1 FCR commitment and wholesale buffer.
Results can be expected at or after 8:20 am CET/CEST on the day before delivery day.ExampleFor an FCR bid with delivery day 15.01.2026, results are expected around 8:20 am CET on 14.01.2026.
The FCR auction is a “Pay As Clear” auction and takes place on the day before the delivery day between 8:00 am-8:20 am CET/CEST.During the auction, a settlement price is set for each 4 hour EFA block on the next day.For an accepted bid, this settlement price will be equal to or higher than the capacity price offered on your bid.If a bid is accepted, you are paid the settlementPrice for the whole duration of the delivery period.You are paid for the capacity you reserve, irrespective of the activations your asset delivers.To calculate revenue, use the following formula:
aFRR (automatic Frequency Restoration Reserve) is the secondary reserve which is activated as a secondary response to frequency disturbances, about 30 seconds after the primary reserve (FCR).There are two ways of participating in aFRR: Placing a Capacity bid and/or placing an Energy bid. Let us first take a look at the Capacity bids.
The product name of an aFRR Capacity bid consists of the product direction and the 4-hour EFA block for which the bid is submitted.Since aFRR bids only have one product direction, they will either be POS or NEG. A bid with a positive product direction means you will only receive positive/discharge activations. A bid with a negative product direction means you will only receive negative/charge activations.The product name must be in the following format:
{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}
ExampleFor a bid in the aFRR market during the first EFA block of the day (00:00-04:00 am CET/CEST) with a positive product direction, the product name is POS_00_04. The equivalent bid in the negative product direction would be NEG_00_04.The product names for the sixth and final EFA block are POS_20_24 and NEG_20_24.
When submitting an aFRR Capacity bid, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid. Each aFRR Energy bid has a delivery period of 15 minutes.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.
Results can be expected at or after 9:20 am CET/CEST on the day before the delivery day.ExampleFor an aFRR Capacity bid with delivery day 15.01.2026, results are expected around 9:20 am CET on 14.01.2026.
The aFRR Capacity auction is a “Pay As Bid” auction and takes place on the day before the delivery day between 9:00 am-9:20 am CET/CEST.During the auction, your bid is placed inside a merit order, based on your offered capacity price. Depending on your position in that merit order, your bid is rejected or accepted.If a bid is accepted, you are paid the offered capacity price for each hour of the delivery period.You are paid for the capacity you reserve, irrespective of the activations your asset delivers.To calculate revenue, use the following formula:
aFRR (automatic Frequency Restoration Reserve) is the secondary reserve which is activated as a secondary response to frequency disturbances, about 30 seconds after the primary reserve (FCR).There are two ways of participating in aFRR: Placing a Capacity bid and/or placing an Energy bid. Let us now take a look at the Energy bids.
The product name of an aFRR Energy bid consists of the product direction and the number of the quarter hour in the day for which the bid is submitted.Since aFRR bids only have one product direction, they will either be POS or NEG. A bid with a positive product direction means you will only receive positive/discharge activations. A bid with a negative product direction means you will only receive negative/charge activations.The product name must be in the following format:
{{direction}}_{{quarterHourInDay}}
ExampleFor an aFRR Energy bid during the first quarter hour of the day (00:00-00:15 am CET/CEST) with a positive product direction, the product name is POS_001. The equivalent bid in the negative product direction would be NEG_001.The final product names on most days are POS_096 or NEG_096.The final product names on the CET to CEST clock change day are POS_092 or NEG_092.The final product names on the CEST to CET clock change day are POS_100 or NEG_100.
As explained in 2.2.2 Implicit aFRR Energy bids, aFRR Energy bids can be submitted as part of an aFRR Capacity bid.However, 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.
All bids must be placed 30 minutes before the delivery period. Moreover, bids must be placed after 12:00 pm CET/CEST on the day before delivery. If bids are made before that time, they are rejected.ExampleAn aFRR Energy bid with delivery period 15:30pm must be submitted after 12:00 pm the previous day and before 15:00 pm on the delivery day.
Results can be expected 23 minutes before the start of the delivery period.ExampleFor an aFRR Energy bid with delivery day 15.01.2026 and a delivery period starting at 12:30 pm, results are expected around 12:07 pm on 15.01.2026.
The aFRR Energy auction is Pay As Clear.The settlementPrice for each product is only decided after the delivery period has ended and depends on the activations that have taken place during the delivery period.The settlementPrice can be found in the data center of regelleistung.net. It can also be received through our internal revenue-reporting endpoint if requested. Importantly, it is not part of the response of an aFRR Energy result, since the results are generated before the settlement price is decided.If your bid is accepted, you are not automatically receiving revenue for the delivery period.You are paid only for the activated power you deliver, not the accepted capacity. You can get activation data via our operational data endpoint, as is explained in detail in 10. How do I check activation signals?.To calculate revenue for a single aFRR Energy delivery period, use the following formula:
The following endpoints must be implemented to guarantee a seamless integration with our ancillary services API. By following the implementation guidelines, you can (1) prevent rejection of invalid bids and (2) make sure to bid the maximum capacity into ancillary services at any given point in time.
These endpoints allow you to place and retrieve bids and retrieve results. Updates to existing bids are also placed through the POST endpoint and will replace all previously scheduled bids.
This single endpoint allows you to retrieve all the data you need to (1) place valid ancillary bids and (2) stay informed about potential changes during periods of unavailability.It offers a variety of categories which can be selected via a query parameter. The desired data is returned as a 15 minute based timeseries that always follows the same response format. More details can be found here in the swagger doc.
If your virtual asset has been set up with ancillary capacity, we will validate that the bids you place do not exceed the allocated capacity for each individual market (validation 1) and across all markets (validation 2).There are two ways of getting the necessary data to place valid bids. The simplest and recommended implementation is explained in 4.1 Combined validation, however, the context in 4.2 Two step validation should still be understood to ensure the simplified solution fits your underlying algorithm.
Depending on your underlying optimisation algorithm, you may want to simplify your implementation and combine validation 1 and 2 into a single step.In that case, the following categories are relevant:
fcrCapacityAvailable
afrrPosCapacityAvailableMinusFcr
afrrNegCapacityAvailableMinusFcr
fcrCapacityAvailable returns the max capacity that can be bid into the FCR market. This timeseries is not aware of aFRR commitments, since FCR bidding closes before aFRR Capacity bidding. If you are planning to submit aFRR bids before FCR bids, let us know and we will add a new category.afrrPosCapacityAvailableMinusFcr returns the max capacity that can be bid into the aFRREnergyPos and the aFRRCapacityPos markets while taking into account any FCR commitments and maxTotalCapacity validation.afrrNegCapacityAvailableMinusFcr returns the max capacity that can be bid into the aFRREnergyNeg and the aFRRCapacityNeg markets while taking into account any FCR commitments and maxTotalCapacity validation.The values returned in these timeseries are calculated using the following formula:
ExampleYou want to place a FCR bid for 4000 kW on EFA Block 1. Your virtual asset has a total power capacity of 7000 kW and a maxTotalAncillaryCapacityChargeAvailable of 5000 kW.You query fcrCapacityAvailable and find out you have 4000 kW available during that period.You query wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable and find out you have 7000 kW available for both. After bidding 4000 kW into FCR, you would be left with 3000 kW wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable. You needed at least 1000 kW available in both directions to allow for a 25% wholesale buffer (see 8.1 FCR commitment and wholesale buffer). Your bid does not violate that legal requirement.Your bid passed validation 1 and 2 and is successfully submitted.You now want to place an AFRRNegCapacity bid for 3000 kW on EFA Block 1.You query afrrNegCapacityAvailableMinusFcr and find out you only have 1000 kW available during that period. This is because the initial FCR bid has impacted the max total capacity you are allowed to bid across markets.Your bid for 3000 kW would violate the validation and be rejected.Importantly, with this simplified implementation, you do not need to query the fcrCommitment or maxTotalAncillaryCapacityChargeAvailable since afrrNegCapacityAvailableMinusFcr will already have taken any FCR bids placed into account.
Before placing ancillary bids, you will need to check how much ancillary capacity is available for each individual market on your virtual asset at a given point in time (validation 1). This data can be retrieved by querying the operational data endpoint here. The following categories are relevant:
afrrPosCapacityAvailable
afrrNegCapacityAvailable
fcrCapacityAvailable
afrrPosCapacityAvailable returns the max capacity that can be bid into the AFRREnergyPos and the AFRRCapacityPos markets.afrrNegCapacityAvailable returns the max capacity that can be bid into the AFRREnergyNeg and the AFRRCapacityNeg markets.fcrCapacityAvailable returns the max capacity that can be bid into the FCR market.Each category will return a timeseries of the max capacity that can be bid into the selected market in kilowatts.These timeseries adjust to potential unavailability events that may be affecting the virtual asset.Importantly, these timeseries are not changed when ancillary bids are placed. They always reflect the max capacity of what CAN be bid, NOT what has already been bid.Example 1You query fcrCapacityAvailable and find out you have 2000 kW available during that period. Your bid would fail the first validation.Example 2You want to place a AFRRPosCapacity bid for 3000 kW on EFA Block 1.You query afrrPosCapacityAvailable and find out you have 3000 kW available during that period. Your bid passes the first validation.
In addition to validating available ancillary capacity for the individual markets, you will also need to validate any new ancillary bids against the total ancillary capacity available across markets (validation 2).That means, if you have already placed a bid in FCR, the capacity you can bid into AFRR Pos or Neg may be reduced. This data can be retrieved by querying the operational data endpoint here.The following categories are relevant:
maxTotalAncillaryCapacityChargeAvailable
maxTotalAncillaryCapacityDischargeAvailable
maxTotalAncillaryCapacityChargeAvailable returns the available total capacity for all bids across all markets with a negative product direction: AFRR Neg and FCR.maxTotalAncillaryCapacityDischargeAvailable returns the available total capacity for all bids across all markets with a positive product direction: AFRR Pos and FCR.ExampleYou want to place a FCR bid for 4000 kW on EFA Block 1. Your virtual asset has a total power capacity of 7000 kW and a maxTotalAncillaryCapacityChargeAvailable of 5000 kW.You query fcrCapacityAvailable and find out you have 4000 kW available during that period.You query wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable and find out you have 7000 kW available for both. After bidding 4000 kW into FCR, you would be left with 3000 kW wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable. You needed at least 1000 kW available in both directions to allow for a 25% wholesale buffer (see 8.1 FCR commitment and wholesale buffer). Your bid does not violate that legal requirement.Your bid passed validation 1 and 2 and is successfully submitted.You want to place a AFRRNegCapacity bid for 3000 kW on EFA Block 1.You query maxTotalAncillaryCapacityChargeAvailable and find out you have 5000 kW available during EFA Block 1.You query fcrCommitments and find out you have the 4000 kW FCR bid already placed during EFA Block 1.You query afrrNegCapacityAvailable and find out you have 3000 kW available during that period. Your bid passes the first validation.For the second validation you run the following calculation:
result = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitments), afrrNegCapacityAvailable)
That means the maximum AFRR Neg capacity you are allowed to bid is 1000 kW (minimum((5000 kW - 4000 kW), 3000 kW)).Your bid for 3000 kW would violate the max total ancillary capacity available and be rejected.
To submit, update or delete one or multiple bids in one of the three ancillary markets, use the POST endpoint in the ancillary API here.A detailed explanation of the endpoint, including examples for the request and response body, can be found in our swagger docs.Please keep the following in mind when placing bids:You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests.If any of the bids submitted is invalid, all bids will be rejected.All bids have a status field which allows you to track whether the bid has been successfully submitted to the TSO. If a bid for a product is still being processed, it has status pending. We reject any submissions for the same product until the status has been updated to submitted. This is to prevent double bidding with the TSO.The endpoint combines POST, PUT and DELETE functionality:
POST: If no bids have been submitted for the product, new bids are created.
PUT: If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission. That means, if you have submitted multiple bids for the same product and now want to remove one, send a new POST request with only the bids you want to keep.
DELETE: To delete all bids placed for a product, set the bid body as an empty array (see example in the swagger doc)
To check your submitted bids in any of the three ancillary markets, use the GET endpoint in the ancillary API here.A detailed explanation of the endpoint, including examples for the query parameters and response body, can be found in our swagger docs.You can customize your request by using the following query parameters:
start, end: Set the interval of your query.
markets: Select the markets of the bids you are interested in, e.g. FCR,AFRREnergy. If left empty, returns all markets.
productDirections: Select the product directions of the bids you are interested in, e.g. POS. If left empty, returns all product directions. If an invalid combination of market and product direction is requested, product directions are ignored, e.g. FCR and POS will return all FCR bids.
To check results for your bids in any of the three ancillary markets, use the GET endpoint in the ancillary API here.A detailed explanation of the endpoint, including examples for the query parameters and response body, can be found in our swagger docs.You can customize your request by using the following query parameters:
start, end: Set the interval of your query.
markets: Select the markets of the results you are interested in, e.g. FCR,AFRREnergy. If left empty, returns all markets.
productDirections: Select the product directions of the results you are interested in, e.g. POS. If left empty, returns all product directions. If an invalid combination of market and product direction is requested, product directions are ignored, e.g. FCR and POS will return all FCR results.
The result publication times are listed at the beginning of the document: aFRR Energy, aFRR Capacity, FCR.Please keep in mind that in periods of unavailability, we may (1) reduce the accepted capacity of a result after it has been published or (2) reject a result that was previously accepted. See 9. What is the behaviour during unavailabilities? for a more detailed explanation.
8. How do I check ancillary commitments and remaining wholesale capacity?
Every time you successfully submit a bid, or a bid receives a result, both the ancillary commitment and the available wholesale capacity on the virtual asset are adjusted.You can imagine the available wholesale power capacity as a pool from which the ancillary commitments are drained: When you place a bid, the offered capacity is taken from the wholesale “pool” and added to the ancillary commitment. Likewise, if you receive a rejected result, the capacity is taken from the ancillary commitment and added back to the wholesale “pool”.You can check your ancillary commitments per market through the operational data 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:
The FCR commitment at a given point in time is the summed capacity of all FCR bids without results and all accepted FCR results.If you place a FCR bid, the value of the fcrCommitment timeseries is increased by the offered capacity of the bid.At the same time, both the wholesalePowerCapacityChargeAvailable and the wholesalePowerCapacityDischargeAvailable timeseries are reduced by the offered capacity of the bid.Additionally, we validate that after this reduction at least 25% of the committed FCR capacity still remain as available wholesale capacity. This 25% wholesale buffer is enforced due to a legal requirement from the TSO to guarantee the availability of the FCR response in case of unavailabilities. If, after your FCR bid, the buffer would be below 25%, we reject the bid.Notably, the wholesale buffer is automatically applied to the stateOfEnergyBoundsLower and stateOfEnergyBoundsUpper timeseries which can be queried via the operational data endpoint. These bounds limit the power capacity you can dispatch into wholesale, if your State of Energy is at either of the bounds. To prevent imbalances, we strongly recommend querying these timeseries before placing a wholesale trade. Another way of validating your wholesale trade, which already includes the wholesale buffer, is to compare your planned trade against the maximumDeliverablePower and minimumDeliverablePower timeseries which is available 15 minutes before the start of delivery.To calculate the wholesale buffer do the following calculation:
ExampleYou want to place a FCR bid for 4000 kW on EFA Block 1.You query fcrCapacityAvailable and find out you have 5000 kW available during that period.You query wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable and find out you have 7000 kW available for both. After bidding 4000 kW into FCR, you would be left with 3000 kW wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable.You do the following calculation:
1000 kW = 4000 kW * 0.25
In the example, you needed at least 1000 kW available in both directions to allow for a 25% wholesale buffer. Your bid does not violate that legal requirement.
The aFRR Pos commitment at a given point in time combines both aFRR Pos Energy and aFRR Pos Capacity bids and results and is calculated the following way:
aFRR Pos Capacity commitment: The summed offered capacity of all accepted aFRR Pos Capacity results and all aFRR Pos Capacity bids without a result.
aFRR Pos Energy commitment: The summed offered capacity of all accepted aFRR Pos Energy results and all aFRR Pos Energy bids without a result.
This calculation ensures we always have enough capacity reserved to fulfil the aFRR Pos Capacity commitment which may be relevant in an emergency fallback scenario.
If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the afrrPosCommitment timeseries is increased by the offered capacity of the bid.At the same time, the value of the wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by the offered capacity of the bid.
The aFRR Neg commitment at a given point in time combines both aFRR Neg Energy and aFRR Neg Capacity bids and results and is calculated the following way:
aFRR Neg Capacity commitment: The summed offered capacity of all accepted aFRR Neg Capacity results and all aFRR Neg Capacity bids without a result.
aFRR Neg Energy commitment: The summed offered capacity of all accepted aFRR Neg Energy results and all aFRR Neg Energy bids without a result.
This calculation ensures we always have enough capacity available to fully deliver the aFRR Neg Capacity commitment which may be relevant in an emergency fallback scenario.
If you place an aFRRNegCapacity or an aFRRNegEnergy bid, the value of the afrrNegCommitment timeseries is increased by the offered capacity of the bid.At the same time, the value of the wholesalePowerCapacityChargeAvailable operational data timeseries is reduced by the offered capacity of the bid.
If a virtual asset is affected by an unavailability, we may:
Reduce a result to a lower accepted capacity and adjust the ancillary commitments timeseries accordingly.
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 power capacity before touching the ancillary bids and results.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
stateOfEnergyBoundsUpper
stateOfEnergyBoundsLower
maximumDeliverablePower (available 15 minutes before delivery start)
minimumDeliverablePower (available 15 minutes before delivery start)
Bidding into ancillary services is equivalent to offering a certain amount of your available power capacity to the TSO which it can use to balance the grid. This is done via activation signals that are sent by the TSO to a physical asset that has placed a successful ancillary bid. These activation signals have a positive (discharge) or negative (charge) direction as well as a power capacity and must immediately be carried out by the physical asset that receives them.We will then forward the activation signals to your virtual asset for the bids you have placed.To check activation signals for the relevant markets, query the following operational data categories:
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"terralayr","colors":{"primary":"#13151A","light":"#C2C6CE","dark":"#888C97"},"logo":{"light":"https://mintcdn.com/terralayr-90/i2mowZXsRr_Wp7MC/logo/terralayrDark.svg?fit=max\u0026auto=format\u0026n=i2mowZXsRr_Wp7MC\u0026q=85\u0026s=eb99311be47192737889489eb393e3d4","dark":"https://mintcdn.com/terralayr-90/i2mowZXsRr_Wp7MC/logo/terralayr.svg?fit=max\u0026auto=format\u0026n=i2mowZXsRr_Wp7MC\u0026q=85\u0026s=ec334006d0e1ec6b8461a2016ff25471"},"favicon":"https://mintcdn.com/terralayr-90/6CJgW5GjjTIZDPSq/favicon.svg?fit=max\u0026auto=format\u0026n=6CJgW5GjjTIZDPSq\u0026q=85\u0026s=a4ab56165676d79a829688cf9b6e072a","api":{"params":{"expanded":"all"},"playground":{"display":"interactive"},"examples":{"defaults":"required","prefill":true,"autogenerate":true},"url":"full"},"navbar":{"links":[{"href":"mailto:support@trlyr.com","label":"Support"}],"primary":{"type":"button","label":"Layr Dashboard","href":"https://app.trlyr.com"}},"footer":{"socials":{"website":"https://www.trlyr.com/","github":"https://github.com/terralayr","linkedin":"https://www.linkedin.com/company/terralayr"}},"fonts":{"heading":{"family":"InterDisplay","weight":700,"source":"fonts/PPNeueMontreal-Regular.woff2","format":"woff2"},"body":{"family":"InterDisplay","weight":400,"source":"fonts/PPNeueMontreal-Regular.woff2","format":"woff2"}},"integrations":{"gtm":{"tagId":"GTM-MK2HWCBW"},"intercom":{"appId":"aqinf0la"}},"contextual":{"options":["copy","view","claude","chatgpt","mcp","add-mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"styling":{"latex":true},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"terralayr-90","hasAudioNarration":false,"actualSubdomain":"terralayr-90","customDomains":["docs.trlyr.com"],"gitSource":{"type":"github","owner":"terralayr","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae4a400c2eaceb0e3450bd7","collectionId":"6269c0f9-f523-44e1-830e-eecdedc4dffb","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae4a400c2eaceb0e3450bd7"},"feedback":{"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae4a400c2eaceb0e3450bd7","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"API Reference","count":99},{"language":"default","tag":"Physical Asset Management API","count":36},{"language":"default","tag":"Virtual Assets API","count":33},{"language":"default","tag":"BESS Academy","count":32},{"language":"default","tag":"Product Updates \u0026 Changelog","count":22},{"language":"default","tag":"Layr User Guide","count":13},{"language":"default","tag":"virtual-assets","count":13},{"language":"default","tag":"Revenue Reporting API","count":12},{"language":"default","tag":"revenue","count":12},{"language":"default","tag":"Module 3: The BESS Project Lifecycle","count":10}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@trlyr.com","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"layrUserGuide/features/ancillary-services-virtual-asset-level","slug":"/layrUserGuide/features/ancillary-services-virtual-asset-level","pageMetadata":{"title":"Ancillary services (virtual asset level)","description":"Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.","href":"/layrUserGuide/features/ancillary-services-virtual-asset-level"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This guide explains how to participate in ancillary service markets at the virtual asset level: which markets you can bid into, which endpoints to implement, how much you can bid, and how bids, results, commitments and activations behave over time.`}),`\n`,_jsx(Heading,{level:`1`,id:`1-what-are-ancillary-services`,children:`1. What are ancillary services?`}),`\n`,_jsx(_components.p,{children:`Ancillary services are a set of markets that are critical for the moment-to-moment balancing of the grid at a stable frequency, voltage and power load to guarantee a reliable power supply. Stabilizing the grid via ancillary services is done by the Transmission Grid Operators (TSO).`}),`\n`,_jsx(_components.p,{children:`Bidding into ancillary services is equivalent to offering a certain amount of your available power capacity to the TSO which it can use to balance the grid. This is done via activation signals that are sent by the TSO to a physical asset that has placed a successful ancillary bid. These activation signals have a positive (discharge) or negative (charge) direction as well as a power capacity and must immediately be carried out by the physical asset that receives them.`}),`\n`,_jsx(Heading,{level:`1`,id:`2-which-ancillary-markets-can-i-bid-into`,children:`2. Which ancillary markets can I bid into?`}),`\n`,_jsx(_components.p,{children:`Via our API, you can participate in three ancillary markets that all come with individual product names, bidding deadlines and requirements:`}),`\n`,_jsx(Heading,{level:`2`,id:`2-1-fcr`,children:`2.1 FCR`}),`\n`,_jsx(_components.p,{children:`FCR (Frequency Containment Reserve) is the primary reserve which is activated as a first response to frequency disturbances. It is traded in six 4-hour EFA Blocks that span the entire day.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-1-1-product-names-and-product-direction`,children:`2.1.1 Product names and product direction`}),`\n`,_jsx(_components.p,{children:`The product name of an FCR bid consists of the product direction and the EFA block for which the bid is submitted.`}),`\n`,_jsxs(_components.p,{children:[`Since FCR bids are bi-directional, they always have the product direction `,_jsx(_components.code,{children:`NEGPOS`}),`. That means the capacity offered via an FCR bid can be requested as a positive (discharge) or negative (charge) activation by the TSO.`]}),`\n`,_jsx(_components.p,{children:`The product name must be in the following format:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsxs(_components.p,{children:[`For a bid in the FCR market during the first EFA block of the day (00:00-04:00 am CET/CEST), the product name is `,_jsx(_components.code,{children:`NEGPOS_00_04`}),`. The product name of the sixth and final EFA block is `,_jsx(_components.code,{children:`NEGPOS_20_24`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`2-1-2-fcr-buffer`,children:`2.1.2 FCR buffer`}),`\n`,_jsx(_components.p,{children:`Given their importance as the primary reserve, FCR bids require us to leave an additional 25% wholesale buffer available on top of the offered capacity of the bid.`}),`\n`,_jsxs(_components.p,{children:[`For more details see `,_jsx(_components.a,{href:`#81-fcr-commitment-and-wholesale-buffer`,children:`8.1 FCR commitment and wholesale buffer`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`2-1-3-bidding-deadlines`,children:`2.1.3 Bidding deadlines`}),`\n`,_jsxs(_components.p,{children:[`All bids must be placed before the following deadline: `,_jsx(_components.strong,{children:`7:30 am CET/CEST`}),` on the day before delivery. The auction opens a week before the delivery day.`]}),`\n`,_jsx(Heading,{level:`3`,id:`2-1-4-publication-of-results`,children:`2.1.4 Publication of results`}),`\n`,_jsx(_components.p,{children:`Results can be expected at or after 8:20 am CET/CEST on the day before delivery day.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsx(_components.p,{children:`For an FCR bid with delivery day 15.01.2026, results are expected around 8:20 am CET on 14.01.2026.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-1-5-auction-and-revenue-calculation`,children:`2.1.5 Auction and revenue calculation`}),`\n`,_jsx(_components.p,{children:`The FCR auction is a “Pay As Clear” auction and takes place on the day before the delivery day between 8:00 am-8:20 am CET/CEST.`}),`\n`,_jsx(_components.p,{children:`During the auction, a settlement price is set for each 4 hour EFA block on the next day.`}),`\n`,_jsx(_components.p,{children:`For an accepted bid, this settlement price will be equal to or higher than the capacity price offered on your bid.`}),`\n`,_jsxs(_components.p,{children:[`If a bid is accepted, you are paid the `,_jsx(_components.code,{children:`settlementPrice`}),` for the whole duration of the delivery period.`]}),`\n`,_jsx(_components.p,{children:`You are paid for the capacity you reserve, irrespective of the activations your asset delivers.`}),`\n`,_jsx(_components.p,{children:`To calculate revenue, use the following formula:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`revenue = settlementPrice * acceptedCapacity`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`capacityPrice`}),` offered in bid: 80 EUR/MW`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`settlementPrice`}),` received in result: 100 EUR/MW`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`acceptedCapacity`}),` received in result: 2000 kW`]}),`\n`,_jsx(_components.li,{children:`Revenue: 100 EUR/MW * 2 MW = 200 EUR`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`2-2-afrr-capacity`,children:`2.2 aFRR Capacity`}),`\n`,_jsx(_components.p,{children:`aFRR (automatic Frequency Restoration Reserve) is the secondary reserve which is activated as a secondary response to frequency disturbances, about 30 seconds after the primary reserve (FCR).`}),`\n`,_jsx(_components.p,{children:`There are two ways of participating in aFRR: Placing a Capacity bid and/or placing an Energy bid. Let us first take a look at the Capacity bids.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-2-1-product-names-and-directions`,children:`2.2.1 Product names and directions`}),`\n`,_jsx(_components.p,{children:`The product name of an aFRR Capacity bid consists of the product direction and the 4-hour EFA block for which the bid is submitted.`}),`\n`,_jsxs(_components.p,{children:[`Since aFRR bids only have one product direction, they will either be `,_jsx(_components.code,{children:`POS`}),` or `,_jsx(_components.code,{children:`NEG`}),`. A bid with a positive product direction means you will only receive positive/discharge activations. A bid with a negative product direction means you will only receive negative/charge activations.`]}),`\n`,_jsx(_components.p,{children:`The product name must be in the following format:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsxs(_components.p,{children:[`For a bid in the aFRR market during the first EFA block of the day (00:00-04:00 am CET/CEST) with a positive product direction, the product name is `,_jsx(_components.code,{children:`POS_00_04`}),`. The equivalent bid in the negative product direction would be `,_jsx(_components.code,{children:`NEG_00_04`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The product names for the sixth and final EFA block are `,_jsx(_components.code,{children:`POS_20_24`}),` and `,_jsx(_components.code,{children:`NEG_20_24`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`2-2-2-implicit-afrr-energy-bids`,children:`2.2.2 Implicit aFRR Energy bids`}),`\n`,_jsx(_components.p,{children:`When submitting an aFRR Capacity bid, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid. Each aFRR Energy bid has a delivery period of 15 minutes.`}),`\n`,_jsxs(_components.p,{children:[`This is done by providing a mandatory `,_jsx(_components.code,{children:`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.`]}),`\n`,_jsxs(_components.p,{children:[`Each of the 16 Energy bids will have the same `,_jsx(_components.code,{children:`offeredCapacity`}),` as the corresponding Capacity bid.`]}),`\n`,_jsxs(_components.p,{children:[`These Energy bids can still be updated in their `,_jsx(_components.code,{children:`energyPrice`}),` and `,_jsx(_components.code,{children:`offeredCapacity`}),` after the Capacity bid has received a result. However, if the Capacity bid was accepted, the `,_jsx(_components.code,{children:`offeredCapacity`}),` of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected.`]}),`\n`,_jsx(Heading,{level:`3`,id:`2-2-3-bidding-deadlines`,children:`2.2.3 Bidding deadlines`}),`\n`,_jsxs(_components.p,{children:[`All bids must be placed before the following deadline: `,_jsx(_components.strong,{children:`8:40 am CET/CEST`}),` on the day before delivery. The auction opens a week before the delivery day.`]}),`\n`,_jsx(Heading,{level:`3`,id:`2-2-4-publication-of-results`,children:`2.2.4 Publication of results`}),`\n`,_jsx(_components.p,{children:`Results can be expected at or after 9:20 am CET/CEST on the day before the delivery day.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsx(_components.p,{children:`For an aFRR Capacity bid with delivery day 15.01.2026, results are expected around 9:20 am CET on 14.01.2026.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-2-5-auction-and-revenue-calculation`,children:`2.2.5 Auction and revenue calculation`}),`\n`,_jsx(_components.p,{children:`The aFRR Capacity auction is a “Pay As Bid” auction and takes place on the day before the delivery day between 9:00 am-9:20 am CET/CEST.`}),`\n`,_jsx(_components.p,{children:`During the auction, your bid is placed inside a merit order, based on your offered capacity price. Depending on your position in that merit order, your bid is rejected or accepted.`}),`\n`,_jsx(_components.p,{children:`If a bid is accepted, you are paid the offered capacity price for each hour of the delivery period.`}),`\n`,_jsx(_components.p,{children:`You are paid for the capacity you reserve, irrespective of the activations your asset delivers.`}),`\n`,_jsx(_components.p,{children:`To calculate revenue, use the following formula:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`revenue = (capacityPrice * acceptedCapacity) * 4h`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`capacityPrice`}),` offered in bid: 100 EUR/MW`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`acceptedCapacity`}),` received in result: 2000 kW`]}),`\n`,_jsx(_components.li,{children:`Revenue: (100 EUR/MW/h * 2 MW) * 4h = 800 EUR`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`2-3-afrr-energy`,children:`2.3 aFRR Energy`}),`\n`,_jsx(_components.p,{children:`aFRR (automatic Frequency Restoration Reserve) is the secondary reserve which is activated as a secondary response to frequency disturbances, about 30 seconds after the primary reserve (FCR).`}),`\n`,_jsx(_components.p,{children:`There are two ways of participating in aFRR: Placing a Capacity bid and/or placing an Energy bid. Let us now take a look at the Energy bids.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-3-1-product-names-and-directions`,children:`2.3.1 Product names and directions`}),`\n`,_jsx(_components.p,{children:`The product name of an aFRR Energy bid consists of the product direction and the number of the quarter hour in the day for which the bid is submitted.`}),`\n`,_jsxs(_components.p,{children:[`Since aFRR bids only have one product direction, they will either be `,_jsx(_components.code,{children:`POS`}),` or `,_jsx(_components.code,{children:`NEG`}),`. A bid with a positive product direction means you will only receive positive/discharge activations. A bid with a negative product direction means you will only receive negative/charge activations.`]}),`\n`,_jsx(_components.p,{children:`The product name must be in the following format:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`{{direction}}_{{quarterHourInDay}}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsxs(_components.p,{children:[`For an aFRR Energy bid during the first quarter hour of the day (00:00-00:15 am CET/CEST) with a positive product direction, the product name is `,_jsx(_components.code,{children:`POS_001`}),`. The equivalent bid in the negative product direction would be `,_jsx(_components.code,{children:`NEG_001`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The final product names on most days are `,_jsx(_components.code,{children:`POS_096`}),` or `,_jsx(_components.code,{children:`NEG_096`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The final product names on the CET to CEST clock change day are `,_jsx(_components.code,{children:`POS_092`}),` or `,_jsx(_components.code,{children:`NEG_092`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The final product names on the CEST to CET clock change day are `,_jsx(_components.code,{children:`POS_100`}),` or `,_jsx(_components.code,{children:`NEG_100`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`2-3-2-implicit-vs-individual-bids`,children:`2.3.2 Implicit vs. individual bids`}),`\n`,_jsxs(_components.p,{children:[`As explained in `,_jsx(_components.a,{href:`#222-implicit-afrr-energy-bids`,children:`2.2.2 Implicit aFRR Energy bids`}),`, aFRR Energy bids can be submitted as part of an aFRR Capacity bid.`]}),`\n`,_jsx(_components.p,{children:`However, you may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid.`}),`\n`,_jsx(_components.p,{children:`These must be submitted within the aFRR Energy bidding deadlines.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-3-3-bidding-deadlines`,children:`2.3.3 Bidding deadlines`}),`\n`,_jsxs(_components.p,{children:[`All bids must be placed `,_jsx(_components.strong,{children:`30 minutes`}),` before the delivery period. Moreover, bids must be placed after `,_jsx(_components.strong,{children:`12:00 pm CET/CEST`}),` on the day before delivery. If bids are made before that time, they are rejected.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsx(_components.p,{children:`An aFRR Energy bid with delivery period 15:30pm must be submitted after 12:00 pm the previous day and before 15:00 pm on the delivery day.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-3-4-publication-of-results`,children:`2.3.4 Publication of results`}),`\n`,_jsx(_components.p,{children:`Results can be expected 23 minutes before the start of the delivery period.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsx(_components.p,{children:`For an aFRR Energy bid with delivery day 15.01.2026 and a delivery period starting at 12:30 pm, results are expected around 12:07 pm on 15.01.2026.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-3-5-auction-and-revenue-calculation`,children:`2.3.5 Auction and revenue calculation`}),`\n`,_jsx(_components.p,{children:`The aFRR Energy auction is Pay As Clear.`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`settlementPrice`}),` for each product is only decided after the delivery period has ended and depends on the activations that have taken place during the delivery period.`]}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`settlementPrice`}),` can be found in the data center of `,_jsx(_components.a,{href:`https://www.regelleistung.net/apps/datacenter/tenders/?productTypes=SRL\u0026markets=BALANCING_ENERGY\u0026date=2026-06-04\u0026tenderTab=PRL%24CAPACITY%241`,children:`regelleistung.net`}),`. It can also be received through our internal revenue-reporting endpoint if requested. Importantly, it is not part of the response of an aFRR Energy result, since the results are generated before the settlement price is decided.`]}),`\n`,_jsx(_components.p,{children:`If your bid is accepted, you are not automatically receiving revenue for the delivery period.`}),`\n`,_jsxs(_components.p,{children:[`You are paid only for the activated power you deliver, not the accepted capacity. You can get activation data via our operational data endpoint, as is explained in detail in `,_jsx(_components.a,{href:`#10-how-do-i-check-activation-signals`,children:`10. How do I check activation signals?`}),`.`]}),`\n`,_jsx(_components.p,{children:`To calculate revenue for a single aFRR Energy delivery period, use the following formula:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`revenue = settlementPrice * activatedPower * 0.25h`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`energyPrice`}),` offered in the bid: 80 EUR/MWh`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`settlementPrice`}),`: 100 EUR/MWh`]}),`\n`,_jsx(_components.li,{children:`Total activated power in 15 minutes: 2000 kW`}),`\n`,_jsx(_components.li,{children:`Revenue: 100 EUR/MWh * 2 MW * 0.25 h = 50 EUR`}),`\n`]}),`\n`,_jsx(Heading,{level:`1`,id:`3-which-endpoints-do-i-need-to-implement`,children:`3. Which endpoints do I need to implement?`}),`\n`,_jsx(_components.p,{children:`The following endpoints must be implemented to guarantee a seamless integration with our ancillary services API. By following the implementation guidelines, you can (1) prevent rejection of invalid bids and (2) make sure to bid the maximum capacity into ancillary services at any given point in time.`}),`\n`,_jsx(Heading,{level:`2`,id:`3-1-ancillary-endpoints`,children:`3.1 Ancillary endpoints`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-endpoints.png?fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=44b6f7fff06c1027b6b9a7ab13f0ffff`,alt:`Ancillary API endpoints: GET bids, POST bids, GET results`,\"data-og-width\":`1451`,width:`1451`,\"data-og-height\":`222`,height:`222`,\"data-path\":`images/ancillary-va-endpoints.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-endpoints.png?w=280\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=c68678cfcb1bfad9abc66467367ef99c 280w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-endpoints.png?w=560\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=fa6dc21f79106bd831bcc11320894beb 560w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-endpoints.png?w=840\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=578b4244f8b7aa5c52cc2ea80fcded33 840w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-endpoints.png?w=1100\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=f808ba7454d415d49f1bdbdacd2b2e17 1100w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-endpoints.png?w=1650\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=744d63c1372f4f2eb2b86c601930f8c4 1650w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-endpoints.png?w=2500\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=fb15fce53c0ced538defc58ade67e98b 2500w`}),`\n`,_jsxs(_components.p,{children:[`These `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/ancillary`,children:`endpoints`}),` allow you to place and retrieve bids and retrieve results. Updates to existing bids are also placed through the POST endpoint and will replace all previously scheduled bids.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`GET ancillary bids, see `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/ancillary/get_organisations__organisationID__virtual_assets__virtualAssetID__ancillary_bids`,children:`here`})]}),`\n`,_jsxs(_components.li,{children:[`GET ancillary results, see `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/ancillary/get_organisations__organisationID__virtual_assets__virtualAssetID__ancillary_results`,children:`here`})]}),`\n`,_jsxs(_components.li,{children:[`POST ancillary bids, see `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/ancillary/post_organisations__organisationID__virtual_assets__virtualAssetID__ancillary_bids`,children:`here`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`3-2-operational-data-endpoint`,children:`3.2 Operational data endpoint`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-operational-endpoint.png?fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=895d2b19553bcab108d5e2fe007bfd7b`,alt:`Operational data endpoint returning a 15 minute timeseries`,\"data-og-width\":`1459`,width:`1459`,\"data-og-height\":`187`,height:`187`,\"data-path\":`images/ancillary-va-operational-endpoint.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-operational-endpoint.png?w=280\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=8095a4318b40de109587d482dd5da783 280w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-operational-endpoint.png?w=560\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=40bbbb7b4f40cdb3680031486b9ec865 560w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-operational-endpoint.png?w=840\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=34d8782e470a8be97f7524bce10a283d 840w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-operational-endpoint.png?w=1100\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=393082e97f63fa7bb89d6b87c3895ec3 1100w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-operational-endpoint.png?w=1650\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=9362e2ab5351ba7db84382a916cd4a16 1650w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-operational-endpoint.png?w=2500\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=a085bad34c930740d88ec7ec3f4963d3 2500w`}),`\n`,_jsxs(_components.p,{children:[`This single `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/virtual-assets/get_organisations__organisationID__virtual_assets__virtualAssetID__operational`,children:`endpoint`}),` allows you to retrieve all the data you need to (1) place valid ancillary bids and (2) stay informed about potential changes during periods of unavailability.`]}),`\n`,_jsxs(_components.p,{children:[`It offers a variety of `,_jsx(_components.code,{children:`categories`}),` which can be selected via a query parameter. The desired data is returned as a 15 minute based timeseries that always follows the same response format. More details can be found `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/virtual-assets/get_organisations__organisationID__virtual_assets__virtualAssetID__operational`,children:`here`}),` in the swagger doc.`]}),`\n`,_jsx(Heading,{level:`3`,id:`3-2-1-mandatory-categories`,children:`3.2.1 Mandatory categories`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`afrrPosCapacityAvailable`}),` or `,_jsx(_components.code,{children:`afrrPosCapacityAvailableMinusFcr`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`afrrNegCapacityAvailable`}),` or `,_jsx(_components.code,{children:`afrrNegCapacityAvailableMinusFcr`})]}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`fcrCapacityAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`fcrCommitments`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrPosCommitments`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrNegCommitments`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`stateOfEnergyBoundsUpper`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`stateOfEnergyBoundsLower`})}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`3-2-2-optional-categories-depending-on-implementation`,children:`3.2.2 Optional categories (depending on implementation)`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`maxTotalAncillaryCapacityDischargeAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`maxTotalAncillaryCapacityChargeAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`maximumDeliverablePower`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`minimumDeliverablePower`})}),`\n`]}),`\n`,_jsx(Heading,{level:`1`,id:`4-how-much-can-i-bid-into-each-market`,children:`4. How much can I bid into each market?`}),`\n`,_jsx(_components.p,{children:`If your virtual asset has been set up with ancillary capacity, we will validate that the bids you place do not exceed the allocated capacity for each individual market (validation 1) and across all markets (validation 2).`}),`\n`,_jsxs(_components.p,{children:[`There are two ways of getting the necessary data to place valid bids. The simplest and recommended implementation is explained in `,_jsx(_components.a,{href:`#41-combined-validation-recommended`,children:`4.1 Combined validation`}),`, however, the context in `,_jsx(_components.a,{href:`#42-two-step-validation-complex`,children:`4.2 Two step validation`}),` should still be understood to ensure the simplified solution fits your underlying algorithm.`]}),`\n`,_jsx(Heading,{level:`2`,id:`4-1-combined-validation-recommended`,children:`4.1 Combined validation (recommended)`}),`\n`,_jsx(_components.p,{children:`Depending on your underlying optimisation algorithm, you may want to simplify your implementation and combine validation 1 and 2 into a single step.`}),`\n`,_jsx(_components.p,{children:`In that case, the following categories are relevant:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`fcrCapacityAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrPosCapacityAvailableMinusFcr`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrNegCapacityAvailableMinusFcr`})}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`fcrCapacityAvailable`}),` returns the max capacity that can be bid into the FCR market. This timeseries is not aware of aFRR commitments, since FCR bidding closes before aFRR Capacity bidding. If you are planning to submit aFRR bids before FCR bids, let us know and we will add a new category.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`afrrPosCapacityAvailableMinusFcr`}),` returns the max capacity that can be bid into the aFRREnergyPos and the aFRRCapacityPos markets while taking into account any FCR commitments and maxTotalCapacity validation.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`afrrNegCapacityAvailableMinusFcr`}),` returns the max capacity that can be bid into the aFRREnergyNeg and the aFRRCapacityNeg markets while taking into account any FCR commitments and maxTotalCapacity validation.`]}),`\n`,_jsx(_components.p,{children:`The values returned in these timeseries are calculated using the following formula:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`afrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitments), afrrPosCapacityAvailable)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`afrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitments), afrrNegCapacityAvailable)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsxs(_components.p,{children:[`You want to place a FCR bid for 4000 kW on EFA Block 1. Your virtual asset has a total power capacity of 7000 kW and a `,_jsx(_components.code,{children:`maxTotalAncillaryCapacityChargeAvailable`}),` of 5000 kW.`]}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`fcrCapacityAvailable`}),` and find out you have 4000 kW available during that period.`]}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`}),` and `,_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`}),` and find out you have 7000 kW available for both. After bidding 4000 kW into FCR, you would be left with 3000 kW `,_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`}),` and `,_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`}),`. You needed at least 1000 kW available in both directions to allow for a 25% wholesale buffer (see `,_jsx(_components.a,{href:`#81-fcr-commitment-and-wholesale-buffer`,children:`8.1 FCR commitment and wholesale buffer`}),`). Your bid does not violate that legal requirement.`]}),`\n`,_jsx(_components.p,{children:`Your bid passed validation 1 and 2 and is successfully submitted.`}),`\n`,_jsx(_components.p,{children:`You now want to place an AFRRNegCapacity bid for 3000 kW on EFA Block 1.`}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`afrrNegCapacityAvailableMinusFcr`}),` and find out you only have 1000 kW available during that period. This is because the initial FCR bid has impacted the max total capacity you are allowed to bid across markets.`]}),`\n`,_jsx(_components.p,{children:`Your bid for 3000 kW would violate the validation and be rejected.`}),`\n`,_jsxs(_components.p,{children:[`Importantly, with this simplified implementation, you do not need to query the `,_jsx(_components.code,{children:`fcrCommitment`}),` or `,_jsx(_components.code,{children:`maxTotalAncillaryCapacityChargeAvailable`}),` since `,_jsx(_components.code,{children:`afrrNegCapacityAvailableMinusFcr`}),` will already have taken any FCR bids placed into account.`]}),`\n`,_jsx(Heading,{level:`2`,id:`4-2-two-step-validation-complex`,children:`4.2 Two step validation (complex)`}),`\n`,_jsx(Heading,{level:`3`,id:`4-2-1-validating-individual-market-capacities`,children:`4.2.1 Validating individual market capacities`}),`\n`,_jsxs(_components.p,{children:[`Before placing ancillary bids, you will need to check how much ancillary capacity is available for each individual market on your virtual asset at a given point in time (validation 1). This data can be retrieved by querying the operational data endpoint `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/virtual-assets/get_organisations__organisationID__virtual_assets__virtualAssetID__operational`,children:`here`}),`. The following categories are relevant:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrPosCapacityAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrNegCapacityAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`fcrCapacityAvailable`})}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`afrrPosCapacityAvailable`}),` returns the max capacity that can be bid into the AFRREnergyPos and the AFRRCapacityPos markets.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`afrrNegCapacityAvailable`}),` returns the max capacity that can be bid into the AFRREnergyNeg and the AFRRCapacityNeg markets.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`fcrCapacityAvailable`}),` returns the max capacity that can be bid into the FCR market.`]}),`\n`,_jsx(_components.p,{children:`Each category will return a timeseries of the max capacity that can be bid into the selected market in kilowatts.`}),`\n`,_jsx(_components.p,{children:`These timeseries adjust to potential unavailability events that may be affecting the virtual asset.`}),`\n`,_jsx(_components.p,{children:`Importantly, these timeseries are not changed when ancillary bids are placed. They always reflect the max capacity of what CAN be bid, NOT what has already been bid.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example 1`})}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`fcrCapacityAvailable`}),` and find out you have 2000 kW available during that period. Your bid would fail the first validation.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example 2`})}),`\n`,_jsx(_components.p,{children:`You want to place a AFRRPosCapacity bid for 3000 kW on EFA Block 1.`}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`afrrPosCapacityAvailable`}),` and find out you have 3000 kW available during that period. Your bid passes the first validation.`]}),`\n`,_jsx(Heading,{level:`3`,id:`4-2-2-validating-max-total-ancillary-capacity`,children:`4.2.2 Validating max total ancillary capacity`}),`\n`,_jsx(_components.p,{children:`In addition to validating available ancillary capacity for the individual markets, you will also need to validate any new ancillary bids against the total ancillary capacity available across markets (validation 2).`}),`\n`,_jsxs(_components.p,{children:[`That means, if you have already placed a bid in FCR, the capacity you can bid into AFRR Pos or Neg may be reduced. This data can be retrieved by querying the operational data endpoint `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/virtual-assets/get_organisations__organisationID__virtual_assets__virtualAssetID__operational`,children:`here`}),`.`]}),`\n`,_jsx(_components.p,{children:`The following categories are relevant:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`maxTotalAncillaryCapacityChargeAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`maxTotalAncillaryCapacityDischargeAvailable`})}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`maxTotalAncillaryCapacityChargeAvailable`}),` returns the available total capacity for all bids across all markets with a negative product direction: AFRR Neg and FCR.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`maxTotalAncillaryCapacityDischargeAvailable`}),` returns the available total capacity for all bids across all markets with a positive product direction: AFRR Pos and FCR.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsxs(_components.p,{children:[`You want to place a FCR bid for 4000 kW on EFA Block 1. Your virtual asset has a total power capacity of 7000 kW and a `,_jsx(_components.code,{children:`maxTotalAncillaryCapacityChargeAvailable`}),` of 5000 kW.`]}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`fcrCapacityAvailable`}),` and find out you have 4000 kW available during that period.`]}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`}),` and `,_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`}),` and find out you have 7000 kW available for both. After bidding 4000 kW into FCR, you would be left with 3000 kW `,_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`}),` and `,_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`}),`. You needed at least 1000 kW available in both directions to allow for a 25% wholesale buffer (see `,_jsx(_components.a,{href:`#81-fcr-commitment-and-wholesale-buffer`,children:`8.1 FCR commitment and wholesale buffer`}),`). Your bid does not violate that legal requirement.`]}),`\n`,_jsx(_components.p,{children:`Your bid passed validation 1 and 2 and is successfully submitted.`}),`\n`,_jsx(_components.p,{children:`You want to place a AFRRNegCapacity bid for 3000 kW on EFA Block 1.`}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`maxTotalAncillaryCapacityChargeAvailable`}),` and find out you have 5000 kW available during EFA Block 1.`]}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`fcrCommitments`}),` and find out you have the 4000 kW FCR bid already placed during EFA Block 1.`]}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`afrrNegCapacityAvailable`}),` and find out you have 3000 kW available during that period. Your bid passes the first validation.`]}),`\n`,_jsx(_components.p,{children:`For the second validation you run the following calculation:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitments), afrrNegCapacityAvailable)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`That means the maximum AFRR Neg capacity you are allowed to bid is 1000 kW (minimum((5000 kW - 4000 kW), 3000 kW)).`}),`\n`,_jsx(_components.p,{children:`Your bid for 3000 kW would violate the max total ancillary capacity available and be rejected.`}),`\n`,_jsx(Heading,{level:`1`,id:`5-how-do-i-submit-update-or-delete-a-bid`,children:`5. How do I submit, update or delete a bid?`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-post-bids.png?fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=ddd4af94912997274db89a50a2104cd9`,alt:`POST ancillary bids endpoint`,\"data-og-width\":`1441`,width:`1441`,\"data-og-height\":`116`,height:`116`,\"data-path\":`images/ancillary-va-post-bids.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-post-bids.png?w=280\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=e8d15f45503025e2b937a36b6ed88af3 280w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-post-bids.png?w=560\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=446bc9929d1f0140cfb2194065a0d251 560w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-post-bids.png?w=840\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=fc8ef2bb142f39a8b1d396e70d8c58bf 840w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-post-bids.png?w=1100\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=853f166bc3130d15b779154fe4509a11 1100w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-post-bids.png?w=1650\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=d8740d852527ea9e1bc609a98045398f 1650w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-post-bids.png?w=2500\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=414a34c91f3e5f2bb75d2bb0702891ea 2500w`}),`\n`,_jsxs(_components.p,{children:[`To submit, update or delete one or multiple bids in one of the three ancillary markets, use the POST endpoint in the ancillary API `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/ancillary/post_organisations__organisationID__virtual_assets__virtualAssetID__ancillary_bids`,children:`here`}),`.`]}),`\n`,_jsx(_components.p,{children:`A detailed explanation of the endpoint, including examples for the request and response body, can be found in our swagger docs.`}),`\n`,_jsx(_components.p,{children:`Please keep the following in mind when placing bids:`}),`\n`,_jsx(_components.p,{children:`You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests.`}),`\n`,_jsx(_components.p,{children:`If any of the bids submitted is invalid, all bids will be rejected.`}),`\n`,_jsxs(_components.p,{children:[`All bids have a status field which allows you to track whether the bid has been successfully submitted to the TSO. If a bid for a product is still being processed, it has status `,_jsx(_components.code,{children:`pending`}),`. We reject any submissions for the same product until the status has been updated to `,_jsx(_components.code,{children:`submitted`}),`. This is to prevent double bidding with the TSO.`]}),`\n`,_jsx(_components.p,{children:`The endpoint combines POST, PUT and DELETE functionality:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`POST: If no bids have been submitted for the product, new bids are created.`}),`\n`,_jsx(_components.li,{children:`PUT: If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission. That means, if you have submitted multiple bids for the same product and now want to remove one, send a new POST request with only the bids you want to keep.`}),`\n`,_jsx(_components.li,{children:`DELETE: To delete all bids placed for a product, set the bid body as an empty array (see example in the swagger doc)`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The bidding deadlines are listed at the beginning of the document: `,_jsx(_components.a,{href:`#233-bidding-deadlines`,children:`aFRR Energy`}),`, `,_jsx(_components.a,{href:`#223-bidding-deadlines`,children:`aFRR Capacity`}),`, `,_jsx(_components.a,{href:`#213-bidding-deadlines`,children:`FCR`}),`.`]}),`\n`,_jsx(Heading,{level:`1`,id:`6-how-do-i-check-submitted-bids`,children:`6. How do I check submitted bids?`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-bids.png?fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=f3c6bafc89e7216c8fc23d7f32a55221`,alt:`GET ancillary bids endpoint`,\"data-og-width\":`1446`,width:`1446`,\"data-og-height\":`132`,height:`132`,\"data-path\":`images/ancillary-va-get-bids.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-bids.png?w=280\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=9633a66b8c7b7ab169a37c15686048d3 280w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-bids.png?w=560\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=d76613df26041a48d9940518ddf1ad27 560w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-bids.png?w=840\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=7941079276c51773cbf3c0b9eed6c12a 840w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-bids.png?w=1100\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=afbcb08cf805e38a46758c070cd164a4 1100w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-bids.png?w=1650\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=5f7865f880677b30176121ba3c26af0c 1650w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-bids.png?w=2500\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=962596023185b776751ed89857332c5b 2500w`}),`\n`,_jsxs(_components.p,{children:[`To check your submitted bids in any of the three ancillary markets, use the GET endpoint in the ancillary API `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/ancillary/get_organisations__organisationID__virtual_assets__virtualAssetID__ancillary_bids`,children:`here`}),`.`]}),`\n`,_jsx(_components.p,{children:`A detailed explanation of the endpoint, including examples for the query parameters and response body, can be found in our swagger docs.`}),`\n`,_jsx(_components.p,{children:`You can customize your request by using the following query parameters:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`start`}),`, `,_jsx(_components.code,{children:`end`}),`: Set the interval of your query.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`markets`}),`: Select the markets of the bids you are interested in, e.g. `,_jsx(_components.code,{children:`FCR,AFRREnergy`}),`. If left empty, returns all markets.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`productDirections`}),`: Select the product directions of the bids you are interested in, e.g. `,_jsx(_components.code,{children:`POS`}),`. If left empty, returns all product directions. If an invalid combination of market and product direction is requested, product directions are ignored, e.g. `,_jsx(_components.code,{children:`FCR`}),` and `,_jsx(_components.code,{children:`POS`}),` will return all FCR bids.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`1`,id:`7-how-do-i-check-results`,children:`7. How do I check results?`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-results.png?fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=ac6aa639228ef46a3ae83436f93735ce`,alt:`GET ancillary results endpoint`,\"data-og-width\":`1445`,width:`1445`,\"data-og-height\":`119`,height:`119`,\"data-path\":`images/ancillary-va-get-results.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-results.png?w=280\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=1b79fbc636fa5d8a3e0faa057bb4e788 280w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-results.png?w=560\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=5e6530d383dda999c37bb4885b207940 560w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-results.png?w=840\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=632e9c30845685a1aae589cf4f7c9f05 840w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-results.png?w=1100\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=732617f061f289f4b37fb3cc3c70f0fc 1100w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-results.png?w=1650\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=2e45c30eee7e3c4b2206586cc6738607 1650w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-get-results.png?w=2500\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=8f9d3677b308aeaadf722f60a2eb6200 2500w`}),`\n`,_jsxs(_components.p,{children:[`To check results for your bids in any of the three ancillary markets, use the GET endpoint in the ancillary API `,_jsx(_components.a,{href:`https://api.trlyr.com/docs/index.html#/ancillary/get_organisations__organisationID__virtual_assets__virtualAssetID__ancillary_results`,children:`here`}),`.`]}),`\n`,_jsx(_components.p,{children:`A detailed explanation of the endpoint, including examples for the query parameters and response body, can be found in our swagger docs.`}),`\n`,_jsx(_components.p,{children:`You can customize your request by using the following query parameters:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`start`}),`, `,_jsx(_components.code,{children:`end`}),`: Set the interval of your query.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`markets`}),`: Select the markets of the results you are interested in, e.g. `,_jsx(_components.code,{children:`FCR,AFRREnergy`}),`. If left empty, returns all markets.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`productDirections`}),`: Select the product directions of the results you are interested in, e.g. `,_jsx(_components.code,{children:`POS`}),`. If left empty, returns all product directions. If an invalid combination of market and product direction is requested, product directions are ignored, e.g. `,_jsx(_components.code,{children:`FCR`}),` and `,_jsx(_components.code,{children:`POS`}),` will return all FCR results.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The result publication times are listed at the beginning of the document: `,_jsx(_components.a,{href:`#234-publication-of-results`,children:`aFRR Energy`}),`, `,_jsx(_components.a,{href:`#224-publication-of-results`,children:`aFRR Capacity`}),`, `,_jsx(_components.a,{href:`#214-publication-of-results`,children:`FCR`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Please keep in mind that in periods of unavailability, we may (1) reduce the accepted capacity of a result after it has been published or (2) reject a result that was previously accepted. See `,_jsx(_components.a,{href:`#9-what-is-the-behaviour-during-unavailabilities`,children:`9. What is the behaviour during unavailabilities?`}),` for a more detailed explanation.`]}),`\n`,_jsx(Heading,{level:`1`,id:`8-how-do-i-check-ancillary-commitments-and-remaining-wholesale-capacity`,children:`8. How do I check ancillary commitments and remaining wholesale capacity?`}),`\n`,_jsx(_components.p,{children:`Every time you successfully submit a bid, or a bid receives a result, both the ancillary commitment and the available wholesale capacity on the virtual asset are adjusted.`}),`\n`,_jsx(_components.p,{children:`You can imagine the available wholesale power capacity as a pool from which the ancillary commitments are drained: When you place a bid, the offered capacity is taken from the wholesale “pool” and added to the ancillary commitment. Likewise, if you receive a rejected result, the capacity is taken from the ancillary commitment and added back to the wholesale “pool”.`}),`\n`,_jsx(_components.p,{children:`You can check your ancillary commitments per market through the operational data endpoint on the virtual asset, by requesting the following categories:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`fcrCommitment`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrPosCommitment`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrNegCommitment`})}),`\n`]}),`\n`,_jsx(_components.p,{children:`You can check your available wholesale capacity by requesting the following categories:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`})}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`8-1-fcr-commitment-and-wholesale-buffer`,children:`8.1 FCR commitment and wholesale buffer`}),`\n`,_jsx(_components.p,{children:`The FCR commitment at a given point in time is the summed capacity of all FCR bids without results and all accepted FCR results.`}),`\n`,_jsxs(_components.p,{children:[`If you place a FCR bid, the value of the `,_jsx(_components.code,{children:`fcrCommitment`}),` timeseries is increased by the offered capacity of the bid.`]}),`\n`,_jsxs(_components.p,{children:[`At the same time, both the `,_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`}),` and the `,_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`}),` timeseries are reduced by the offered capacity of the bid.`]}),`\n`,_jsx(_components.p,{children:`Additionally, we validate that after this reduction at least 25% of the committed FCR capacity still remain as available wholesale capacity. This 25% wholesale buffer is enforced due to a legal requirement from the TSO to guarantee the availability of the FCR response in case of unavailabilities. If, after your FCR bid, the buffer would be below 25%, we reject the bid.`}),`\n`,_jsxs(_components.p,{children:[`Notably, the wholesale buffer is automatically applied to the `,_jsx(_components.code,{children:`stateOfEnergyBoundsLower`}),` and `,_jsx(_components.code,{children:`stateOfEnergyBoundsUpper`}),` timeseries which can be queried via the operational data endpoint. These bounds limit the power capacity you can dispatch into wholesale, if your State of Energy is at either of the bounds. To prevent imbalances, we strongly recommend querying these timeseries before placing a wholesale trade. Another way of validating your wholesale trade, which already includes the wholesale buffer, is to compare your planned trade against the `,_jsx(_components.code,{children:`maximumDeliverablePower`}),` and `,_jsx(_components.code,{children:`minimumDeliverablePower`}),` timeseries which is available 15 minutes before the start of delivery.`]}),`\n`,_jsx(_components.p,{children:`To calculate the wholesale buffer do the following calculation:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`wholesaleBufferCharge = fcrCommitment * 0.25`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`wholesaleBufferDischarge = fcrCommitment * 0.25`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example`})}),`\n`,_jsx(_components.p,{children:`You want to place a FCR bid for 4000 kW on EFA Block 1.`}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`fcrCapacityAvailable`}),` and find out you have 5000 kW available during that period.`]}),`\n`,_jsxs(_components.p,{children:[`You query `,_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`}),` and `,_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`}),` and find out you have 7000 kW available for both. After bidding 4000 kW into FCR, you would be left with 3000 kW `,_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`}),` and `,_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`}),`.`]}),`\n`,_jsx(_components.p,{children:`You do the following calculation:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`1000 kW = 4000 kW * 0.25`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`In the example, you needed at least 1000 kW available in both directions to allow for a 25% wholesale buffer. Your bid does not violate that legal requirement.`}),`\n`,_jsx(Heading,{level:`2`,id:`8-2-afrr-pos-commitment`,children:`8.2 aFRR Pos commitment`}),`\n`,_jsx(_components.p,{children:`The aFRR Pos commitment at a given point in time combines both aFRR Pos Energy and aFRR Pos Capacity bids and results and is calculated the following way:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`aFRR Pos commitment = maximum(aFRR Pos Capacity commitment, aFRR Pos Energy commitment)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`To explain:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`aFRR Pos Capacity commitment: The summed offered capacity of all accepted aFRR Pos Capacity results and all aFRR Pos Capacity bids without a result.`}),`\n`,_jsx(_components.li,{children:`aFRR Pos Energy commitment: The summed offered capacity of all accepted aFRR Pos Energy results and all aFRR Pos Energy bids without a result.`}),`\n`,_jsx(_components.li,{children:`This calculation ensures we always have enough capacity reserved to fulfil the aFRR Pos Capacity commitment which may be relevant in an emergency fallback scenario.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the `,_jsx(_components.code,{children:`afrrPosCommitment`}),` timeseries is increased by the offered capacity of the bid.`]}),`\n`,_jsxs(_components.p,{children:[`At the same time, the value of the `,_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`}),` operational data timeseries is reduced by the offered capacity of the bid.`]}),`\n`,_jsx(Heading,{level:`2`,id:`8-3-afrr-neg-commitment`,children:`8.3 aFRR Neg commitment`}),`\n`,_jsx(_components.p,{children:`The aFRR Neg commitment at a given point in time combines both aFRR Neg Energy and aFRR Neg Capacity bids and results and is calculated the following way:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`aFRR Neg commitment = maximum(aFRR Neg Capacity commitment, aFRR Neg Energy commitment)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`To explain:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`aFRR Neg Capacity commitment: The summed offered capacity of all accepted aFRR Neg Capacity results and all aFRR Neg Capacity bids without a result.`}),`\n`,_jsx(_components.li,{children:`aFRR Neg Energy commitment: The summed offered capacity of all accepted aFRR Neg Energy results and all aFRR Neg Energy bids without a result.`}),`\n`,_jsx(_components.li,{children:`This calculation ensures we always have enough capacity available to fully deliver the aFRR Neg Capacity commitment which may be relevant in an emergency fallback scenario.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`If you place an aFRRNegCapacity or an aFRRNegEnergy bid, the value of the `,_jsx(_components.code,{children:`afrrNegCommitment`}),` timeseries is increased by the offered capacity of the bid.`]}),`\n`,_jsxs(_components.p,{children:[`At the same time, the value of the `,_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`}),` operational data timeseries is reduced by the offered capacity of the bid.`]}),`\n`,_jsx(Heading,{level:`1`,id:`9-what-is-the-behaviour-during-unavailabilities`,children:`9. What is the behaviour during unavailabilities?`}),`\n`,_jsx(_components.p,{children:`If a virtual asset is affected by an unavailability, we may:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Reduce a result to a lower accepted capacity and adjust the ancillary commitments timeseries accordingly.`}),`\n`,_jsx(_components.li,{children:`Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale power capacity before touching the ancillary bids and results.`}),`\n`,_jsx(_components.p,{children:`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:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrPosCommitment`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrNegCommitment`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`fcrCommitment`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`wholesalePowerCapacityChargeAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`wholesalePowerCapacityDischargeAvailable`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`stateOfEnergyBoundsUpper`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`stateOfEnergyBoundsLower`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`maximumDeliverablePower`}),` (available 15 minutes before delivery start)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`minimumDeliverablePower`}),` (available 15 minutes before delivery start)`]}),`\n`]}),`\n`,_jsx(Heading,{level:`1`,id:`10-how-do-i-check-activation-signals`,children:`10. How do I check activation signals?`}),`\n`,_jsx(_components.p,{children:`Bidding into ancillary services is equivalent to offering a certain amount of your available power capacity to the TSO which it can use to balance the grid. This is done via activation signals that are sent by the TSO to a physical asset that has placed a successful ancillary bid. These activation signals have a positive (discharge) or negative (charge) direction as well as a power capacity and must immediately be carried out by the physical asset that receives them.`}),`\n`,_jsx(_components.p,{children:`We will then forward the activation signals to your virtual asset for the bids you have placed.`}),`\n`,_jsx(_components.p,{children:`To check activation signals for the relevant markets, query the following operational data categories:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`fcrActivations`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrPosActivations`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`afrrNegActivations`})}),`\n`]}),`\n`,_jsx(Heading,{level:`1`,id:`11-bid-submission-examples`,children:`11. Bid submission examples`}),`\n`,_jsx(Heading,{level:`2`,id:`11-1-fcr-bid`,children:`11.1 FCR Bid`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr.png?fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=8eae4c6c089e87cdaae77810781282b6`,alt:`Power capacity distribution before and after an FCR bid of 5000 kW on EFA Block 1`,\"data-og-width\":`3664`,width:`3664`,\"data-og-height\":`1736`,height:`1736`,\"data-path\":`images/ancillary-va-example-fcr.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr.png?w=280\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=c3090f25d23c9d6f75e9be70afd94b91 280w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr.png?w=560\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=989c16aa37fbb68136aa309e18359ca8 560w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr.png?w=840\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=0bc95d21569d96deb94cc4425ba73dc0 840w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr.png?w=1100\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=dfd17a402c07ae8e32cbd78715b4b120 1100w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr.png?w=1650\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=35eeec6051c0e825bd22c6bcf32dc11a 1650w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr.png?w=2500\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=a31fe52818b983c8ad7471ed08756b1c 2500w`}),`\n`,_jsx(Heading,{level:`2`,id:`11-2-afrr-pos-capacity-bid`,children:`11.2 aFRR Pos Capacity bid`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-afrr-pos-capacity.png?fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=71b77cfccc77ae32003816718c2d7da5`,alt:`Power capacity distribution before and after an aFRR Pos Capacity bid of 5000 kW on EFA Block 1`,\"data-og-width\":`3664`,width:`3664`,\"data-og-height\":`1736`,height:`1736`,\"data-path\":`images/ancillary-va-example-afrr-pos-capacity.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-afrr-pos-capacity.png?w=280\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=b993768e7e6f122e8b5073df6c6e6c31 280w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-afrr-pos-capacity.png?w=560\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=d58c457579a6210b5b6d696d96b9708b 560w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-afrr-pos-capacity.png?w=840\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=ab05c6f1d400aecaf83408e10c7a8e8b 840w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-afrr-pos-capacity.png?w=1100\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=710c29ddf7acb9e090617de4bad92c61 1100w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-afrr-pos-capacity.png?w=1650\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=81d0081d262a4f92c9bc0d8da4383e3b 1650w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-afrr-pos-capacity.png?w=2500\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=81c5e94bcdb6c56cc5ea57949fe1f5e6 2500w`}),`\n`,_jsx(Heading,{level:`2`,id:`11-3-afrr-neg-capacity-bid`,children:`11.3 aFRR Neg Capacity bid`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-example-afrr-neg-capacity.png?fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=3e6da4e75e08ca6bdce19aa9a63dfd80`,alt:`Power capacity distribution before and after an aFRR Neg Capacity bid of 5000 kW on EFA Block 1`,\"data-og-width\":`3664`,width:`3664`,\"data-og-height\":`1736`,height:`1736`,\"data-path\":`images/ancillary-va-example-afrr-neg-capacity.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-example-afrr-neg-capacity.png?w=280\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=059671e59b519f6ce1dd30e8ccf899bb 280w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-example-afrr-neg-capacity.png?w=560\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=450fea44f10a8fde43706d1c7964820a 560w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-example-afrr-neg-capacity.png?w=840\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=52da09e0e16c858b5808cb586da87984 840w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-example-afrr-neg-capacity.png?w=1100\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=e68f1e7bc0a8d8b188e304aa86ab976c 1100w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-example-afrr-neg-capacity.png?w=1650\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=1671f843323e45fe313b5c8e8bd77cf7 1650w, https://mintcdn.com/terralayr-90/TJVl7F9DjIobfQi_/images/ancillary-va-example-afrr-neg-capacity.png?w=2500\u0026fit=max\u0026auto=format\u0026n=TJVl7F9DjIobfQi_\u0026q=85\u0026s=5ce436d7b1aa97726f8e8799d3e93b30 2500w`}),`\n`,_jsx(Heading,{level:`2`,id:`11-4-fcr-bid-and-afrr-pos-capacity-bid`,children:`11.4 FCR bid and aFRR Pos Capacity bid`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr-and-afrr-pos.png?fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=46d57df25d433c73fff981e64a7e389d`,alt:`Power capacity distribution after an FCR bid followed by an aFRR Pos Capacity bid, both 5000 kW on EFA Block 1`,\"data-og-width\":`3664`,width:`3664`,\"data-og-height\":`2568`,height:`2568`,\"data-path\":`images/ancillary-va-example-fcr-and-afrr-pos.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr-and-afrr-pos.png?w=280\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=85807ff4eae848de0425b3b8fc38d726 280w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr-and-afrr-pos.png?w=560\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=1e0ae35559f617299496e8f37172cd7f 560w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr-and-afrr-pos.png?w=840\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=4094853201f58ff83322ed2c5add5500 840w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr-and-afrr-pos.png?w=1100\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=c739d5235f79e1bd779050f71a0b53eb 1100w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr-and-afrr-pos.png?w=1650\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=24a5cc527f85a3ea5fb6ba3441985636 1650w, https://mintcdn.com/terralayr-90/jkSkumPmmx5h4v_O/images/ancillary-va-example-fcr-and-afrr-pos.png?w=2500\u0026fit=max\u0026auto=format\u0026n=jkSkumPmmx5h4v_O\u0026q=85\u0026s=fab82233a6a82a3dd59aa872d6a5ac4c 2500w`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Ancillary services (virtual asset level)","description":"Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.","href":"/layrUserGuide/features/ancillary-services-virtual-asset-level"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"1. What are ancillary services?","slug":"1-what-are-ancillary-services","depth":1,"children":[]},{"title":"2. Which ancillary markets can I bid into?","slug":"2-which-ancillary-markets-can-i-bid-into","depth":1,"children":[]},{"title":"2.1 FCR","slug":"2-1-fcr","depth":2,"children":[{"title":"2.1.1 Product names and product direction","slug":"2-1-1-product-names-and-product-direction","depth":3,"children":[]},{"title":"2.1.2 FCR buffer","slug":"2-1-2-fcr-buffer","depth":3,"children":[]},{"title":"2.1.3 Bidding deadlines","slug":"2-1-3-bidding-deadlines","depth":3,"children":[]},{"title":"2.1.4 Publication of results","slug":"2-1-4-publication-of-results","depth":3,"children":[]},{"title":"2.1.5 Auction and revenue calculation","slug":"2-1-5-auction-and-revenue-calculation","depth":3,"children":[]}]},{"title":"2.2 aFRR Capacity","slug":"2-2-afrr-capacity","depth":2,"children":[{"title":"2.2.1 Product names and directions","slug":"2-2-1-product-names-and-directions","depth":3,"children":[]},{"title":"2.2.2 Implicit aFRR Energy bids","slug":"2-2-2-implicit-afrr-energy-bids","depth":3,"children":[]},{"title":"2.2.3 Bidding deadlines","slug":"2-2-3-bidding-deadlines","depth":3,"children":[]},{"title":"2.2.4 Publication of results","slug":"2-2-4-publication-of-results","depth":3,"children":[]},{"title":"2.2.5 Auction and revenue calculation","slug":"2-2-5-auction-and-revenue-calculation","depth":3,"children":[]}]},{"title":"2.3 aFRR Energy","slug":"2-3-afrr-energy","depth":2,"children":[{"title":"2.3.1 Product names and directions","slug":"2-3-1-product-names-and-directions","depth":3,"children":[]},{"title":"2.3.2 Implicit vs. individual bids","slug":"2-3-2-implicit-vs-individual-bids","depth":3,"children":[]},{"title":"2.3.3 Bidding deadlines","slug":"2-3-3-bidding-deadlines","depth":3,"children":[]},{"title":"2.3.4 Publication of results","slug":"2-3-4-publication-of-results","depth":3,"children":[]},{"title":"2.3.5 Auction and revenue calculation","slug":"2-3-5-auction-and-revenue-calculation","depth":3,"children":[]}]},{"title":"3. Which endpoints do I need to implement?","slug":"3-which-endpoints-do-i-need-to-implement","depth":1,"children":[]},{"title":"3.1 Ancillary endpoints","slug":"3-1-ancillary-endpoints","depth":2,"children":[]},{"title":"3.2 Operational data endpoint","slug":"3-2-operational-data-endpoint","depth":2,"children":[{"title":"3.2.1 Mandatory categories","slug":"3-2-1-mandatory-categories","depth":3,"children":[]},{"title":"3.2.2 Optional categories (depending on implementation)","slug":"3-2-2-optional-categories-depending-on-implementation","depth":3,"children":[]}]},{"title":"4. How much can I bid into each market?","slug":"4-how-much-can-i-bid-into-each-market","depth":1,"children":[]},{"title":"4.1 Combined validation (recommended)","slug":"4-1-combined-validation-recommended","depth":2,"children":[]},{"title":"4.2 Two step validation (complex)","slug":"4-2-two-step-validation-complex","depth":2,"children":[{"title":"4.2.1 Validating individual market capacities","slug":"4-2-1-validating-individual-market-capacities","depth":3,"children":[]},{"title":"4.2.2 Validating max total ancillary capacity","slug":"4-2-2-validating-max-total-ancillary-capacity","depth":3,"children":[]}]},{"title":"5. How do I submit, update or delete a bid?","slug":"5-how-do-i-submit-update-or-delete-a-bid","depth":1,"children":[]},{"title":"6. How do I check submitted bids?","slug":"6-how-do-i-check-submitted-bids","depth":1,"children":[]},{"title":"7. How do I check results?","slug":"7-how-do-i-check-results","depth":1,"children":[]},{"title":"8. How do I check ancillary commitments and remaining wholesale capacity?","slug":"8-how-do-i-check-ancillary-commitments-and-remaining-wholesale-capacity","depth":1,"children":[]},{"title":"8.1 FCR commitment and wholesale buffer","slug":"8-1-fcr-commitment-and-wholesale-buffer","depth":2,"children":[]},{"title":"8.2 aFRR Pos commitment","slug":"8-2-afrr-pos-commitment","depth":2,"children":[]},{"title":"8.3 aFRR Neg commitment","slug":"8-3-afrr-neg-commitment","depth":2,"children":[]},{"title":"9. What is the behaviour during unavailabilities?","slug":"9-what-is-the-behaviour-during-unavailabilities","depth":1,"children":[]},{"title":"10. How do I check activation signals?","slug":"10-how-do-i-check-activation-signals","depth":1,"children":[]},{"title":"11. Bid submission examples","slug":"11-bid-submission-examples","depth":1,"children":[]},{"title":"11.1 FCR Bid","slug":"11-1-fcr-bid","depth":2,"children":[]},{"title":"11.2 aFRR Pos Capacity bid","slug":"11-2-afrr-pos-capacity-bid","depth":2,"children":[]},{"title":"11.3 aFRR Neg Capacity bid","slug":"11-3-afrr-neg-capacity-bid","depth":2,"children":[]},{"title":"11.4 FCR bid and aFRR Pos Capacity bid","slug":"11-4-fcr-bid-and-afrr-pos-capacity-bid","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"terralayr-90","siteName":"terralayr","title":"Ancillary services (virtual asset level) - terralayr","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-29T11:46:11.928Z","gitLastModified":"2026-10-29T11:45:58.000Z","originalFileLocation":"layrUserGuide/features/ancillary-services-virtual-asset-level.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.\">\u003cmeta data-mint-head name=\"application-name\" content=\"terralayr\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Ancillary services (virtual asset level) - terralayr\">\u003cmeta data-mint-head property=\"og:description\" content=\"Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"terralayr\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://terralayr-90.mintlify.app/_mintlify/api/og/v2?division=Features\u0026amp;title=Ancillary+services+%28virtual+asset+level%29\u0026amp;description=Implementation+guide+for+participating+in+FCR+and+aFRR+ancillary+service+markets+at+the+virtual+asset+level+on+Layr.\u0026amp;theme=6829ac6d8fb6a04cc851f81c\u0026amp;signature=68173dc764526020cb1e94831deeb39dcbf11793f91bba338bc155a7980e7191\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Ancillary services (virtual asset level) - terralayr\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://terralayr-90.mintlify.app/_mintlify/api/og/v2?division=Features\u0026amp;title=Ancillary+services+%28virtual+asset+level%29\u0026amp;description=Implementation+guide+for+participating+in+FCR+and+aFRR+ancillary+service+markets+at+the+virtual+asset+level+on+Layr.\u0026amp;theme=6829ac6d8fb6a04cc851f81c\u0026amp;signature=68173dc764526020cb1e94831deeb39dcbf11793f91bba338bc155a7980e7191\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/terralayr-90/QAqKhv9VYa2PiyeN/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"terralayr\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#13151A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/layrUserGuide/features/ancillary-services-virtual-asset-level.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.trlyr.com/#organization\",\"name\":\"terralayr\",\"url\":\"https://docs.trlyr.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/terralayr-90/i2mowZXsRr_Wp7MC/logo/terralayrDark.svg?fit=max\u0026auto=format\u0026n=i2mowZXsRr_Wp7MC\u0026q=85\u0026s=eb99311be47192737889489eb393e3d4\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.trlyr.com#website\",\"name\":\"terralayr\",\"url\":\"https://docs.trlyr.com\",\"publisher\":{\"@id\":\"https://docs.trlyr.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level#webpage\",\"url\":\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level\",\"name\":\"Ancillary services (virtual asset level)\",\"description\":\"Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.\",\"dateModified\":\"2026-10-29T11:45:58.000Z\",\"isPartOf\":{\"@id\":\"https://docs.trlyr.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"terralayr\",\"item\":\"https://docs.trlyr.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ancillary services (virtual asset level)\",\"item\":\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level#article\",\"headline\":\"Ancillary services (virtual asset level)\",\"name\":\"Ancillary services (virtual asset level)\",\"description\":\"Implementation guide for participating in FCR and aFRR ancillary service markets at the virtual asset level on Layr.\",\"url\":\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level\",\"mainEntityOfPage\":{\"@id\":\"https://docs.trlyr.com/layrUserGuide/features/ancillary-services-virtual-asset-level#webpage\"},\"dateModified\":\"2026-10-29T11:45:58.000Z\",\"publisher\":{\"@id\":\"https://docs.trlyr.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.trlyr.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"terralayr\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"terralayr","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Layr User Guide","groups":[{"group":"Overview","pages":[{"title":"Introduction","href":"/layrUserGuide/introduction"}]},{"group":"Getting Started","pages":[{"title":"Virtual asset off-taker onboarding","href":"/layrUserGuide/getting-started/offtaker-onboarding"},{"title":"Designated optimiser onboarding","href":"/layrUserGuide/getting-started/do-onboarding"},{"title":"Virtual battery auction (vBA) onboarding","href":"/layrUserGuide/getting-started/vba-onboarding"},{"title":"Asset owner platform onboarding","description":"An overview of the terralayr platform for asset owners: Connect, Control, and Ledger.","href":"/layrUserGuide/getting-started/asset-owner-onboarding"}]},{"group":"Features","pages":[{"title":"Ancillary services (virtual asset level)","href":"/layrUserGuide/features/ancillary-services-virtual-asset-level"},{"title":"Ancillary services (block level)","description":"How to manage virtual assets in FCR and aFRR ancillary service markets on Layr at the block level.","deprecated":true,"href":"/layrUserGuide/features/ancillary-services-block-level"},{"title":"Virtual asset unavailabilities","href":"/layrUserGuide/features/unavailabilities"},{"title":"Virtual Asset Scheduling Errors","href":"/layrUserGuide/features/scheduling-errors"}]},{"group":"Deep dives","pages":[{"title":"Ramp Rates","href":"/layrUserGuide/deep-dives/ramp-rates"},{"title":"Soft re-validation","href":"/layrUserGuide/deep-dives/soft-revalidation"},{"title":"Cycle limits","href":"/layrUserGuide/deep-dives/cycling-calculations"}]},{"group":"Reference","pages":[{"title":"Glossary","href":"/layrUserGuide/glossary"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/trlyr-API/introduction"}]},{"tab":"Product Updates \u0026 Changelog","pages":[{"title":"Product Updates \u0026 Changelog","href":"/changelog"}]},{"tab":"BESS Academy","pages":[{"title":"BESS Academy","href":"/BESS-academy/introduction"}]},{"tab":"LAYR Academy","pages":[{"title":"LAYR Academy","href":"/LAYR-academy/introduction"}]}]},"title":"Ancillary services (virtual asset level) - terralayr","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-CVZVK4hN.js","lightbox-handle-r17bVUz3.js"]}