Post or update ancillary bids for a given virtual asset.
Post or update ancillary bids for a virtual asset
The endpoint expects a list of ancillary bids.
The endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT).
Request body
The request body is a list of ancillary product bids you would like to place.
You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests.
product:
aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: {{direction}}_{{quarterHourInDay}}, e.g. POS_001 for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are POS_096 or NEG_096. The final products on the CET to CEST clock change day are POS_092 or NEG_092. The final products on the CEST to CET clock change day are POS_100 or NEG_100.
aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: {{direction}}_{{startEfaBlock}}_{{endEfaBlock}}, e.g. POS_00_04 for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24.
FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: {{direction}}_{{startEfaBlock}}_{{endEfaBlock}}, e.g. NEGPOS_00_04 for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24.
deliveryDay: The delivery day of the bid. It must be in the format YYYY-MM-DD, e.g. 2026-05-30 (full day according to RFC3339).
bids: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of maxBidsPerProduct setting on the virtual asset.
Each bid in the list contains the following fields whose contents can vary depending on the market:
offeredCapacity:
The offered capacity of the bid in kilowatts, e.g. 2000.
The value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected.
capacityPrice:
The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (< 0), you pay the TSO.
aFRR Energy: This field can be removed or left as null.
aFRR Capacity: The capacity price of the bid in EUR/MW/h, e.g. 100.00. This price is used to determine the position of the bid in the TSO’s merit order.
FCR: The capacity price of the FCR bid in EUR/MW, e.g. 100.00. This price is used to determine the position of the bid in the TSO’s merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below.
energyPrice:
The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (< 0), you pay the TSO.
aFRR Energy: The energy price of the bid in EUR/MWh, e.g. 100.00. This price is used to determine the position of the bid in the TSO’s merit order.
aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in EUR/MWh, e.g. 100.00.
FCR: This field can be removed or left as null.
Bidding deadlines
aFRR Energy
All bids must be placed before the following deadline: 30 minutes before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after 12:00pm CET/CEST on the day before delivery. If bids are made before that time, they are rejected.
aFRR Capacity
All bids must be placed before the following deadline: 8:40am CET/CEST on the day before delivery. The auction opens a week before the delivery day.
FCR
All bids must be placed before the following deadline: 7:30 am CET/CEST on the day before delivery. The auction opens a week before the delivery day.
Additional context for aFRR bids
aFRR Capacity bids and implicit aFRR Energy bids
When submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid.
This is done by providing a mandatory energyPrice on each Capacity bid. You do not need to submit the implicit Energy bids yourself, they are automatically created upon submission of an aFRR Capacity bid and returned as part of the response body.
Each of the 16 Energy bids will have the same offeredCapacity as the corresponding Capacity bid.
These Energy bids can still be updated in their energyPrice and offeredCapacity after the Capacity bid has received a result. However, if the Capacity bid was accepted, the offeredCapacity of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected.
Individual aFRR Energy bids
You may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid.
These must be submitted within the aFRR Energy bidding deadlines.
Determining available bidding capacity
Individual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation.
Combined validation: Validation 1 + 2 in a single step (recommended)
We recommend a simplified validation process which combines the individual market validation and the cross-market validation.
The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailableMinusFcr, afrrPosCapacityAvailableMinusFcr and fcrCapacityAvailable respectively.
These categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation.
Remaining capacity for products POS_001-POS_016: 1000 kW
Remaining capacity for product NEG_00_04: 1000 kW
Remaining capacity for products NEG_001-NEG_016: 1000 kW
As becomes clear from the example, the minusFcr timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the minusFcr timeseries ensures your aFRR bids will pass both validations.
The following formula is used for this calculation:
The offeredCapacity for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset.
The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailable, afrrPosCapacityAvailable and fcrCapacityAvailable respectively.
Example:
afrrPosCapacityAvailable from 00:00-04:00 am: 4000 kW
afrrNegCapacityAvailable from 00:00-04:00 am: 5000 kW
Remaining capacity for product POS_00_04: 4000 kW
Remaining capacity for products POS_001-POS_016: 4000 kW
Remaining capacity for product NEG_00_04: 5000 kW
Remaining capacity for products NEG_001-NEG_016: 5000 kW
Validation 2: Cross-market validation
The offeredCapacity for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset.
An aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity.
An aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity.
An FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity.
The max total ancillary capacity can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category maxTotalAncillaryCapacityChargeAvailable (negative direction) and maxTotalAncillaryCapacityDischargeAvailable (positive direction) respectively.
Once a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted.
You can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained.
You can check your ancillary commitments per market through the operationalData endpoint on the virtual asset, by requesting the following categories: fcrCommitment, afrrPosCommitment, afrrNegCommitment.
You can check your available wholesale capacity by requesting the following categories: wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable.
If you place a FCR bid, the value of the fcrCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity.
If you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the afrrNegCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable operational data timeseries is reduced by offeredCapacity.
If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the afrrPosCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity.
Behaviour during unavailability
If a virtual asset is affected by an unavailability, we may:
1, Reduce a result to a lower acceptedCapacity and adjust the ancillary commitments timeseries accordingly.
2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly.
Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids.
To be informed about the state of your ancillary commitments and the available wholesale capacity, make sure to always monitor the following operational data categories: afrrPosCommitment, afrrNegCommitment, fcrCommitment, wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable.
Response format
Returns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields:
bidID: The uuid of the individual product bid.
market: The market of the submitted product bid. One of: AFRRCapacity, AFRREnergy, FCR.
status:
The status of the bid, one of: pending, submitted.
submitted confirms that the bid has been placed successfully with the TSO.
pending indicates that the process of placing the bid with the TSO is still in progress. While a bid has status pending, it cannot be updated to avoid double bidding.
POST
/
organisations
/
{organisationID}
/
virtual-assets
/
{virtualAssetID}
/
ancillary
/
bids
Post or update ancillary bids for a given virtual asset.
{"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.4039","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":"full-page-search","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":"virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset","slug":"/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset","pageMetadata":{"title":"Post or update ancillary bids for a given virtual asset.","description":"# Post or update ancillary bids for a virtual asset\n\nThe endpoint expects a list of ancillary bids. \n\nThe endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT).\n\n## Request body\n\nThe request body is a list of ancillary product bids you would like to place. \n\nYou can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests.\n\n`product`:\n- aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: `{{direction}}_{{quarterHourInDay}}`, e.g. `POS_001` for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are `POS_096` or `NEG_096`. The final products on the CET to CEST clock change day are `POS_092` or `NEG_092`. The final products on the CEST to CET clock change day are `POS_100` or `NEG_100`.\n- aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: `{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}`, e.g. `POS_00_04` for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24.\n- FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: `{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}`, e.g. `NEGPOS_00_04` for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24.\n\n`deliveryDay`: The delivery day of the bid. It must be in the format `YYYY-MM-DD`, e.g. `2026-05-30` (full day according to RFC3339).\n\n`bids`: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of `maxBidsPerProduct` setting on the virtual asset.\n\nEach bid in the list contains the following fields whose contents can vary depending on the market:\n\n`offeredCapacity`:\n\nThe offered capacity of the bid in **kilowatts**, e.g. `2000`.\n\nThe value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected.\n\n`capacityPrice`:\n\nThe max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\u003c 0), you pay the TSO.\n- aFRR Energy: This field can be removed or left as `null`.\n- aFRR Capacity: The capacity price of the bid in **EUR/MW/h**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order.\n- FCR: The capacity price of the FCR bid in **EUR/MW**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below.\n\n`energyPrice`:\n\nThe max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\u003c 0), you pay the TSO.\n- aFRR Energy: The energy price of the bid in **EUR/MWh**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order.\n- aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in **EUR/MWh**, e.g. `100.00`. \n- FCR: This field can be removed or left as `null`.\n\n## Bidding deadlines\n\n### aFRR Energy\nAll bids must be placed before the following deadline: **30 minutes** before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after **12:00pm CET/CEST** on the day before delivery. If bids are made before that time, they are rejected.\n\n### aFRR Capacity\nAll bids must be placed before the following deadline: **8:40am CET/CEST** on the day before delivery. The auction opens a week before the delivery day.\n\n### FCR\nAll bids must be placed before the following deadline: **7:30 am CET/CEST** on the day before delivery. The auction opens a week before the delivery day.\n\n## Additional context for aFRR bids\n\n### aFRR Capacity bids and implicit aFRR Energy bids\nWhen submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid.\n\nThis 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.\n\nEach of the 16 Energy bids will have the same `offeredCapacity` as the corresponding Capacity bid.\n\nThese 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.\n\n### Individual aFRR Energy bids\n\nYou may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid. \n\nThese must be submitted within the aFRR Energy bidding deadlines.\n\n## Determining available bidding capacity\n\nIndividual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation.\n\n### Combined validation: Validation 1 + 2 in a single step (recommended)\n\nWe recommend a simplified validation process which combines the individual market validation and the cross-market validation.\n\nThe value can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `afrrNegCapacityAvailableMinusFcr`, `afrrPosCapacityAvailableMinusFcr` and `fcrCapacityAvailable` respectively.\n\nThese categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation.\n\nExample:\n- `maxTotalAncillaryCapacityDischargeAvailable`: 5000 kW\n- `maxTotalAncillaryCapacityChargeAvailable`: 5000 kW\n- `fcrCommitment` for `NEGPOS_00_04`: 4000 kW\n- `afrrPosCapacityAvailable`: 3000 kW\n- `afrrNegCapacityAvailable`: 3000 kW\n- `afrrPosCapacityAvailableMinusFcr`: **1000 kW** (minimum(5000 kW - 4000 kW), 3000kW))\n- `afrrNegCapacityAvailableMinusFcr`: **1000 kW** (minimum(5000 kW - 4000 kW), 3000kW))\n- Remaining capacity for product `POS_00_04`: 1000 kW\n- Remaining capacity for products `POS_001`-`POS_016`: 1000 kW\n- Remaining capacity for product `NEG_00_04`: 1000 kW\n- Remaining capacity for products `NEG_001`-`NEG_016`: 1000 kW\n\nAs becomes clear from the example, the `minusFcr` timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the `minusFcr` timeseries ensures your aFRR bids will pass both validations.\n\nThe following formula is used for this calculation:\n\n```bash\nafrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable)\n\nafrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable)\n```\n\n### Two step validation (more complex)\n\n#### Validation 1: Individual market validation\n\nThe `offeredCapacity` for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset.\n\nThe value can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `afrrNegCapacityAvailable`, `afrrPosCapacityAvailable` and `fcrCapacityAvailable` respectively.\n\nExample:\n- `afrrPosCapacityAvailable` from 00:00-04:00 am: 4000 kW\n- `afrrNegCapacityAvailable` from 00:00-04:00 am: 5000 kW\n- Remaining capacity for product `POS_00_04`: 4000 kW\n- Remaining capacity for products `POS_001`-`POS_016`: 4000 kW\n- Remaining capacity for product `NEG_00_04`: 5000 kW\n- Remaining capacity for products `NEG_001`-`NEG_016`: 5000 kW\n\n#### Validation 2: Cross-market validation\n\nThe `offeredCapacity` for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset.\n\nAn aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity.\n\nAn aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity.\n\nAn FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity.\n\nThe max total ancillary capacity can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `maxTotalAncillaryCapacityChargeAvailable` (negative direction) and `maxTotalAncillaryCapacityDischargeAvailable` (positive direction) respectively.\n\nExample:\n- `maxTotalAncillaryCapacityDischargeAvailable`: 5000 kW\n- `maxTotalAncillaryCapacityChargeAvailable`: 4000 kW\n- `fcrCommitment` for `NEGPOS_00_04`: 3000 kW\n- `afrrPosCapacityAvailable`: 3000 kW\n- `afrrNegCapacityAvailable`: 3000 kW\n- Remaining capacity for product `POS_00_04`: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW))\n- Remaining capacity for products `POS_001`-`POS_016`: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW))\n- Remaining capacity for product `NEG_00_04`: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))\n- Remaining capacity for products `NEG_001`-`NEG_016`: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))\n\n## Deleting bids\n\nTo delete a bid, set the bid body as an empty array:\n\n```json\n[\n {\n \"bids\": [],\n \"deliveryDay\": \"2026-04-10\",\n \"product\": \"POS_00_04\"\n }\n]\n```\n\n## Ancillary commitments and wholesale capacity\n\n### Behaviour during full availability\n\nOnce a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted.\n\nYou can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained.\n\nYou can check your ancillary commitments per market through the `operationalData` endpoint on the virtual asset, by requesting the following categories: `fcrCommitment`, `afrrPosCommitment`, `afrrNegCommitment`.\n\nYou can check your available wholesale capacity by requesting the following categories: `wholesalePowerCapacityChargeAvailable`, `wholesalePowerCapacityDischargeAvailable`.\n\nIf you place a FCR bid, the value of the `fcrCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityChargeAvailable` and `wholesalePowerCapacityDischargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\nIf you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the `afrrNegCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityChargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\nIf you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the `afrrPosCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityDischargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\n### Behaviour during unavailability\n\nIf a virtual asset is affected by an unavailability, we may:\n\n1, Reduce a result to a lower `acceptedCapacity` and adjust the ancillary commitments timeseries accordingly.\n\n2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly.\n\nNotably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids.\n\nTo 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`.\n\n## Response format\n\nReturns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields:\n\n`bidID`: The uuid of the individual product bid.\n\n`market`: The market of the submitted product bid. One of: `AFRRCapacity`, `AFRREnergy`, `FCR`.\n\n`status`: \n- The status of the bid, one of: `pending`, `submitted`. \n- `submitted` confirms that the bid has been placed successfully with the TSO. \n- `pending` indicates that the process of placing the bid with the TSO is still in progress. While a bid has status `pending`, it cannot be updated to avoid double bidding. \n","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json post /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/bids","href":"/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n h1: \"h1\",\n h2: \"h2\",\n h3: \"h3\",\n h4: \"h4\",\n li: \"li\",\n p: \"p\",\n pre: \"pre\",\n span: \"span\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n }, {CodeBlock} = _components;\n if (!CodeBlock) _missingMdxReference(\"CodeBlock\", true);\n return _jsxs(_Fragment, {\n children: [_jsx(_components.h1, {\n children: \"Post or update ancillary bids for a virtual asset\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"The endpoint expects a list of ancillary bids.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"The endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT).\"\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Request body\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"The request body is a list of ancillary product bids you would like to place.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"product\"\n }), \":\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: \", _jsx(_components.code, {\n children: \"{{direction}}_{{quarterHourInDay}}\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"POS_001\"\n }), \" for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are \", _jsx(_components.code, {\n children: \"POS_096\"\n }), \" or \", _jsx(_components.code, {\n children: \"NEG_096\"\n }), \". The final products on the CET to CEST clock change day are \", _jsx(_components.code, {\n children: \"POS_092\"\n }), \" or \", _jsx(_components.code, {\n children: \"NEG_092\"\n }), \". The final products on the CEST to CET clock change day are \", _jsx(_components.code, {\n children: \"POS_100\"\n }), \" or \", _jsx(_components.code, {\n children: \"NEG_100\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: \", _jsx(_components.code, {\n children: \"{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"POS_00_04\"\n }), \" for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: \", _jsx(_components.code, {\n children: \"{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"NEGPOS_00_04\"\n }), \" for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"deliveryDay\"\n }), \": The delivery day of the bid. It must be in the format \", _jsx(_components.code, {\n children: \"YYYY-MM-DD\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"2026-05-30\"\n }), \" (full day according to RFC3339).\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"bids\"\n }), \": A list of individual bids for the product. You can submit multiple bids per product, depending on the value of \", _jsx(_components.code, {\n children: \"maxBidsPerProduct\"\n }), \" setting on the virtual asset.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Each bid in the list contains the following fields whose contents can vary depending on the market:\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \":\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The offered capacity of the bid in \", _jsx(_components.strong, {\n children: \"kilowatts\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"2000\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"The value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"capacityPrice\"\n }), \":\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\u003c 0), you pay the TSO.\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"aFRR Energy: This field can be removed or left as \", _jsx(_components.code, {\n children: \"null\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"aFRR Capacity: The capacity price of the bid in \", _jsx(_components.strong, {\n children: \"EUR/MW/h\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"100.00\"\n }), \". This price is used to determine the position of the bid in the TSO’s merit order.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"FCR: The capacity price of the FCR bid in \", _jsx(_components.strong, {\n children: \"EUR/MW\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"100.00\"\n }), \". This price is used to determine the position of the bid in the TSO’s merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"energyPrice\"\n }), \":\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\u003c 0), you pay the TSO.\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"aFRR Energy: The energy price of the bid in \", _jsx(_components.strong, {\n children: \"EUR/MWh\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"100.00\"\n }), \". This price is used to determine the position of the bid in the TSO’s merit order.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in \", _jsx(_components.strong, {\n children: \"EUR/MWh\"\n }), \", e.g. \", _jsx(_components.code, {\n children: \"100.00\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"FCR: This field can be removed or left as \", _jsx(_components.code, {\n children: \"null\"\n }), \".\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Bidding deadlines\"\n }), \"\\n\", _jsx(_components.h3, {\n children: \"aFRR Energy\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"All bids must be placed before the following deadline: \", _jsx(_components.strong, {\n children: \"30 minutes\"\n }), \" before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after \", _jsx(_components.strong, {\n children: \"12:00pm CET/CEST\"\n }), \" on the day before delivery. If bids are made before that time, they are rejected.\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"aFRR Capacity\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"All bids must be placed before the following deadline: \", _jsx(_components.strong, {\n children: \"8:40am CET/CEST\"\n }), \" on the day before delivery. The auction opens a week before the delivery day.\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"FCR\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"All bids must be placed before the following deadline: \", _jsx(_components.strong, {\n children: \"7:30 am CET/CEST\"\n }), \" on the day before delivery. The auction opens a week before the delivery day.\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Additional context for aFRR bids\"\n }), \"\\n\", _jsx(_components.h3, {\n children: \"aFRR Capacity bids and implicit aFRR Energy bids\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"When submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"This is done by providing a mandatory \", _jsx(_components.code, {\n children: \"energyPrice\"\n }), \" 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 }), \"\\n\", _jsxs(_components.p, {\n children: [\"Each of the 16 Energy bids will have the same \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \" as the corresponding Capacity bid.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"These Energy bids can still be updated in their \", _jsx(_components.code, {\n children: \"energyPrice\"\n }), \" and \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \" after the Capacity bid has received a result. However, if the Capacity bid was accepted, the \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \" of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected.\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Individual aFRR Energy bids\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"You may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"These must be submitted within the aFRR Energy bidding deadlines.\"\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Determining available bidding capacity\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"Individual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation.\"\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Combined validation: Validation 1 + 2 in a single step (recommended)\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"We recommend a simplified validation process which combines the individual market validation and the cross-market validation.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The value can be retrieved from the \", _jsx(_components.code, {\n children: \"operationalData\"\n }), \" endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category \", _jsx(_components.code, {\n children: \"afrrNegCapacityAvailableMinusFcr\"\n }), \", \", _jsx(_components.code, {\n children: \"afrrPosCapacityAvailableMinusFcr\"\n }), \" and \", _jsx(_components.code, {\n children: \"fcrCapacityAvailable\"\n }), \" respectively.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"These categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"Example:\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"maxTotalAncillaryCapacityDischargeAvailable\"\n }), \": 5000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"maxTotalAncillaryCapacityChargeAvailable\"\n }), \": 5000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"fcrCommitment\"\n }), \" for \", _jsx(_components.code, {\n children: \"NEGPOS_00_04\"\n }), \": 4000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"afrrPosCapacityAvailable\"\n }), \": 3000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"afrrNegCapacityAvailable\"\n }), \": 3000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"afrrPosCapacityAvailableMinusFcr\"\n }), \": \", _jsx(_components.strong, {\n children: \"1000 kW\"\n }), \" (minimum(5000 kW - 4000 kW), 3000kW))\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"afrrNegCapacityAvailableMinusFcr\"\n }), \": \", _jsx(_components.strong, {\n children: \"1000 kW\"\n }), \" (minimum(5000 kW - 4000 kW), 3000kW))\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for product \", _jsx(_components.code, {\n children: \"POS_00_04\"\n }), \": 1000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for products \", _jsx(_components.code, {\n children: \"POS_001\"\n }), \"-\", _jsx(_components.code, {\n children: \"POS_016\"\n }), \": 1000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for product \", _jsx(_components.code, {\n children: \"NEG_00_04\"\n }), \": 1000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for products \", _jsx(_components.code, {\n children: \"NEG_001\"\n }), \"-\", _jsx(_components.code, {\n children: \"NEG_016\"\n }), \": 1000 kW\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"As becomes clear from the example, the \", _jsx(_components.code, {\n children: \"minusFcr\"\n }), \" timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the \", _jsx(_components.code, {\n children: \"minusFcr\"\n }), \" timeseries ensures your aFRR bids will pass both validations.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"The following formula is used for this calculation:\"\n }), \"\\n\", _jsx(CodeBlock, {\n numberOfLines: \"3\",\n language: \"shellscript\",\n children: _jsx(_components.pre, {\n className: \"shiki shiki-themes github-light-default dark-plus\",\n style: {\n backgroundColor: \"#ffffff\",\n \"--shiki-dark-bg\": \"#0B0C0E\",\n color: \"#1f2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n language: \"shellscript\",\n children: _jsxs(_components.code, {\n language: \"shellscript\",\n numberOfLines: \"3\",\n children: [_jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#953800\",\n \"--shiki-dark\": \"#DCDCAA\"\n },\n children: \"afrrPosCapacityAvailableMinusFcr\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" =\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" minimum\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \"((\"\n }), _jsx(_components.span, {\n style: {\n color: \"#953800\",\n \"--shiki-dark\": \"#DCDCAA\"\n },\n children: \"maxTotalAncillaryCapacityDischargeAvailable\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" -\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" fcrCommitment\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \")\"\n }), _jsx(_components.span, {\n style: {\n color: \"#953800\",\n \"--shiki-dark\": \"#DCDCAA\"\n },\n children: \",\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" afrrPosCapacityAvailable\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \")\"\n })]\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\"\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#953800\",\n \"--shiki-dark\": \"#DCDCAA\"\n },\n children: \"afrrNegCapacityAvailableMinusFcr\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" =\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" minimum\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \"((\"\n }), _jsx(_components.span, {\n style: {\n color: \"#953800\",\n \"--shiki-dark\": \"#DCDCAA\"\n },\n children: \"maxTotalAncillaryCapacityChargeAvailable\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" -\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" fcrCommitment\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \")\"\n }), _jsx(_components.span, {\n style: {\n color: \"#953800\",\n \"--shiki-dark\": \"#DCDCAA\"\n },\n children: \",\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" afrrNegCapacityAvailable\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \")\"\n })]\n }), \"\\n\"]\n })\n })\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Two step validation (more complex)\"\n }), \"\\n\", _jsx(_components.h4, {\n children: \"Validation 1: Individual market validation\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \" for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The value can be retrieved from the \", _jsx(_components.code, {\n children: \"operationalData\"\n }), \" endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category \", _jsx(_components.code, {\n children: \"afrrNegCapacityAvailable\"\n }), \", \", _jsx(_components.code, {\n children: \"afrrPosCapacityAvailable\"\n }), \" and \", _jsx(_components.code, {\n children: \"fcrCapacityAvailable\"\n }), \" respectively.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Example:\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"afrrPosCapacityAvailable\"\n }), \" from 00:00-04:00 am: 4000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"afrrNegCapacityAvailable\"\n }), \" from 00:00-04:00 am: 5000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for product \", _jsx(_components.code, {\n children: \"POS_00_04\"\n }), \": 4000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for products \", _jsx(_components.code, {\n children: \"POS_001\"\n }), \"-\", _jsx(_components.code, {\n children: \"POS_016\"\n }), \": 4000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for product \", _jsx(_components.code, {\n children: \"NEG_00_04\"\n }), \": 5000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for products \", _jsx(_components.code, {\n children: \"NEG_001\"\n }), \"-\", _jsx(_components.code, {\n children: \"NEG_016\"\n }), \": 5000 kW\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.h4, {\n children: \"Validation 2: Cross-market validation\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \" for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"An aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"An aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"An FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The max total ancillary capacity can be retrieved from the \", _jsx(_components.code, {\n children: \"operationalData\"\n }), \" endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category \", _jsx(_components.code, {\n children: \"maxTotalAncillaryCapacityChargeAvailable\"\n }), \" (negative direction) and \", _jsx(_components.code, {\n children: \"maxTotalAncillaryCapacityDischargeAvailable\"\n }), \" (positive direction) respectively.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Example:\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"maxTotalAncillaryCapacityDischargeAvailable\"\n }), \": 5000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"maxTotalAncillaryCapacityChargeAvailable\"\n }), \": 4000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"fcrCommitment\"\n }), \" for \", _jsx(_components.code, {\n children: \"NEGPOS_00_04\"\n }), \": 3000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"afrrPosCapacityAvailable\"\n }), \": 3000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"afrrNegCapacityAvailable\"\n }), \": 3000 kW\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for product \", _jsx(_components.code, {\n children: \"POS_00_04\"\n }), \": 2000 kW (minimum(5000 kW - 3000 kW), 3000kW))\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for products \", _jsx(_components.code, {\n children: \"POS_001\"\n }), \"-\", _jsx(_components.code, {\n children: \"POS_016\"\n }), \": 2000 kW (minimum(5000 kW - 3000 kW), 3000kW))\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for product \", _jsx(_components.code, {\n children: \"NEG_00_04\"\n }), \": 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Remaining capacity for products \", _jsx(_components.code, {\n children: \"NEG_001\"\n }), \"-\", _jsx(_components.code, {\n children: \"NEG_016\"\n }), \": 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Deleting bids\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"To delete a bid, set the bid body as an empty array:\"\n }), \"\\n\", _jsx(CodeBlock, {\n numberOfLines: \"7\",\n language: \"json\",\n children: _jsx(_components.pre, {\n className: \"shiki shiki-themes github-light-default dark-plus\",\n style: {\n backgroundColor: \"#ffffff\",\n \"--shiki-dark-bg\": \"#0B0C0E\",\n color: \"#1f2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n language: \"json\",\n children: _jsxs(_components.code, {\n language: \"json\",\n numberOfLines: \"7\",\n children: [_jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \"[\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \" {\"\n })\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"bids\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": [],\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"deliveryDay\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"2026-04-10\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"product\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"POS_00_04\\\"\"\n })]\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \" }\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \"]\"\n })\n }), \"\\n\"]\n })\n })\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Ancillary commitments and wholesale capacity\"\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Behaviour during full availability\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"Once a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"You can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"You can check your ancillary commitments per market through the \", _jsx(_components.code, {\n children: \"operationalData\"\n }), \" endpoint on the virtual asset, by requesting the following categories: \", _jsx(_components.code, {\n children: \"fcrCommitment\"\n }), \", \", _jsx(_components.code, {\n children: \"afrrPosCommitment\"\n }), \", \", _jsx(_components.code, {\n children: \"afrrNegCommitment\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"You can check your available wholesale capacity by requesting the following categories: \", _jsx(_components.code, {\n children: \"wholesalePowerCapacityChargeAvailable\"\n }), \", \", _jsx(_components.code, {\n children: \"wholesalePowerCapacityDischargeAvailable\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"If you place a FCR bid, the value of the \", _jsx(_components.code, {\n children: \"fcrCommitment\"\n }), \" timeseries increases by the \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \" of your bid. At the same time, the value of the \", _jsx(_components.code, {\n children: \"wholesalePowerCapacityChargeAvailable\"\n }), \" and \", _jsx(_components.code, {\n children: \"wholesalePowerCapacityDischargeAvailable\"\n }), \" operational data timeseries is reduced by \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"If you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the \", _jsx(_components.code, {\n children: \"afrrNegCommitment\"\n }), \" timeseries increases by the \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \" of your bid. At the same time, the value of the \", _jsx(_components.code, {\n children: \"wholesalePowerCapacityChargeAvailable\"\n }), \" operational data timeseries is reduced by \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the \", _jsx(_components.code, {\n children: \"afrrPosCommitment\"\n }), \" timeseries increases by the \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \" of your bid. At the same time, the value of the \", _jsx(_components.code, {\n children: \"wholesalePowerCapacityDischargeAvailable\"\n }), \" operational data timeseries is reduced by \", _jsx(_components.code, {\n children: \"offeredCapacity\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Behaviour during unavailability\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"If a virtual asset is affected by an unavailability, we may:\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"1, Reduce a result to a lower \", _jsx(_components.code, {\n children: \"acceptedCapacity\"\n }), \" and adjust the ancillary commitments timeseries accordingly.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids.\"\n }), \"\\n\", _jsxs(_components.p, {\n 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: \", _jsx(_components.code, {\n children: \"afrrPosCommitment\"\n }), \", \", _jsx(_components.code, {\n children: \"afrrNegCommitment\"\n }), \", \", _jsx(_components.code, {\n children: \"fcrCommitment\"\n }), \", \", _jsx(_components.code, {\n children: \"wholesalePowerCapacityChargeAvailable\"\n }), \", \", _jsx(_components.code, {\n children: \"wholesalePowerCapacityDischargeAvailable\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Response format\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"Returns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields:\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"bidID\"\n }), \": The uuid of the individual product bid.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"market\"\n }), \": The market of the submitted product bid. One of: \", _jsx(_components.code, {\n children: \"AFRRCapacity\"\n }), \", \", _jsx(_components.code, {\n children: \"AFRREnergy\"\n }), \", \", _jsx(_components.code, {\n children: \"FCR\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"status\"\n }), \":\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"The status of the bid, one of: \", _jsx(_components.code, {\n children: \"pending\"\n }), \", \", _jsx(_components.code, {\n children: \"submitted\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"submitted\"\n }), \" confirms that the bid has been placed successfully with the TSO.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"pending\"\n }), \" indicates that the process of placing the bid with the TSO is still in progress. While a bid has status \", _jsx(_components.code, {\n children: \"pending\"\n }), \", it cannot be updated to avoid double bidding.\"]\n }), \"\\n\"]\n })]\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};\nfunction _missingMdxReference(id, component) {\n throw new Error(\"Expected \" + (component ? \"component\" : \"object\") + \" `\" + id + \"` to be defined: you likely forgot to import, pass, or provide it.\");\n}\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Post or update ancillary bids for a given virtual asset.","description":"# Post or update ancillary bids for a virtual asset\n\nThe endpoint expects a list of ancillary bids. \n\nThe endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT).\n\n## Request body\n\nThe request body is a list of ancillary product bids you would like to place. \n\nYou can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests.\n\n`product`:\n- aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: `{{direction}}_{{quarterHourInDay}}`, e.g. `POS_001` for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are `POS_096` or `NEG_096`. The final products on the CET to CEST clock change day are `POS_092` or `NEG_092`. The final products on the CEST to CET clock change day are `POS_100` or `NEG_100`.\n- aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: `{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}`, e.g. `POS_00_04` for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24.\n- FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: `{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}`, e.g. `NEGPOS_00_04` for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24.\n\n`deliveryDay`: The delivery day of the bid. It must be in the format `YYYY-MM-DD`, e.g. `2026-05-30` (full day according to RFC3339).\n\n`bids`: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of `maxBidsPerProduct` setting on the virtual asset.\n\nEach bid in the list contains the following fields whose contents can vary depending on the market:\n\n`offeredCapacity`:\n\nThe offered capacity of the bid in **kilowatts**, e.g. `2000`.\n\nThe value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected.\n\n`capacityPrice`:\n\nThe max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\u003c 0), you pay the TSO.\n- aFRR Energy: This field can be removed or left as `null`.\n- aFRR Capacity: The capacity price of the bid in **EUR/MW/h**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order.\n- FCR: The capacity price of the FCR bid in **EUR/MW**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below.\n\n`energyPrice`:\n\nThe max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\u003c 0), you pay the TSO.\n- aFRR Energy: The energy price of the bid in **EUR/MWh**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order.\n- aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in **EUR/MWh**, e.g. `100.00`. \n- FCR: This field can be removed or left as `null`.\n\n## Bidding deadlines\n\n### aFRR Energy\nAll bids must be placed before the following deadline: **30 minutes** before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after **12:00pm CET/CEST** on the day before delivery. If bids are made before that time, they are rejected.\n\n### aFRR Capacity\nAll bids must be placed before the following deadline: **8:40am CET/CEST** on the day before delivery. The auction opens a week before the delivery day.\n\n### FCR\nAll bids must be placed before the following deadline: **7:30 am CET/CEST** on the day before delivery. The auction opens a week before the delivery day.\n\n## Additional context for aFRR bids\n\n### aFRR Capacity bids and implicit aFRR Energy bids\nWhen submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid.\n\nThis 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.\n\nEach of the 16 Energy bids will have the same `offeredCapacity` as the corresponding Capacity bid.\n\nThese 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.\n\n### Individual aFRR Energy bids\n\nYou may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid. \n\nThese must be submitted within the aFRR Energy bidding deadlines.\n\n## Determining available bidding capacity\n\nIndividual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation.\n\n### Combined validation: Validation 1 + 2 in a single step (recommended)\n\nWe recommend a simplified validation process which combines the individual market validation and the cross-market validation.\n\nThe value can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `afrrNegCapacityAvailableMinusFcr`, `afrrPosCapacityAvailableMinusFcr` and `fcrCapacityAvailable` respectively.\n\nThese categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation.\n\nExample:\n- `maxTotalAncillaryCapacityDischargeAvailable`: 5000 kW\n- `maxTotalAncillaryCapacityChargeAvailable`: 5000 kW\n- `fcrCommitment` for `NEGPOS_00_04`: 4000 kW\n- `afrrPosCapacityAvailable`: 3000 kW\n- `afrrNegCapacityAvailable`: 3000 kW\n- `afrrPosCapacityAvailableMinusFcr`: **1000 kW** (minimum(5000 kW - 4000 kW), 3000kW))\n- `afrrNegCapacityAvailableMinusFcr`: **1000 kW** (minimum(5000 kW - 4000 kW), 3000kW))\n- Remaining capacity for product `POS_00_04`: 1000 kW\n- Remaining capacity for products `POS_001`-`POS_016`: 1000 kW\n- Remaining capacity for product `NEG_00_04`: 1000 kW\n- Remaining capacity for products `NEG_001`-`NEG_016`: 1000 kW\n\nAs becomes clear from the example, the `minusFcr` timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the `minusFcr` timeseries ensures your aFRR bids will pass both validations.\n\nThe following formula is used for this calculation:\n\n```bash\nafrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable)\n\nafrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable)\n```\n\n### Two step validation (more complex)\n\n#### Validation 1: Individual market validation\n\nThe `offeredCapacity` for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset.\n\nThe value can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `afrrNegCapacityAvailable`, `afrrPosCapacityAvailable` and `fcrCapacityAvailable` respectively.\n\nExample:\n- `afrrPosCapacityAvailable` from 00:00-04:00 am: 4000 kW\n- `afrrNegCapacityAvailable` from 00:00-04:00 am: 5000 kW\n- Remaining capacity for product `POS_00_04`: 4000 kW\n- Remaining capacity for products `POS_001`-`POS_016`: 4000 kW\n- Remaining capacity for product `NEG_00_04`: 5000 kW\n- Remaining capacity for products `NEG_001`-`NEG_016`: 5000 kW\n\n#### Validation 2: Cross-market validation\n\nThe `offeredCapacity` for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset.\n\nAn aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity.\n\nAn aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity.\n\nAn FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity.\n\nThe max total ancillary capacity can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `maxTotalAncillaryCapacityChargeAvailable` (negative direction) and `maxTotalAncillaryCapacityDischargeAvailable` (positive direction) respectively.\n\nExample:\n- `maxTotalAncillaryCapacityDischargeAvailable`: 5000 kW\n- `maxTotalAncillaryCapacityChargeAvailable`: 4000 kW\n- `fcrCommitment` for `NEGPOS_00_04`: 3000 kW\n- `afrrPosCapacityAvailable`: 3000 kW\n- `afrrNegCapacityAvailable`: 3000 kW\n- Remaining capacity for product `POS_00_04`: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW))\n- Remaining capacity for products `POS_001`-`POS_016`: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW))\n- Remaining capacity for product `NEG_00_04`: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))\n- Remaining capacity for products `NEG_001`-`NEG_016`: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))\n\n## Deleting bids\n\nTo delete a bid, set the bid body as an empty array:\n\n```json\n[\n {\n \"bids\": [],\n \"deliveryDay\": \"2026-04-10\",\n \"product\": \"POS_00_04\"\n }\n]\n```\n\n## Ancillary commitments and wholesale capacity\n\n### Behaviour during full availability\n\nOnce a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted.\n\nYou can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained.\n\nYou can check your ancillary commitments per market through the `operationalData` endpoint on the virtual asset, by requesting the following categories: `fcrCommitment`, `afrrPosCommitment`, `afrrNegCommitment`.\n\nYou can check your available wholesale capacity by requesting the following categories: `wholesalePowerCapacityChargeAvailable`, `wholesalePowerCapacityDischargeAvailable`.\n\nIf you place a FCR bid, the value of the `fcrCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityChargeAvailable` and `wholesalePowerCapacityDischargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\nIf you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the `afrrNegCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityChargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\nIf you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the `afrrPosCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityDischargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\n### Behaviour during unavailability\n\nIf a virtual asset is affected by an unavailability, we may:\n\n1, Reduce a result to a lower `acceptedCapacity` and adjust the ancillary commitments timeseries accordingly.\n\n2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly.\n\nNotably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids.\n\nTo 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`.\n\n## Response format\n\nReturns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields:\n\n`bidID`: The uuid of the individual product bid.\n\n`market`: The market of the submitted product bid. One of: `AFRRCapacity`, `AFRREnergy`, `FCR`.\n\n`status`: \n- The status of the bid, one of: `pending`, `submitted`. \n- `submitted` confirms that the bid has been placed successfully with the TSO. \n- `pending` indicates that the process of placing the bid with the TSO is still in progress. While a bid has status `pending`, it cannot be updated to avoid double bidding. \n","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json post /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/bids","href":"/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"# Post or update ancillary bids for a virtual asset\n\nThe endpoint expects a list of ancillary bids. \n\nThe endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT).\n\n## Request body\n\nThe request body is a list of ancillary product bids you would like to place. \n\nYou can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests.\n\n`product`:\n- aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: `{{direction}}_{{quarterHourInDay}}`, e.g. `POS_001` for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are `POS_096` or `NEG_096`. The final products on the CET to CEST clock change day are `POS_092` or `NEG_092`. The final products on the CEST to CET clock change day are `POS_100` or `NEG_100`.\n- aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: `{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}`, e.g. `POS_00_04` for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24.\n- FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: `{{direction}}_{{startEfaBlock}}_{{endEfaBlock}}`, e.g. `NEGPOS_00_04` for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24.\n\n`deliveryDay`: The delivery day of the bid. It must be in the format `YYYY-MM-DD`, e.g. `2026-05-30` (full day according to RFC3339).\n\n`bids`: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of `maxBidsPerProduct` setting on the virtual asset.\n\nEach bid in the list contains the following fields whose contents can vary depending on the market:\n\n`offeredCapacity`:\n\nThe offered capacity of the bid in **kilowatts**, e.g. `2000`.\n\nThe value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected.\n\n`capacityPrice`:\n\nThe max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\u003c 0), you pay the TSO.\n- aFRR Energy: This field can be removed or left as `null`.\n- aFRR Capacity: The capacity price of the bid in **EUR/MW/h**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order.\n- FCR: The capacity price of the FCR bid in **EUR/MW**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below.\n\n`energyPrice`:\n\nThe max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\u003c 0), you pay the TSO.\n- aFRR Energy: The energy price of the bid in **EUR/MWh**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order.\n- aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in **EUR/MWh**, e.g. `100.00`. \n- FCR: This field can be removed or left as `null`.\n\n## Bidding deadlines\n\n### aFRR Energy\nAll bids must be placed before the following deadline: **30 minutes** before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after **12:00pm CET/CEST** on the day before delivery. If bids are made before that time, they are rejected.\n\n### aFRR Capacity\nAll bids must be placed before the following deadline: **8:40am CET/CEST** on the day before delivery. The auction opens a week before the delivery day.\n\n### FCR\nAll bids must be placed before the following deadline: **7:30 am CET/CEST** on the day before delivery. The auction opens a week before the delivery day.\n\n## Additional context for aFRR bids\n\n### aFRR Capacity bids and implicit aFRR Energy bids\nWhen submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid.\n\nThis 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.\n\nEach of the 16 Energy bids will have the same `offeredCapacity` as the corresponding Capacity bid.\n\nThese 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.\n\n### Individual aFRR Energy bids\n\nYou may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid. \n\nThese must be submitted within the aFRR Energy bidding deadlines.\n\n## Determining available bidding capacity\n\nIndividual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation.\n\n### Combined validation: Validation 1 + 2 in a single step (recommended)\n\nWe recommend a simplified validation process which combines the individual market validation and the cross-market validation.\n\nThe value can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `afrrNegCapacityAvailableMinusFcr`, `afrrPosCapacityAvailableMinusFcr` and `fcrCapacityAvailable` respectively.\n\nThese categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation.\n\nExample:\n- `maxTotalAncillaryCapacityDischargeAvailable`: 5000 kW\n- `maxTotalAncillaryCapacityChargeAvailable`: 5000 kW\n- `fcrCommitment` for `NEGPOS_00_04`: 4000 kW\n- `afrrPosCapacityAvailable`: 3000 kW\n- `afrrNegCapacityAvailable`: 3000 kW\n- `afrrPosCapacityAvailableMinusFcr`: **1000 kW** (minimum(5000 kW - 4000 kW), 3000kW))\n- `afrrNegCapacityAvailableMinusFcr`: **1000 kW** (minimum(5000 kW - 4000 kW), 3000kW))\n- Remaining capacity for product `POS_00_04`: 1000 kW\n- Remaining capacity for products `POS_001`-`POS_016`: 1000 kW\n- Remaining capacity for product `NEG_00_04`: 1000 kW\n- Remaining capacity for products `NEG_001`-`NEG_016`: 1000 kW\n\nAs becomes clear from the example, the `minusFcr` timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the `minusFcr` timeseries ensures your aFRR bids will pass both validations.\n\nThe following formula is used for this calculation:\n\n```bash\nafrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable)\n\nafrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable)\n```\n\n### Two step validation (more complex)\n\n#### Validation 1: Individual market validation\n\nThe `offeredCapacity` for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset.\n\nThe value can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `afrrNegCapacityAvailable`, `afrrPosCapacityAvailable` and `fcrCapacityAvailable` respectively.\n\nExample:\n- `afrrPosCapacityAvailable` from 00:00-04:00 am: 4000 kW\n- `afrrNegCapacityAvailable` from 00:00-04:00 am: 5000 kW\n- Remaining capacity for product `POS_00_04`: 4000 kW\n- Remaining capacity for products `POS_001`-`POS_016`: 4000 kW\n- Remaining capacity for product `NEG_00_04`: 5000 kW\n- Remaining capacity for products `NEG_001`-`NEG_016`: 5000 kW\n\n#### Validation 2: Cross-market validation\n\nThe `offeredCapacity` for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset.\n\nAn aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity.\n\nAn aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity.\n\nAn FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity.\n\nThe max total ancillary capacity can be retrieved from the `operationalData` endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category `maxTotalAncillaryCapacityChargeAvailable` (negative direction) and `maxTotalAncillaryCapacityDischargeAvailable` (positive direction) respectively.\n\nExample:\n- `maxTotalAncillaryCapacityDischargeAvailable`: 5000 kW\n- `maxTotalAncillaryCapacityChargeAvailable`: 4000 kW\n- `fcrCommitment` for `NEGPOS_00_04`: 3000 kW\n- `afrrPosCapacityAvailable`: 3000 kW\n- `afrrNegCapacityAvailable`: 3000 kW\n- Remaining capacity for product `POS_00_04`: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW))\n- Remaining capacity for products `POS_001`-`POS_016`: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW))\n- Remaining capacity for product `NEG_00_04`: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))\n- Remaining capacity for products `NEG_001`-`NEG_016`: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW))\n\n## Deleting bids\n\nTo delete a bid, set the bid body as an empty array:\n\n```json\n[\n {\n \"bids\": [],\n \"deliveryDay\": \"2026-04-10\",\n \"product\": \"POS_00_04\"\n }\n]\n```\n\n## Ancillary commitments and wholesale capacity\n\n### Behaviour during full availability\n\nOnce a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted.\n\nYou can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained.\n\nYou can check your ancillary commitments per market through the `operationalData` endpoint on the virtual asset, by requesting the following categories: `fcrCommitment`, `afrrPosCommitment`, `afrrNegCommitment`.\n\nYou can check your available wholesale capacity by requesting the following categories: `wholesalePowerCapacityChargeAvailable`, `wholesalePowerCapacityDischargeAvailable`.\n\nIf you place a FCR bid, the value of the `fcrCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityChargeAvailable` and `wholesalePowerCapacityDischargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\nIf you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the `afrrNegCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityChargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\nIf you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the `afrrPosCommitment` timeseries increases by the `offeredCapacity` of your bid. At the same time, the value of the `wholesalePowerCapacityDischargeAvailable` operational data timeseries is reduced by `offeredCapacity`.\n\n### Behaviour during unavailability\n\nIf a virtual asset is affected by an unavailability, we may:\n\n1, Reduce a result to a lower `acceptedCapacity` and adjust the ancillary commitments timeseries accordingly.\n\n2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly.\n\nNotably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids.\n\nTo 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`.\n\n## Response format\n\nReturns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields:\n\n`bidID`: The uuid of the individual product bid.\n\n`market`: The market of the submitted product bid. One of: `AFRRCapacity`, `AFRREnergy`, `FCR`.\n\n`status`: \n- The status of the bid, one of: `pending`, `submitted`. \n- `submitted` confirms that the bid has been placed successfully with the TSO. \n- `pending` indicates that the process of placing the bid with the TSO is still in progress. While a bid has status `pending`, it cannot be updated to avoid double bidding. \n","parameters":["f3479c2d-41f3-41d1-807f-d86b43908f78","eaef4800-b4a7-4083-a427-fd24590bb501","45221b9c-4717-421f-bcf0-10e8610bf54d"],"requestBody":"1449f007-8293-4ea4-bc98-44e1ce53124e","responses":{"201":"09cfbbe3-2afb-4bfc-be9d-b14ab2523106","400":"3cbe8de3-7472-49d6-981a-6ef61298d367","401":"86b21b3e-9cc6-433c-8d28-d10617c46c71","425":"897509eb-bd83-44a1-aa0e-7d9ec94a3d80","500":"e27b11a6-6ffa-4715-98d7-de215fac41fd"},"summary":"Post or update ancillary bids for a given virtual asset.","tags":["ancillary"],"method":"post","type":"path","servers":["297f8926-7508-43d5-a35e-6c4952f65031","b1201b0c-e618-4435-972d-30cad67339f3"],"security":[],"path":"/organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/bids","baseUrlOptions":["https://api.trlyr.com","https://api.sandbox.trlyr.com"],"title":"Post or update ancillary bids for a given virtual asset.","codeSamples":[],"requiredOnlyExamples":true,"requestExampleType":"generated","responseExampleType":"generated","prefillPlaygroundWithExample":true,"prefillPlaygroundExamples":[{"body.items.0.deliveryDay":"2025-11-11","body.items.0.product":"POS_00_04","body.items.0.bids.items.0.offeredCapacity":1000,"body.items.0.bids.items.0.capacityPrice":100.5,"body.items.0.bids.items.0.energyPrice":100.5}],"urlDisplay":"full"},"dependencies":{"parameters":{"f3479c2d-41f3-41d1-807f-d86b43908f78":{"description":"Access token","in":"header","name":"Authorization","required":true,"schema":{"default":"Bearer \u003caccess token value>","type":"string","isRequired":true,"description":"Access token","uniqueKey":"","typeLabel":"string"}},"eaef4800-b4a7-4083-a427-fd24590bb501":{"description":"Organisation ID","in":"path","name":"organisationID","required":true,"schema":{"type":"string","isRequired":true,"description":"Organisation ID","uniqueKey":"","typeLabel":"string"}},"45221b9c-4717-421f-bcf0-10e8610bf54d":{"description":"Virtual Asset ID","in":"path","name":"virtualAssetID","required":true,"schema":{"type":"string","isRequired":true,"description":"Virtual Asset ID","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"content":{"application/json":{"schema":{"items":{"properties":{"deliveryDay":{"example":"2025-11-11","type":"string","isRequired":true,"uniqueKey":"items.[INDEX].deliveryDay","typeLabel":"string"},"product":{"example":"POS_00_04","type":"string","isRequired":true,"uniqueKey":"items.[INDEX].product","typeLabel":"string"},"bids":{"items":{"properties":{"offeredCapacity":{"description":"In kW","example":1000,"format":"float","type":"number","isRequired":true,"uniqueKey":"items.[INDEX].bids.items.[INDEX].offeredCapacity","typeLabel":"number\u003cfloat>"},"capacityPrice":{"description":"In EUR/MW/h (AFRR Capacity) or EUR/MW (FCR)","example":100.5,"format":"float","type":"number","uniqueKey":"items.[INDEX].bids.items.[INDEX].capacityPrice","typeLabel":"number\u003cfloat>"},"energyPrice":{"description":"In EUR/MWh (AFRR Capacity and AFRR Energy only)","example":100.5,"format":"float","type":"number","uniqueKey":"items.[INDEX].bids.items.[INDEX].energyPrice","typeLabel":"number\u003cfloat>"}},"required":["offeredCapacity"],"type":"object","uniqueKey":"items.[INDEX].bids.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueItems":false,"uniqueKey":"items.[INDEX].bids","typeLabel":"object[]"}},"required":["deliveryDay","product"],"type":"object","uniqueKey":"items.[INDEX]","typeLabel":"object"},"title":"postAncillaryBids","type":"array","uniqueKey":"","typeLabel":"postAncillaryBids · object[]"},"examples":{"Example":{"title":"Example","value":[{"deliveryDay":"2025-11-11","product":"POS_00_04","bids":[{"offeredCapacity":1000,"capacityPrice":100.5,"energyPrice":100.5}]}]}},"exampleType":"generated"}},"description":"Bids to be posted or updated","required":true,"exampleType":"generated"},"responses":{"09cfbbe3-2afb-4bfc-be9d-b14ab2523106":{"content":{"application/json":{"schema":{"items":{"properties":{"deliveryDay":{"example":"2025-11-11","type":"string","isRequired":true,"uniqueKey":"items.[INDEX].deliveryDay","typeLabel":"string"},"market":{"example":"AFRRCapacity","type":"string","isRequired":true,"uniqueKey":"items.[INDEX].market","typeLabel":"string"},"product":{"example":"POS_00_04","type":"string","isRequired":true,"uniqueKey":"items.[INDEX].product","typeLabel":"string"},"bids":{"items":{"properties":{"bidID":{"example":"11111111-1111-1111-1111-111111111111","format":"uuid","type":"string","isRequired":true,"uniqueKey":"items.[INDEX].bids.items.[INDEX].bidID","typeLabel":"string\u003cuuid>"},"offeredCapacity":{"description":"In kW","example":1000,"format":"float","type":"number","isRequired":true,"uniqueKey":"items.[INDEX].bids.items.[INDEX].offeredCapacity","typeLabel":"number\u003cfloat>"},"status":{"example":"submitted","type":"string","isRequired":true,"uniqueKey":"items.[INDEX].bids.items.[INDEX].status","typeLabel":"string"},"capacityPrice":{"description":"In EUR/MW/h (AFRR Capacity) or EUR/MW (FCR)","example":100.5,"format":"float","type":"number","uniqueKey":"items.[INDEX].bids.items.[INDEX].capacityPrice","typeLabel":"number\u003cfloat>"},"energyPrice":{"description":"In EUR/MWh (AFRR Capacity and AFRR Energy only)","example":100.5,"format":"float","type":"number","uniqueKey":"items.[INDEX].bids.items.[INDEX].energyPrice","typeLabel":"number\u003cfloat>"},"unavailabilities":{"items":{"properties":{"end":{"example":"2025-06-15T10:00:00Z","format":"dateTime","type":"string","uniqueKey":"items.[INDEX].bids.items.[INDEX].unavailabilities.items.[INDEX].end","typeLabel":"string\u003cdateTime>"},"start":{"example":"2025-06-15T10:00:00Z","format":"dateTime","type":"string","uniqueKey":"items.[INDEX].bids.items.[INDEX].unavailabilities.items.[INDEX].start","typeLabel":"string\u003cdateTime>"},"volume":{"type":"number","uniqueKey":"items.[INDEX].bids.items.[INDEX].unavailabilities.items.[INDEX].volume","typeLabel":"number"}},"type":"object","uniqueKey":"items.[INDEX].bids.items.[INDEX].unavailabilities.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueItems":false,"uniqueKey":"items.[INDEX].bids.items.[INDEX].unavailabilities","typeLabel":"object[]"}},"required":["bidID","offeredCapacity","status"],"type":"object","uniqueKey":"items.[INDEX].bids.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueItems":false,"uniqueKey":"items.[INDEX].bids","typeLabel":"object[]"}},"required":["deliveryDay","market","product"],"type":"object","uniqueKey":"items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"","typeLabel":"object[]"},"examples":{"Example":{"title":"Example","value":[{"deliveryDay":"2025-11-11","market":"AFRRCapacity","product":"POS_00_04","bids":[{"bidID":"11111111-1111-1111-1111-111111111111","offeredCapacity":1000,"status":"submitted","capacityPrice":100.5,"energyPrice":100.5,"unavailabilities":[{"end":"2025-06-15T10:00:00Z","start":"2025-06-15T10:00:00Z","volume":123}]}]}]}},"exampleType":"generated"}},"description":"Created","exampleType":"generated"},"3cbe8de3-7472-49d6-981a-6ef61298d367":{"description":"Bad Request","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"86b21b3e-9cc6-433c-8d28-d10617c46c71":{"description":"Unauthorized","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"897509eb-bd83-44a1-aa0e-7d9ec94a3d80":{"description":"Too Early","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"e27b11a6-6ffa-4715-98d7-de215fac41fd":{"description":"Internal Server Error","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{},"servers":{"297f8926-7508-43d5-a35e-6c4952f65031":{"description":"Production API","url":"https://api.trlyr.com"},"b1201b0c-e618-4435-972d-30cad67339f3":{"description":"Sandbox API","url":"https://api.sandbox.trlyr.com"}}},"originalFileLocation":"https://api.sandbox.trlyr.com/docs/doc.json"},"subdomain":"terralayr-90","siteName":"terralayr","title":"Post or update ancillary bids for a given virtual asset. - terralayr","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"originalFileLocation":"virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset.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=\"# Post or update ancillary bids for a virtual asset The endpoint expects a list of ancillary bids. The endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT). ## Request body The request body is a list of ancillary product bids you would like to place. You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests. product: - aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: {{direction}}_{{quarterHourInDay}}, e.g. POS_001 for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are POS_096 or NEG_096. The final products on the CET to CEST clock change day are POS_092 or NEG_092. The final products on the CEST to CET clock change day are POS_100 or NEG_100. - aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. POS_00_04 for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24. - FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. NEGPOS_00_04 for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24. deliveryDay: The delivery day of the bid. It must be in the format YYYY-MM-DD, e.g. 2026-05-30 (full day according to RFC3339). bids: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of maxBidsPerProduct setting on the virtual asset. Each bid in the list contains the following fields whose contents can vary depending on the market: offeredCapacity: The offered capacity of the bid in kilowatts, e.g. 2000. The value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected. capacityPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (\u0026gt; 0), you will be paid by the TSO. If you bid a negative price (\u0026lt; 0), you pay the TSO. - aFRR Energy: This field can be removed or left as null. - aFRR Capacity: The capacity price of the bid in EUR/MW/h, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. - FCR: The capacity price of the FCR bid in EUR/MW, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below. energyPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (\u0026gt; 0), you will be paid by the TSO. If you bid a negative price (\u0026lt; 0), you pay the TSO. - aFRR Energy: The energy price of the bid in EUR/MWh, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. - aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in EUR/MWh, e.g. 100.00. - FCR: This field can be removed or left as null. ## Bidding deadlines ### aFRR Energy All bids must be placed before the following deadline: 30 minutes before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after 12:00pm CET/CEST on the day before delivery. If bids are made before that time, they are rejected. ### aFRR Capacity All bids must be placed before the following deadline: 8:40am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ### FCR All bids must be placed before the following deadline: 7:30 am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ## Additional context for aFRR bids ### aFRR Capacity bids and implicit aFRR Energy bids When submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid. This is done by providing a mandatory energyPrice on each Capacity bid. You do not need to submit the implicit Energy bids yourself, they are automatically created upon submission of an aFRR Capacity bid and returned as part of the response body. Each of the 16 Energy bids will have the same offeredCapacity as the corresponding Capacity bid. These Energy bids can still be updated in their energyPrice and offeredCapacity after the Capacity bid has received a result. However, if the Capacity bid was accepted, the offeredCapacity of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected. ### Individual aFRR Energy bids You may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid. These must be submitted within the aFRR Energy bidding deadlines. ## Determining available bidding capacity Individual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation. ### Combined validation: Validation 1 + 2 in a single step (recommended) We recommend a simplified validation process which combines the individual market validation and the cross-market validation. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailableMinusFcr, afrrPosCapacityAvailableMinusFcr and fcrCapacityAvailable respectively. These categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 5000 kW - fcrCommitment for NEGPOS_00_04: 4000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - afrrPosCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - afrrNegCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - Remaining capacity for product POS_00_04: 1000 kW - Remaining capacity for products POS_001-POS_016: 1000 kW - Remaining capacity for product NEG_00_04: 1000 kW - Remaining capacity for products NEG_001-NEG_016: 1000 kW As becomes clear from the example, the minusFcr timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the minusFcr timeseries ensures your aFRR bids will pass both validations. The following formula is used for this calculation: bash afrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable) afrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable) ### Two step validation (more complex) #### Validation 1: Individual market validation The offeredCapacity for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailable, afrrPosCapacityAvailable and fcrCapacityAvailable respectively. Example: - afrrPosCapacityAvailable from 00:00-04:00 am: 4000 kW - afrrNegCapacityAvailable from 00:00-04:00 am: 5000 kW - Remaining capacity for product POS_00_04: 4000 kW - Remaining capacity for products POS_001-POS_016: 4000 kW - Remaining capacity for product NEG_00_04: 5000 kW - Remaining capacity for products NEG_001-NEG_016: 5000 kW #### Validation 2: Cross-market validation The offeredCapacity for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset. An aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity. An aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity. An FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity. The max total ancillary capacity can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category maxTotalAncillaryCapacityChargeAvailable (negative direction) and maxTotalAncillaryCapacityDischargeAvailable (positive direction) respectively. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 4000 kW - fcrCommitment for NEGPOS_00_04: 3000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - Remaining capacity for product POS_00_04: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for products POS_001-POS_016: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for product NEG_00_04: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) - Remaining capacity for products NEG_001-NEG_016: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) ## Deleting bids To delete a bid, set the bid body as an empty array: json [ { \u0026quot;bids\u0026quot;: [], \u0026quot;deliveryDay\u0026quot;: \u0026quot;2026-04-10\u0026quot;, \u0026quot;product\u0026quot;: \u0026quot;POS_00_04\u0026quot; } ] ## Ancillary commitments and wholesale capacity ### Behaviour during full availability Once a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted. You can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained. You can check your ancillary commitments per market through the operationalData endpoint on the virtual asset, by requesting the following categories: fcrCommitment, afrrPosCommitment, afrrNegCommitment. You can check your available wholesale capacity by requesting the following categories: wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. If you place a FCR bid, the value of the fcrCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the afrrNegCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the afrrPosCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. ### Behaviour during unavailability If a virtual asset is affected by an unavailability, we may: 1, Reduce a result to a lower acceptedCapacity and adjust the ancillary commitments timeseries accordingly. 2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly. Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids. To be informed about the state of your ancillary commitments and the available wholesale capacity, make sure to always monitor the following operational data categories: afrrPosCommitment, afrrNegCommitment, fcrCommitment, wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. ## Response format Returns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields: bidID: The uuid of the individual product bid. market: The market of the submitted product bid. One of: AFRRCapacity, AFRREnergy, FCR. status: - The status of the bid, one of: pending, submitted. - submitted confirms that the bid has been placed successfully with the TSO. - pending indicates that the process of placing the bid with the TSO is still in progress. While a bid has status pending, it cannot be updated to avoid double bidding.\">\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=\"Post or update ancillary bids for a given virtual asset. - terralayr\">\u003cmeta data-mint-head property=\"og:description\" content=\"# Post or update ancillary bids for a virtual asset The endpoint expects a list of ancillary bids. The endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT). ## Request body The request body is a list of ancillary product bids you would like to place. You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests. product: - aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: {{direction}}_{{quarterHourInDay}}, e.g. POS_001 for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are POS_096 or NEG_096. The final products on the CET to CEST clock change day are POS_092 or NEG_092. The final products on the CEST to CET clock change day are POS_100 or NEG_100. - aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. POS_00_04 for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24. - FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. NEGPOS_00_04 for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24. deliveryDay: The delivery day of the bid. It must be in the format YYYY-MM-DD, e.g. 2026-05-30 (full day according to RFC3339). bids: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of maxBidsPerProduct setting on the virtual asset. Each bid in the list contains the following fields whose contents can vary depending on the market: offeredCapacity: The offered capacity of the bid in kilowatts, e.g. 2000. The value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected. capacityPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (\u0026gt; 0), you will be paid by the TSO. If you bid a negative price (\u0026lt; 0), you pay the TSO. - aFRR Energy: This field can be removed or left as null. - aFRR Capacity: The capacity price of the bid in EUR/MW/h, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. - FCR: The capacity price of the FCR bid in EUR/MW, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below. energyPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (\u0026gt; 0), you will be paid by the TSO. If you bid a negative price (\u0026lt; 0), you pay the TSO. - aFRR Energy: The energy price of the bid in EUR/MWh, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. - aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in EUR/MWh, e.g. 100.00. - FCR: This field can be removed or left as null. ## Bidding deadlines ### aFRR Energy All bids must be placed before the following deadline: 30 minutes before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after 12:00pm CET/CEST on the day before delivery. If bids are made before that time, they are rejected. ### aFRR Capacity All bids must be placed before the following deadline: 8:40am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ### FCR All bids must be placed before the following deadline: 7:30 am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ## Additional context for aFRR bids ### aFRR Capacity bids and implicit aFRR Energy bids When submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid. This is done by providing a mandatory energyPrice on each Capacity bid. You do not need to submit the implicit Energy bids yourself, they are automatically created upon submission of an aFRR Capacity bid and returned as part of the response body. Each of the 16 Energy bids will have the same offeredCapacity as the corresponding Capacity bid. These Energy bids can still be updated in their energyPrice and offeredCapacity after the Capacity bid has received a result. However, if the Capacity bid was accepted, the offeredCapacity of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected. ### Individual aFRR Energy bids You may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid. These must be submitted within the aFRR Energy bidding deadlines. ## Determining available bidding capacity Individual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation. ### Combined validation: Validation 1 + 2 in a single step (recommended) We recommend a simplified validation process which combines the individual market validation and the cross-market validation. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailableMinusFcr, afrrPosCapacityAvailableMinusFcr and fcrCapacityAvailable respectively. These categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 5000 kW - fcrCommitment for NEGPOS_00_04: 4000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - afrrPosCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - afrrNegCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - Remaining capacity for product POS_00_04: 1000 kW - Remaining capacity for products POS_001-POS_016: 1000 kW - Remaining capacity for product NEG_00_04: 1000 kW - Remaining capacity for products NEG_001-NEG_016: 1000 kW As becomes clear from the example, the minusFcr timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the minusFcr timeseries ensures your aFRR bids will pass both validations. The following formula is used for this calculation: bash afrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable) afrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable) ### Two step validation (more complex) #### Validation 1: Individual market validation The offeredCapacity for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailable, afrrPosCapacityAvailable and fcrCapacityAvailable respectively. Example: - afrrPosCapacityAvailable from 00:00-04:00 am: 4000 kW - afrrNegCapacityAvailable from 00:00-04:00 am: 5000 kW - Remaining capacity for product POS_00_04: 4000 kW - Remaining capacity for products POS_001-POS_016: 4000 kW - Remaining capacity for product NEG_00_04: 5000 kW - Remaining capacity for products NEG_001-NEG_016: 5000 kW #### Validation 2: Cross-market validation The offeredCapacity for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset. An aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity. An aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity. An FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity. The max total ancillary capacity can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category maxTotalAncillaryCapacityChargeAvailable (negative direction) and maxTotalAncillaryCapacityDischargeAvailable (positive direction) respectively. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 4000 kW - fcrCommitment for NEGPOS_00_04: 3000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - Remaining capacity for product POS_00_04: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for products POS_001-POS_016: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for product NEG_00_04: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) - Remaining capacity for products NEG_001-NEG_016: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) ## Deleting bids To delete a bid, set the bid body as an empty array: json [ { \u0026quot;bids\u0026quot;: [], \u0026quot;deliveryDay\u0026quot;: \u0026quot;2026-04-10\u0026quot;, \u0026quot;product\u0026quot;: \u0026quot;POS_00_04\u0026quot; } ] ## Ancillary commitments and wholesale capacity ### Behaviour during full availability Once a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted. You can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained. You can check your ancillary commitments per market through the operationalData endpoint on the virtual asset, by requesting the following categories: fcrCommitment, afrrPosCommitment, afrrNegCommitment. You can check your available wholesale capacity by requesting the following categories: wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. If you place a FCR bid, the value of the fcrCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the afrrNegCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the afrrPosCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. ### Behaviour during unavailability If a virtual asset is affected by an unavailability, we may: 1, Reduce a result to a lower acceptedCapacity and adjust the ancillary commitments timeseries accordingly. 2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly. Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids. To be informed about the state of your ancillary commitments and the available wholesale capacity, make sure to always monitor the following operational data categories: afrrPosCommitment, afrrNegCommitment, fcrCommitment, wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. ## Response format Returns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields: bidID: The uuid of the individual product bid. market: The market of the submitted product bid. One of: AFRRCapacity, AFRREnergy, FCR. status: - The status of the bid, one of: pending, submitted. - submitted confirms that the bid has been placed successfully with the TSO. - pending indicates that the process of placing the bid with the TSO is still in progress. While a bid has status pending, it cannot be updated to avoid double bidding.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"terralayr\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset\">\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=ancillary\u0026amp;title=Post+or+update+ancillary+bids+for+a+given+virtual+asset.\u0026amp;description=%23+Post+or+update+ancillary+bids+for+a+virtual+asset%0A%0AThe+endpoint+expects+a+list+of+ancillary+bids.+%0A%0AThe+endpoint+combines+POST+and+PUT+functionality%3A+If+no+bi\u0026amp;theme=6829ac6d8fb6a04cc851f81c\u0026amp;signature=8b39c21835c8b98890524d4f5a72470df1b0abc9d6bfc26ef08f195d2fde7338\">\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=\"Post or update ancillary bids for a given virtual asset. - terralayr\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"# Post or update ancillary bids for a virtual asset The endpoint expects a list of ancillary bids. The endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT). ## Request body The request body is a list of ancillary product bids you would like to place. You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests. product: - aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: {{direction}}_{{quarterHourInDay}}, e.g. POS_001 for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are POS_096 or NEG_096. The final products on the CET to CEST clock change day are POS_092 or NEG_092. The final products on the CEST to CET clock change day are POS_100 or NEG_100. - aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. POS_00_04 for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24. - FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. NEGPOS_00_04 for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24. deliveryDay: The delivery day of the bid. It must be in the format YYYY-MM-DD, e.g. 2026-05-30 (full day according to RFC3339). bids: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of maxBidsPerProduct setting on the virtual asset. Each bid in the list contains the following fields whose contents can vary depending on the market: offeredCapacity: The offered capacity of the bid in kilowatts, e.g. 2000. The value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected. capacityPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (\u0026gt; 0), you will be paid by the TSO. If you bid a negative price (\u0026lt; 0), you pay the TSO. - aFRR Energy: This field can be removed or left as null. - aFRR Capacity: The capacity price of the bid in EUR/MW/h, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. - FCR: The capacity price of the FCR bid in EUR/MW, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below. energyPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (\u0026gt; 0), you will be paid by the TSO. If you bid a negative price (\u0026lt; 0), you pay the TSO. - aFRR Energy: The energy price of the bid in EUR/MWh, e.g. 100.00. This price is used to determine the position of the bid in the TSO\u0026#x27;s merit order. - aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in EUR/MWh, e.g. 100.00. - FCR: This field can be removed or left as null. ## Bidding deadlines ### aFRR Energy All bids must be placed before the following deadline: 30 minutes before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after 12:00pm CET/CEST on the day before delivery. If bids are made before that time, they are rejected. ### aFRR Capacity All bids must be placed before the following deadline: 8:40am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ### FCR All bids must be placed before the following deadline: 7:30 am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ## Additional context for aFRR bids ### aFRR Capacity bids and implicit aFRR Energy bids When submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid. This is done by providing a mandatory energyPrice on each Capacity bid. You do not need to submit the implicit Energy bids yourself, they are automatically created upon submission of an aFRR Capacity bid and returned as part of the response body. Each of the 16 Energy bids will have the same offeredCapacity as the corresponding Capacity bid. These Energy bids can still be updated in their energyPrice and offeredCapacity after the Capacity bid has received a result. However, if the Capacity bid was accepted, the offeredCapacity of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected. ### Individual aFRR Energy bids You may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid. These must be submitted within the aFRR Energy bidding deadlines. ## Determining available bidding capacity Individual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation. ### Combined validation: Validation 1 + 2 in a single step (recommended) We recommend a simplified validation process which combines the individual market validation and the cross-market validation. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailableMinusFcr, afrrPosCapacityAvailableMinusFcr and fcrCapacityAvailable respectively. These categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 5000 kW - fcrCommitment for NEGPOS_00_04: 4000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - afrrPosCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - afrrNegCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - Remaining capacity for product POS_00_04: 1000 kW - Remaining capacity for products POS_001-POS_016: 1000 kW - Remaining capacity for product NEG_00_04: 1000 kW - Remaining capacity for products NEG_001-NEG_016: 1000 kW As becomes clear from the example, the minusFcr timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the minusFcr timeseries ensures your aFRR bids will pass both validations. The following formula is used for this calculation: bash afrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable) afrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable) ### Two step validation (more complex) #### Validation 1: Individual market validation The offeredCapacity for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailable, afrrPosCapacityAvailable and fcrCapacityAvailable respectively. Example: - afrrPosCapacityAvailable from 00:00-04:00 am: 4000 kW - afrrNegCapacityAvailable from 00:00-04:00 am: 5000 kW - Remaining capacity for product POS_00_04: 4000 kW - Remaining capacity for products POS_001-POS_016: 4000 kW - Remaining capacity for product NEG_00_04: 5000 kW - Remaining capacity for products NEG_001-NEG_016: 5000 kW #### Validation 2: Cross-market validation The offeredCapacity for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset. An aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity. An aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity. An FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity. The max total ancillary capacity can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category maxTotalAncillaryCapacityChargeAvailable (negative direction) and maxTotalAncillaryCapacityDischargeAvailable (positive direction) respectively. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 4000 kW - fcrCommitment for NEGPOS_00_04: 3000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - Remaining capacity for product POS_00_04: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for products POS_001-POS_016: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for product NEG_00_04: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) - Remaining capacity for products NEG_001-NEG_016: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) ## Deleting bids To delete a bid, set the bid body as an empty array: json [ { \u0026quot;bids\u0026quot;: [], \u0026quot;deliveryDay\u0026quot;: \u0026quot;2026-04-10\u0026quot;, \u0026quot;product\u0026quot;: \u0026quot;POS_00_04\u0026quot; } ] ## Ancillary commitments and wholesale capacity ### Behaviour during full availability Once a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted. You can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained. You can check your ancillary commitments per market through the operationalData endpoint on the virtual asset, by requesting the following categories: fcrCommitment, afrrPosCommitment, afrrNegCommitment. You can check your available wholesale capacity by requesting the following categories: wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. If you place a FCR bid, the value of the fcrCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the afrrNegCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the afrrPosCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. ### Behaviour during unavailability If a virtual asset is affected by an unavailability, we may: 1, Reduce a result to a lower acceptedCapacity and adjust the ancillary commitments timeseries accordingly. 2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly. Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids. To be informed about the state of your ancillary commitments and the available wholesale capacity, make sure to always monitor the following operational data categories: afrrPosCommitment, afrrNegCommitment, fcrCommitment, wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. ## Response format Returns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields: bidID: The uuid of the individual product bid. market: The market of the submitted product bid. One of: AFRRCapacity, AFRREnergy, FCR. status: - The status of the bid, one of: pending, submitted. - submitted confirms that the bid has been placed successfully with the TSO. - pending indicates that the process of placing the bid with the TSO is still in progress. While a bid has status pending, it cannot be updated to avoid double bidding.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://terralayr-90.mintlify.app/_mintlify/api/og/v2?division=ancillary\u0026amp;title=Post+or+update+ancillary+bids+for+a+given+virtual+asset.\u0026amp;description=%23+Post+or+update+ancillary+bids+for+a+virtual+asset%0A%0AThe+endpoint+expects+a+list+of+ancillary+bids.+%0A%0AThe+endpoint+combines+POST+and+PUT+functionality%3A+If+no+bi\u0026amp;theme=6829ac6d8fb6a04cc851f81c\u0026amp;signature=8b39c21835c8b98890524d4f5a72470df1b0abc9d6bfc26ef08f195d2fde7338\">\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/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset.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/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset#webpage\",\"url\":\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset\",\"name\":\"Post or update ancillary bids for a given virtual asset.\",\"description\":\"# Post or update ancillary bids for a virtual asset The endpoint expects a list of ancillary bids. The endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT). ## Request body The request body is a list of ancillary product bids you would like to place. You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests. product: - aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: {{direction}}_{{quarterHourInDay}}, e.g. POS_001 for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are POS_096 or NEG_096. The final products on the CET to CEST clock change day are POS_092 or NEG_092. The final products on the CEST to CET clock change day are POS_100 or NEG_100. - aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. POS_00_04 for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24. - FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. NEGPOS_00_04 for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24. deliveryDay: The delivery day of the bid. It must be in the format YYYY-MM-DD, e.g. 2026-05-30 (full day according to RFC3339). bids: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of maxBidsPerProduct setting on the virtual asset. Each bid in the list contains the following fields whose contents can vary depending on the market: offeredCapacity: The offered capacity of the bid in kilowatts, e.g. 2000. The value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected. capacityPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\\u003c 0), you pay the TSO. - aFRR Energy: This field can be removed or left as null. - aFRR Capacity: The capacity price of the bid in EUR/MW/h, e.g. 100.00. This price is used to determine the position of the bid in the TSO's merit order. - FCR: The capacity price of the FCR bid in EUR/MW, e.g. 100.00. This price is used to determine the position of the bid in the TSO's merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below. energyPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\\u003c 0), you pay the TSO. - aFRR Energy: The energy price of the bid in EUR/MWh, e.g. 100.00. This price is used to determine the position of the bid in the TSO's merit order. - aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in EUR/MWh, e.g. 100.00. - FCR: This field can be removed or left as null. ## Bidding deadlines ### aFRR Energy All bids must be placed before the following deadline: 30 minutes before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after 12:00pm CET/CEST on the day before delivery. If bids are made before that time, they are rejected. ### aFRR Capacity All bids must be placed before the following deadline: 8:40am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ### FCR All bids must be placed before the following deadline: 7:30 am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ## Additional context for aFRR bids ### aFRR Capacity bids and implicit aFRR Energy bids When submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid. This is done by providing a mandatory energyPrice on each Capacity bid. You do not need to submit the implicit Energy bids yourself, they are automatically created upon submission of an aFRR Capacity bid and returned as part of the response body. Each of the 16 Energy bids will have the same offeredCapacity as the corresponding Capacity bid. These Energy bids can still be updated in their energyPrice and offeredCapacity after the Capacity bid has received a result. However, if the Capacity bid was accepted, the offeredCapacity of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected. ### Individual aFRR Energy bids You may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid. These must be submitted within the aFRR Energy bidding deadlines. ## Determining available bidding capacity Individual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation. ### Combined validation: Validation 1 + 2 in a single step (recommended) We recommend a simplified validation process which combines the individual market validation and the cross-market validation. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailableMinusFcr, afrrPosCapacityAvailableMinusFcr and fcrCapacityAvailable respectively. These categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 5000 kW - fcrCommitment for NEGPOS_00_04: 4000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - afrrPosCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - afrrNegCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - Remaining capacity for product POS_00_04: 1000 kW - Remaining capacity for products POS_001-POS_016: 1000 kW - Remaining capacity for product NEG_00_04: 1000 kW - Remaining capacity for products NEG_001-NEG_016: 1000 kW As becomes clear from the example, the minusFcr timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the minusFcr timeseries ensures your aFRR bids will pass both validations. The following formula is used for this calculation: bash afrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable) afrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable) ### Two step validation (more complex) #### Validation 1: Individual market validation The offeredCapacity for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailable, afrrPosCapacityAvailable and fcrCapacityAvailable respectively. Example: - afrrPosCapacityAvailable from 00:00-04:00 am: 4000 kW - afrrNegCapacityAvailable from 00:00-04:00 am: 5000 kW - Remaining capacity for product POS_00_04: 4000 kW - Remaining capacity for products POS_001-POS_016: 4000 kW - Remaining capacity for product NEG_00_04: 5000 kW - Remaining capacity for products NEG_001-NEG_016: 5000 kW #### Validation 2: Cross-market validation The offeredCapacity for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset. An aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity. An aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity. An FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity. The max total ancillary capacity can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category maxTotalAncillaryCapacityChargeAvailable (negative direction) and maxTotalAncillaryCapacityDischargeAvailable (positive direction) respectively. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 4000 kW - fcrCommitment for NEGPOS_00_04: 3000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - Remaining capacity for product POS_00_04: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for products POS_001-POS_016: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for product NEG_00_04: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) - Remaining capacity for products NEG_001-NEG_016: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) ## Deleting bids To delete a bid, set the bid body as an empty array: json [ { \\\"bids\\\": [], \\\"deliveryDay\\\": \\\"2026-04-10\\\", \\\"product\\\": \\\"POS_00_04\\\" } ] ## Ancillary commitments and wholesale capacity ### Behaviour during full availability Once a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted. You can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained. You can check your ancillary commitments per market through the operationalData endpoint on the virtual asset, by requesting the following categories: fcrCommitment, afrrPosCommitment, afrrNegCommitment. You can check your available wholesale capacity by requesting the following categories: wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. If you place a FCR bid, the value of the fcrCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the afrrNegCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the afrrPosCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. ### Behaviour during unavailability If a virtual asset is affected by an unavailability, we may: 1, Reduce a result to a lower acceptedCapacity and adjust the ancillary commitments timeseries accordingly. 2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly. Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids. To be informed about the state of your ancillary commitments and the available wholesale capacity, make sure to always monitor the following operational data categories: afrrPosCommitment, afrrNegCommitment, fcrCommitment, wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. ## Response format Returns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields: bidID: The uuid of the individual product bid. market: The market of the submitted product bid. One of: AFRRCapacity, AFRREnergy, FCR. status: - The status of the bid, one of: pending, submitted. - submitted confirms that the bid has been placed successfully with the TSO. - pending indicates that the process of placing the bid with the TSO is still in progress. While a bid has status pending, it cannot be updated to avoid double bidding.\",\"isPartOf\":{\"@id\":\"https://docs.trlyr.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Virtual Assets API\",\"item\":\"https://docs.trlyr.com/virtual-assets-api-reference/virtual-assets/get-all-the-virtual-assets-belonging-to-an-organisation\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ancillary\",\"item\":\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/get-all-ancillary-bids-for-a-given-virtual-asset-and-interval\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Post or update ancillary bids for a given virtual asset.\",\"item\":\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset#apireference\",\"headline\":\"Post or update ancillary bids for a given virtual asset.\",\"name\":\"Post or update ancillary bids for a given virtual asset.\",\"description\":\"# Post or update ancillary bids for a virtual asset The endpoint expects a list of ancillary bids. The endpoint combines POST and PUT functionality: If no bids have been submitted for the product, new bids are created (POST). If one (or more) bids have already been submitted for the product, they will be replaced by the newer submission (PUT). ## Request body The request body is a list of ancillary product bids you would like to place. You can place bids for all markets through this endpoint, however, FCR and aFRR bids must be submitted in separate requests. product: - aFRR Energy: The 15-minute based aFRR Energy product for which the bids are placed. It must be in the following format: {{direction}}_{{quarterHourInDay}}, e.g. POS_001 for a bid in the positive aFRR Energy market on the first quarter hour of the day (00:00-00:15 am). The final products on most days are POS_096 or NEG_096. The final products on the CET to CEST clock change day are POS_092 or NEG_092. The final products on the CEST to CET clock change day are POS_100 or NEG_100. - aFRR Capacity: The EFA-block based aFRR Capacity product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. POS_00_04 for a bid in the positive aFRR Capacity market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is POS/NEG_20_24. - FCR: The EFA-block based FCR product for which the bids are placed. It must be in the following format: {{direction}}{{startEfaBlock}}{{endEfaBlock}}, e.g. NEGPOS_00_04 for a bid in the FCR market for the first EFA block of the day (00:00-04:00 am). The sixth and final EFA block is NEGPOS_20_24. deliveryDay: The delivery day of the bid. It must be in the format YYYY-MM-DD, e.g. 2026-05-30 (full day according to RFC3339). bids: A list of individual bids for the product. You can submit multiple bids per product, depending on the value of maxBidsPerProduct setting on the virtual asset. Each bid in the list contains the following fields whose contents can vary depending on the market: offeredCapacity: The offered capacity of the bid in kilowatts, e.g. 2000. The value must be an integer multiple of 1 megawatt. Any non-integral part will be rounded down, e.g. 1000.5 is accepted and rounded down to 1000kW, whereas 1500 would be rejected. capacityPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\\u003c 0), you pay the TSO. - aFRR Energy: This field can be removed or left as null. - aFRR Capacity: The capacity price of the bid in EUR/MW/h, e.g. 100.00. This price is used to determine the position of the bid in the TSO's merit order. - FCR: The capacity price of the FCR bid in EUR/MW, e.g. 100.00. This price is used to determine the position of the bid in the TSO's merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below. energyPrice: The max price that can be bid into both markets is 15,000 Euros, the min price is -15,000 Euros. If you bid a positive price (> 0), you will be paid by the TSO. If you bid a negative price (\\u003c 0), you pay the TSO. - aFRR Energy: The energy price of the bid in EUR/MWh, e.g. 100.00. This price is used to determine the position of the bid in the TSO's merit order. - aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in EUR/MWh, e.g. 100.00. - FCR: This field can be removed or left as null. ## Bidding deadlines ### aFRR Energy All bids must be placed before the following deadline: 30 minutes before the delivery period, e.g. a bid for delivery period 15:30pm must be submitted by 15:00pm. Moreover, bids must be placed after 12:00pm CET/CEST on the day before delivery. If bids are made before that time, they are rejected. ### aFRR Capacity All bids must be placed before the following deadline: 8:40am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ### FCR All bids must be placed before the following deadline: 7:30 am CET/CEST on the day before delivery. The auction opens a week before the delivery day. ## Additional context for aFRR bids ### aFRR Capacity bids and implicit aFRR Energy bids When submitting a bid into the aFRR Capacity market, it is mandatory to place 16 implicit aFRR Energy bids covering the 4-hour duration of the Capacity bid. This is done by providing a mandatory energyPrice on each Capacity bid. You do not need to submit the implicit Energy bids yourself, they are automatically created upon submission of an aFRR Capacity bid and returned as part of the response body. Each of the 16 Energy bids will have the same offeredCapacity as the corresponding Capacity bid. These Energy bids can still be updated in their energyPrice and offeredCapacity after the Capacity bid has received a result. However, if the Capacity bid was accepted, the offeredCapacity of the Energy bids cannot be reduced, only increased. If the Capacity bid is rejected, the implicit Energy bids are also rejected. ### Individual aFRR Energy bids You may also place aFRR Energy bids individually, i.e. without first submitting an aFRR Capacity bid. These must be submitted within the aFRR Energy bidding deadlines. ## Determining available bidding capacity Individual market validation (validation 1) and the cross-market validation (validation 2) must be passed, or the bid will be rejected. We strongly recommend using the combined validation to simplify your implementation. ### Combined validation: Validation 1 + 2 in a single step (recommended) We recommend a simplified validation process which combines the individual market validation and the cross-market validation. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailableMinusFcr, afrrPosCapacityAvailableMinusFcr and fcrCapacityAvailable respectively. These categories take the available individual market capacity as a basis and reduce it where necessary to account for other bid commitments and the maxTotalCapacity validation. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 5000 kW - fcrCommitment for NEGPOS_00_04: 4000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - afrrPosCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - afrrNegCapacityAvailableMinusFcr: 1000 kW (minimum(5000 kW - 4000 kW), 3000kW)) - Remaining capacity for product POS_00_04: 1000 kW - Remaining capacity for products POS_001-POS_016: 1000 kW - Remaining capacity for product NEG_00_04: 1000 kW - Remaining capacity for products NEG_001-NEG_016: 1000 kW As becomes clear from the example, the minusFcr timeseries already perform the necessary calculation to account for existing bids in other markets. Querying for max total capacity or FCR commitments is no longer necessary. Using the minusFcr timeseries ensures your aFRR bids will pass both validations. The following formula is used for this calculation: bash afrrPosCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityDischargeAvailable - fcrCommitment), afrrPosCapacityAvailable) afrrNegCapacityAvailableMinusFcr = minimum((maxTotalAncillaryCapacityChargeAvailable - fcrCommitment), afrrNegCapacityAvailable) ### Two step validation (more complex) #### Validation 1: Individual market validation The offeredCapacity for aFRR or FCR bids at any given point in time must be lower than or equal to the available positive or negative capacity for aFRR or FCR of the virtual asset. The value can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category afrrNegCapacityAvailable, afrrPosCapacityAvailable and fcrCapacityAvailable respectively. Example: - afrrPosCapacityAvailable from 00:00-04:00 am: 4000 kW - afrrNegCapacityAvailable from 00:00-04:00 am: 5000 kW - Remaining capacity for product POS_00_04: 4000 kW - Remaining capacity for products POS_001-POS_016: 4000 kW - Remaining capacity for product NEG_00_04: 5000 kW - Remaining capacity for products NEG_001-NEG_016: 5000 kW #### Validation 2: Cross-market validation The offeredCapacity for aFRR or FCR bids at any given point in time must also take into account bids that have already been placed in the aFRR or FCR market for the same period so as not to exceed the max total ancillary capacity of the virtual asset. An aFRRNegCapacity or aFRRNegEnergy bid has a negative product direction and therefore only reduces the available max total charge capacity. An aFRRPosCapacity or aFRRPosEnergy bid has a positive product direction and therefore only reduces the available max total discharge capacity. An FCR bid has both a positive and negative product direction and therefore reduces the available max total charge and discharge capacity. The max total ancillary capacity can be retrieved from the operationalData endpoint on the virtual asset as a 15 minute timeseries by requesting the operational data category maxTotalAncillaryCapacityChargeAvailable (negative direction) and maxTotalAncillaryCapacityDischargeAvailable (positive direction) respectively. Example: - maxTotalAncillaryCapacityDischargeAvailable: 5000 kW - maxTotalAncillaryCapacityChargeAvailable: 4000 kW - fcrCommitment for NEGPOS_00_04: 3000 kW - afrrPosCapacityAvailable: 3000 kW - afrrNegCapacityAvailable: 3000 kW - Remaining capacity for product POS_00_04: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for products POS_001-POS_016: 2000 kW (minimum(5000 kW - 3000 kW), 3000kW)) - Remaining capacity for product NEG_00_04: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) - Remaining capacity for products NEG_001-NEG_016: 1000 kW (minimum(4000 kW - 3000 kW), 3000kW)) ## Deleting bids To delete a bid, set the bid body as an empty array: json [ { \\\"bids\\\": [], \\\"deliveryDay\\\": \\\"2026-04-10\\\", \\\"product\\\": \\\"POS_00_04\\\" } ] ## Ancillary commitments and wholesale capacity ### Behaviour during full availability Once a valid bid has been submitted, both the ancillary commitment and the available wholesale capacity on the virtual asset is adjusted. You can imagine the available wholesale capacity as a pool from which the ancillary commitments are drained. You can check your ancillary commitments per market through the operationalData endpoint on the virtual asset, by requesting the following categories: fcrCommitment, afrrPosCommitment, afrrNegCommitment. You can check your available wholesale capacity by requesting the following categories: wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. If you place a FCR bid, the value of the fcrCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable and wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRNegCapacity or aFRRNegEnergy bid, the value of the afrrNegCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityChargeAvailable operational data timeseries is reduced by offeredCapacity. If you place a aFRRPosCapacity or aFRRPosEnergy bid, the value of the afrrPosCommitment timeseries increases by the offeredCapacity of your bid. At the same time, the value of the wholesalePowerCapacityDischargeAvailable operational data timeseries is reduced by offeredCapacity. ### Behaviour during unavailability If a virtual asset is affected by an unavailability, we may: 1, Reduce a result to a lower acceptedCapacity and adjust the ancillary commitments timeseries accordingly. 2, Reject a result that was previously accepted and adjust the ancillary commitments timeseries accordingly. Notably, reducing or rejecting ancillary bids is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids. To be informed about the state of your ancillary commitments and the available wholesale capacity, make sure to always monitor the following operational data categories: afrrPosCommitment, afrrNegCommitment, fcrCommitment, wholesalePowerCapacityChargeAvailable, wholesalePowerCapacityDischargeAvailable. ## Response format Returns a JSON representation of the created ancillary product bids identical to the request body, except for two additional fields: bidID: The uuid of the individual product bid. market: The market of the submitted product bid. One of: AFRRCapacity, AFRREnergy, FCR. status: - The status of the bid, one of: pending, submitted. - submitted confirms that the bid has been placed successfully with the TSO. - pending indicates that the process of placing the bid with the TSO is still in progress. While a bid has status pending, it cannot be updated to avoid double bidding.\",\"url\":\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset\",\"mainEntityOfPage\":{\"@id\":\"https://docs.trlyr.com/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset#webpage\"},\"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","pages":[{"title":"Layr User Guide","href":"/layrUserGuide/introduction"}]},{"tab":"API Reference","groups":[{"group":"API documentation","pages":[{"title":"terralayr API","href":"/trlyr-API/introduction"}]},{"group":"Auth API","pages":[{"group":"auth","pages":[{"title":"Health check","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/auth/docs/doc.json get /auth/healthcheck","href":"/auth-api-reference/auth/health-check"},{"title":"Authenticate with username and password","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/auth/docs/doc.json post /auth/public/authenticate","href":"/auth-api-reference/auth/authenticate-with-username-and-password"}]}]},{"group":"Virtual Assets API","pages":[{"group":"virtual-assets","pages":[{"title":"Get all the virtual assets belonging to an organisation.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets","href":"/virtual-assets-api-reference/virtual-assets/get-all-the-virtual-assets-belonging-to-an-organisation"},{"title":"Get a virtual asset.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}","href":"/virtual-assets-api-reference/virtual-assets/get-a-virtual-asset"},{"title":"Gets schedule adjustments for a virtual asset within a time range.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/adjustments","href":"/virtual-assets-api-reference/virtual-assets/gets-schedule-adjustments-for-a-virtual-asset-within-a-time-range"},{"title":"Get the usable energy-capacity of a virtual-asset as a timeseries.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/energy-capacity","href":"/virtual-assets-api-reference/virtual-assets/get-the-usable-energy-capacity-of-a-virtual-asset-as-a-timeseries"},{"title":"Get the most recent usable energy-capacity of a virtual-asset.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/energy-capacity/latest","href":"/virtual-assets-api-reference/virtual-assets/get-the-most-recent-usable-energy-capacity-of-a-virtual-asset"},{"title":"List audit events for a virtual asset","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/events","href":"/virtual-assets-api-reference/virtual-assets/list-audit-events-for-a-virtual-asset"},{"title":"Gets a selection of operational data of a virtual-asset as a timeseries.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/operational","href":"/virtual-assets-api-reference/virtual-assets/gets-a-selection-of-operational-data-of-a-virtual-asset-as-a-timeseries"},{"title":"Gets the most recent operational data values for a virtual-asset.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/operational/latest","href":"/virtual-assets-api-reference/virtual-assets/gets-the-most-recent-operational-data-values-for-a-virtual-asset"},{"title":"Get the projected state of charge of a virtual asset.","deprecated":true,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/state-of-charge","href":"/virtual-assets-api-reference/virtual-assets/get-the-projected-state-of-charge-of-a-virtual-asset"},{"title":"Get the latest state of charge of a virtual asset.","deprecated":true,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/state-of-charge/latest","href":"/virtual-assets-api-reference/virtual-assets/get-the-latest-state-of-charge-of-a-virtual-asset"},{"title":"Get the projected state of charge of a virtual asset.","deprecated":true,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/state-of-charge/projected","href":"/virtual-assets-api-reference/virtual-assets/get-the-projected-state-of-charge-of-a-virtual-asset-1"},{"title":"Get the latest state of energy of a virtual asset.","deprecated":true,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/state-of-energy/latest","href":"/virtual-assets-api-reference/virtual-assets/get-the-latest-state-of-energy-of-a-virtual-asset"},{"title":"Get the projected state of energy of a virtual asset.","deprecated":true,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/state-of-energy/projected","href":"/virtual-assets-api-reference/virtual-assets/get-the-projected-state-of-energy-of-a-virtual-asset"}]},{"group":"afrr","pages":[{"title":"Get all aFRR bids for a given virtual asset and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/afrr/bids","href":"/virtual-assets-api-reference/afrr/get-all-afrr-bids-for-a-given-virtual-asset-and-delivery-day"},{"title":"Creates aFRR bids for a given virtual asset.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json post /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/afrr/bids","href":"/virtual-assets-api-reference/afrr/creates-afrr-bids-for-a-given-virtual-asset"},{"title":"Get aFRR bids for a given virtual asset, product and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/afrr/bids/{productDateCode}","href":"/virtual-assets-api-reference/afrr/get-afrr-bids-for-a-given-virtual-asset-product-and-delivery-day"},{"title":"Update aFRR bids for a single product and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json put /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/afrr/bids/{productDateCode}","href":"/virtual-assets-api-reference/afrr/update-afrr-bids-for-a-single-product-and-delivery-day"},{"title":"Get all aFRR results for a given virtual asset and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/afrr/results","href":"/virtual-assets-api-reference/afrr/get-all-afrr-results-for-a-given-virtual-asset-and-delivery-day"},{"title":"Gets aFRR results for a given virtual asset, product and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/afrr/results/{productDateCode}","href":"/virtual-assets-api-reference/afrr/gets-afrr-results-for-a-given-virtual-asset-product-and-delivery-day"}]},{"group":"ancillary","pages":[{"title":"Get all ancillary bids for a given virtual asset and interval.","description":"# Gets all ancillary bids for a given virtual asset and time interval\n\n## Query Parameters\n\nRequired query parameters:\n\n`start`: Start specifies the start of the time interval for which to retrieve bids, e.g. `2025-06-17T12:00:00Z` (RFC3339 in UTC).\n\n`end`: End specifies the end of the time interval for which to retrieve bids, e.g. `2025-06-18T12:00:00Z` (RFC3339 in UTC).\n\nOptional query parameters:\n\n`markets`: Returns bids for requested markets as a comma separated string, e.g. `FCR,AFRREnergy`. If not set, returns all markets. Available options (case sensitive): `FCR`, `AFRREnergy`, `AFRRCapacity`.\n\n`productDirections`: Returns bids for requested product directions as a comma separated string, e.g. `NEGPOS,POS`. If not set, returns all product directions. Available options (case sensitive): `POS`, `NEG`, `NEGPOS`.\n\n## Response format\n\nReturns a JSON representation of the ancillary bids for the given time interval and virtual asset as a list. The following fields are provided:\n\n`market`: The market of the bid, one of: `FCR`, `AFRREnergy`, `AFRRCapacity`.\n\n`product`: The product of the bid, e.g. `NEGPOS_00_04` (FCR), `POS_00_04` (AFRR Capacity), `POS_001` (AFRR Energy).\n\n`deliveryDay`: The delivery day of the bid in the format `YYYY-MM-DD`, e.g. `2026-05-30` (full day according to RFC3339).\n\n`bids`: A list of individual bids for the product.\n\nEach bid in the list contains the following fields whose contents can vary depending on the market:\n\n`bidID`: The ID of the bid.\n\n`offeredCapacity`: The offered capacity of the bid in **kilowatts**, e.g. `2000`.\n\n`capacityPrice`:\n- AFRR Energy: This field is null.\n- AFRR Capacity: The capacity price of the bid in **EUR/MW/h**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order.\n- FCR: The capacity price of the bid in **EUR/MW**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order. \n\n`energyPrice`:\n- AFRR Energy: The energy price of the bid in **EUR/MWh**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order.\n- AFRR Capacity: The energy price of the 16 implicit AFRR Energy bids in **EUR/MWh**, e.g. `100.00`. When submitting a bid into the AFRR Capacity market, it is mandatory to place 16 implicit AFRR Energy bids covering the 4 hour duration of the Capacity bid. This is done by providing an `energyPrice` on each Capacity bid. Each of the 16 Energy bids will have the same `offeredCapacity` as the corresponding Capacity bid. These Energy bids can still be updated after the Capacity bid has received a result. However, if the Capacity bid was accepted, the `offeredCapacity` of the Energy bids cannot be reduced. If the Capacity bid is rejected, the implicit Energy bids are also rejected.\n- FCR: This field is null.\n\n`status`: The status of the bid, one of: `pending`, `submitted`. `submitted` confirms that the bid has been placed successfully with the TSO. `pending` indicates that the process of placing the bid with the TSO is still in progress. While a bid has status `pending`, it cannot be updated to avoid double bidding. \n\n`unavailabilities`: During a period of unavailability, a bid may need to be reduced in its power capacity to still be deliverable by the virtual asset. The unavailability can cover the whole delivery period of a bid, or only a section of it. Moreover, capacity products may be affected by more than one unavailability event with different unavailable volumes. The following fields are provided for each bid unavailability:\n- `start`: The start of the unavailability period.\n- `end`: The end of the unavailability period.\n- `volume`: The unavailable power volume in kW. The remaining power of the bid can be calculated the following way: `offeredCapacity` - `volume`. Notably, if a bid has already received a result, the unavailable volume must be deducted from the `acceptedCapacity` of the result instead. The unavailable volume will then be backed up by terralayr via our pool provider.\n\n## Behaviour during unavailability\n\nIf a virtual asset is affected by an unavailability, we will:\n\n1, Add unavailabilities to both the bid and the result which are then returned with every GET request. See above for the details.\n\n2, Adjust the ancillary commitments timeseries so it matches the reduced bid power capacities.\n\nNotably, reducing ancillary power capacities is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids.\n\nTo 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`.\n","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/bids","href":"/virtual-assets-api-reference/ancillary/get-all-ancillary-bids-for-a-given-virtual-asset-and-interval"},{"title":"Post or update ancillary bids for a given virtual asset.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json post /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/bids","href":"/virtual-assets-api-reference/ancillary/post-or-update-ancillary-bids-for-a-given-virtual-asset"},{"title":"Get all ancillary results for a given virtual asset and interval.","description":"# Gets all ancillary results for a given virtual asset and time interval\n\n## Query Parameters\n\nRequired query parameters:\n\n`start`: Start specifies the start of the time interval for which to retrieve results, e.g. `2025-06-17T12:00:00Z` (RFC3339 in UTC).\n\n`end`: End specifies the end of the time interval for which to retrieve results, e.g. `2025-06-18T12:00:00Z` (RFC3339 in UTC).\n\nOptional query parameters:\n\n`markets`: Returns results for requested markets as a comma separated string, e.g. `FCR,AFRREnergy`. If not set, returns all markets. Available options (case sensitive): `FCR`, `AFRREnergy`, `AFRRCapacity`.\n\n`productDirections`: Returns results for requested product directions as a comma separated string, e.g. `NEGPOS,POS`. If not set, returns all product directions. Available options (case sensitive): `POS`, `NEG`, `NEGPOS`.\n\n## Response format\nReturns a JSON representation of the ancillary results for the given time interval and virtual asset as a list. The following fields are provided:\n\n`market`: The market of the result, one of: `FCR`, `AFRREnergy`, `AFRRCapacity`.\n\n`product`: The product of the result, e.g. `NEGPOS_00_04` (FCR), `POS_00_04` (AFRR Capacity), `POS_001` (AFRR Energy).\n\n`deliveryDay`: The delivery day of the bid result in the format `YYYY-MM-DD`, e.g. `2026-05-30` (full day according to RFC3339).\n\n`results`: A list of individual bid results for the product.\n\nEach result in the list contains the following fields whose contents can vary depending on the market:\n\n`bidID`: The ID of the corresponding bid.\n\n`accepted`: A boolean field that shows whether the bid was accepted or rejected in the auction.\n\n`offeredCapacity`: The offered capacity of the original bid in **kilowatts**, e.g. `2000`.\n\n`acceptedCapacity`: The accepted capacity determined in the auction in **kilowatts**, e.g. `1000`. Can be equal to or less than the `offeredCapacity`.\n\n`capacityPrice`:\n- aFRR Energy: This field is null.\n- aFRR Capacity: The capacity price of the original aFRR bid in **EUR/MW/h**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order. Since AFRR Capacity auctions are Pay As Bid, its value can be used to calculate revenue for AFRR Capacity results. See example below.\n- FCR: The capacity price of the original FCR bid in **EUR/MW**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order. Since FCR auctions are Pay As Clear, its value is not relevant for revenue calculations. See example below.\n\n`settlementPrice`: The settlement price determined by the auction in **EUR/MW**, e.g. `150.00`. This field is only filled for FCR results. Since FCR auctions are Pay As Clear, it can be used to calculate revenue for FCR results. See example below.\n\n`energyPrice`: The energy price of the original bid in **EUR/MWh**, e.g. `100.00`. This price is used to determine the position of the bid in the TSO's merit order. It cannot be used to calculate revenue for AFRR Energy results. See example below.\n\n`unavailabilities`: During a period of unavailability, a result may need to be reduced in its accepted capacity to still be deliverable by the virtual asset. The unavailability can cover the whole delivery period of a bid, or only a section of it. Moreover, capacity products may be affected by more than one unavailability event with different unavailable volumes. The following fields are provided for each unavailability:\n- `start`: The start of the unavailability period.\n- `end`: The end of the unavailability period.\n- `volume`: The unavailable power volume in kW. The remaining power of the result can be calculated the following way: `acceptedCapacity` - `volume`. The unavailable volume will then be backed up by terralayr via our pool provider.\n\n## Results publication\n\nThe exact publication time of results is not guaranteed.\n\nIf results have not yet been published, returns an empty list and status code 200.\n\n### aFRR Energy \n23 minutes before the start of the delivery period. E.g. for an aFRR Energy bid with delivery day 15.01.2026 and a delivery period starting at 12:30pm, results are expected around 12:07pm on 15.01.2026.\n\n### aFRR Capacity \n9:20am CET/CEST on the day before the delivery day. E.g. for an aFRR Capacity bid with delivery day 15.01.2026, results are expected around 9:20am CET on 14.01.2026.\n\n### FCR\n8:20am CET/CEST on the day before delivery day. E.g. for an FCR bid with delivery day 15.01.2026, results are expected around 8:20am CET on 14.01.2026.\n\n## Revenue calculation\n\n### aFRR Energy\n\nThe aFRR Energy auction is Pay As Clear.\n\nThe `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\nThe `settlementPrice` can be found in the data center of **regelleistung.net**. It can also be received through our internal revenue-reporting endpoint. 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\nIf your bid is accepted, you are not automatically receiving revenue for the delivery period.\n\nYou are paid only for the activated power you deliver, not the accepted capacity. The activations your asset performed can be received through our internal revenue-reporting endpoint.\n\nExample:\n- `energyPrice` offered in the bid: 80 EUR/MWh\n- `settlementPrice`: 100 EUR/MWh\n- Total activated power in 15 minutes: 2000 kW\n- Revenue: 100 EUR/MWh * 2 MW * 0.25 h = 50 EUR\n\n\n### aFRR Capacity\n\nThe aFRR Capacity auction is Pay As Bid and takes place on the day before the delivery day between 9:00am-9:20am CET/CEST.\n\nDepending on your offered `capacityPrice`, your bid is rejected or accepted.\n\nIf a bid is accepted, you are paid the offered `capacityPrice` for each hour of the delivery period.\n\nYou are paid for the capacity you provide, irrespective of the activations your asset delivers.\n\nExample:\n- `capacityPrice` offered in bid: 100 EUR/MW\n- `acceptedCapacity` received in result: 2000 kW\n- Revenue: (100 EUR/MW/h * 2 MW) * 4h = 800 EUR\n\n\n### FCR\n\nThe FCR Capacity auction is Pay As Clear and takes place on the day before the delivery day between 8:00am-8:20am CET/CEST.\n\nDuring this auction, a settlement price is set for each 4 hour EFA block on the next day.\n\nFor an accepted bid, this settlement price will be equal to or higher than the capacity price offered on your bid.\n\nIf a bid is accepted, you are paid the `settlementPrice` for the whole duration of the delivery period.\n\nYou are paid for the capacity you provide, irrespective of the activations your asset delivers.\n\nExample:\n- `capacityPrice` offered in bid: 80 EUR/MW\n- `settlementPrice` received in result: 100 EUR/MW\n- `acceptedCapacity` received in result: 2000 kW\n- Revenue: 100 EUR/MW * 2 MW = 200 EUR\n\n## Behaviour during full availability\n\nOnce a bid has received a result, both the ancillary commitment and the available wholesale capacity on the virtual asset are adjusted.\n\nYou can check your ancillary commitments per market through the `operationalData` endpoint on the virtual asset, by requesting the following categories: `fcrCommitment`, `afrrPosCommitment`, `afrrNegCommitment`.\n\nYou can check your available wholesale capacity by requesting the following categories: `wholesalePowerCapacityChargeAvailable`, `wholesalePowerCapacityDischargeAvailable`.\n\nThe adjustment depends on the nature of the result:\n\nIf the result is accepted and `acceptedCapacity` = `offeredCapacity`, your ancillary commitments and wholesale capacity are unchanged. \n\nIf `acceptedCapacity` \u003c `offeredCapacity`, the ancillary commitment for the duration of the delivery period is reduced to the value of `acceptedCapacity` and `wholesalePowerCapacityDischargeAvailable` and/or `wholesalePowerCapacityChargeAvailable` is increased by the same amount. \n\nIf the bid is rejected, the ancillary commitment for the duration of the delivery period is reduced to 0 and `wholesalePowerCapacityDischargeAvailable` and/or `wholesalePowerCapacityChargeAvailable` is increased by the `offeredCapacity` of the bid.\n\nE.g. if a aFRR Pos bid is rejected, the `offeredCapacity` of the bid is removed from `afrrPosCommitment` and added to `wholesalePowerCapacityDischargeAvailable`.\n\n## Behaviour during unavailability\n\nIf a virtual asset is affected by an unavailability, we will:\n\n1, Add unavailabilities to both the bid and the result which are then returned with every GET request. See above for the details.\n\n2, Adjust the ancillary commitments timeseries so it matches the reduced bid power capacities.\n\nNotably, reducing ancillary power capacities is always a last resort action: We will first fully reduce the available wholesale capacity before touching the ancillary bids.\n\nTo 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`.\n","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/results","href":"/virtual-assets-api-reference/ancillary/get-all-ancillary-results-for-a-given-virtual-asset-and-interval"}]},{"group":"fcr","pages":[{"title":"Get all FCR bids for a given virtual asset and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/fcr/bids","href":"/virtual-assets-api-reference/fcr/get-all-fcr-bids-for-a-given-virtual-asset-and-delivery-day"},{"title":"Create FCR bids for a given virtual asset.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json post /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/fcr/bids","href":"/virtual-assets-api-reference/fcr/create-fcr-bids-for-a-given-virtual-asset"},{"title":"Get FCR bids for a given virtual asset, product and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/fcr/bids/{productDateCode}","href":"/virtual-assets-api-reference/fcr/get-fcr-bids-for-a-given-virtual-asset-product-and-delivery-day"},{"title":"Update FCR bids for a single product and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json put /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/fcr/bids/{productDateCode}","href":"/virtual-assets-api-reference/fcr/update-fcr-bids-for-a-single-product-and-delivery-day"},{"title":"Get all FCR results for a given virtual asset and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/fcr/results","href":"/virtual-assets-api-reference/fcr/get-all-fcr-results-for-a-given-virtual-asset-and-delivery-day"},{"title":"Gets FCR results for a given virtual asset, product and delivery day.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/fcr/results/{productDateCode}","href":"/virtual-assets-api-reference/fcr/gets-fcr-results-for-a-given-virtual-asset-product-and-delivery-day"}]},{"group":"blocks","pages":[{"title":"Get all the blocks belonging to a virtual asset.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/blocks","href":"/virtual-assets-api-reference/blocks/get-all-the-blocks-belonging-to-a-virtual-asset"},{"title":"Get a block.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/blocks/{blockID}","href":"/virtual-assets-api-reference/blocks/get-a-block"},{"title":"Update the schedule of a block","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json put /organisations/{organisationID}/virtual-assets/{virtualAssetID}/blocks/{blockID}","href":"/virtual-assets-api-reference/blocks/update-the-schedule-of-a-block"},{"title":"Gets a selection of operational data of a block as a timeseries.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/blocks/{blockID}/operational","href":"/virtual-assets-api-reference/blocks/gets-a-selection-of-operational-data-of-a-block-as-a-timeseries"},{"title":"Gets the most recent operational data values for a block.","deprecated":null,"version":null,"openapi":"https://api.sandbox.trlyr.com/docs/doc.json get /organisations/{organisationID}/virtual-assets/{virtualAssetID}/blocks/{blockID}/operational/latest","href":"/virtual-assets-api-reference/blocks/gets-the-most-recent-operational-data-values-for-a-block"}]}]},{"group":"Auctions API","pages":[{"group":"auctions","pages":[{"title":"List auctions","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/auctions/docs/doc.json get /auctions","href":"/auctions-api-reference/auctions/list-auctions"},{"title":"Health check","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/auctions/docs/doc.json get /auctions/healthcheck","href":"/auctions-api-reference/auctions/health-check"},{"title":"Get an auction by ID","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/auctions/docs/doc.json get /auctions/{auctionID}","href":"/auctions-api-reference/auctions/get-an-auction-by-id"}]},{"group":"bids","pages":[{"title":"List your organisation's bids","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/auctions/docs/doc.json get /auctions/{auctionID}/bids","href":"/auctions-api-reference/bids/list-your-organisations-bids"},{"title":"Submit a bid","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/auctions/docs/doc.json post /auctions/{auctionID}/bids","href":"/auctions-api-reference/bids/submit-a-bid"}]}]},{"group":"Revenue Reporting API","pages":[{"group":"revenue","pages":[{"title":"Get aggregated revenue data points for a fleet","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/fleets/{fleetID}/datapoints","href":"/revenue-reporting-api-reference/revenue/get-aggregated-revenue-data-points-for-a-fleet"},{"title":"Health check","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/healthcheck","href":"/revenue-reporting-api-reference/revenue/health-check"},{"title":"Get fleet for an organisation","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/organisations/{organisationID}/fleet","href":"/revenue-reporting-api-reference/revenue/get-fleet-for-an-organisation"},{"title":"Get aggregated revenue data points for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/physical-assets/{physicalAssetID}/datapoints","href":"/revenue-reporting-api-reference/revenue/get-aggregated-revenue-data-points-for-a-physical-asset"},{"title":"Get aggregated revenue data points for a portfolio","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/portfolios/{portfolioID}/datapoints","href":"/revenue-reporting-api-reference/revenue/get-aggregated-revenue-data-points-for-a-portfolio"},{"title":"Get aggregated revenue data points for a virtual asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/virtual-assets/{virtualAssetID}/datapoints","href":"/revenue-reporting-api-reference/revenue/get-aggregated-revenue-data-points-for-a-virtual-asset"},{"title":"Get aFRR capacity revenue for a virtual asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/{virtualAssetID}/afrr-capacity","href":"/revenue-reporting-api-reference/revenue/get-afrr-capacity-revenue-for-a-virtual-asset"},{"title":"Get aFRR energy revenue for a virtual asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/{virtualAssetID}/afrr-energy","href":"/revenue-reporting-api-reference/revenue/get-afrr-energy-revenue-for-a-virtual-asset"},{"title":"Get FCR revenue for a virtual asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/{virtualAssetID}/fcr","href":"/revenue-reporting-api-reference/revenue/get-fcr-revenue-for-a-virtual-asset"},{"title":"Get tolling revenue for a virtual asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/{virtualAssetID}/tolling","href":"/revenue-reporting-api-reference/revenue/get-tolling-revenue-for-a-virtual-asset"},{"title":"Get virtual battery auction revenue for a virtual asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/{virtualAssetID}/vba","href":"/revenue-reporting-api-reference/revenue/get-virtual-battery-auction-revenue-for-a-virtual-asset"},{"title":"Get wholesale revenue for a virtual asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/revenue-reporting/docs/doc.json get /revenue-reporting/{virtualAssetID}/wholesale","href":"/revenue-reporting-api-reference/revenue/get-wholesale-revenue-for-a-virtual-asset"}]}]},{"group":"Physical Asset Management API","pages":[{"group":"physical-assets","pages":[{"title":"List physical assets","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets","href":"/physical-assets-api-reference/physical-assets/list-physical-assets"},{"title":"Create a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json post /physical-assets","href":"/physical-assets-api-reference/physical-assets/create-a-physical-asset"},{"title":"Get physical asset by ID","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}","href":"/physical-assets-api-reference/physical-assets/get-physical-asset-by-id"},{"title":"Update a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json patch /physical-assets/{physicalAssetID}","href":"/physical-assets-api-reference/physical-assets/update-a-physical-asset"},{"title":"List audit events for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/events","href":"/physical-assets-api-reference/physical-assets/list-audit-events-for-a-physical-asset"},{"title":"List unavailabilities for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/unavailability","href":"/physical-assets-api-reference/physical-assets/list-unavailabilities-for-a-physical-asset"},{"title":"Create an unavailability","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json post /physical-assets/{physicalAssetID}/unavailability","href":"/physical-assets-api-reference/physical-assets/create-an-unavailability"},{"title":"Get unavailability by ID","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/unavailability/{unavailabilityID}","href":"/physical-assets-api-reference/physical-assets/get-unavailability-by-id"},{"title":"Delete an unavailability","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json delete /physical-assets/{physicalAssetID}/unavailability/{unavailabilityID}","href":"/physical-assets-api-reference/physical-assets/delete-an-unavailability"},{"title":"Update an unavailability","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json patch /physical-assets/{physicalAssetID}/unavailability/{unavailabilityID}","href":"/physical-assets-api-reference/physical-assets/update-an-unavailability"}]},{"group":"health","pages":[{"title":"Health check","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/healthcheck","href":"/physical-assets-api-reference/health/health-check"}]},{"group":"ancillary","pages":[{"title":"Get ancillary bids by delivery day","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/ancillary/bids","href":"/physical-assets-api-reference/ancillary/get-ancillary-bids-by-delivery-day"},{"title":"Submit ancillary bids","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json post /physical-assets/{physicalAssetID}/ancillary/bids","href":"/physical-assets-api-reference/ancillary/submit-ancillary-bids"},{"title":"Get ancillary bids without results by product keys","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/ancillary/bids-without-result","href":"/physical-assets-api-reference/ancillary/get-ancillary-bids-without-results-by-product-keys"},{"title":"Get ancillary results by delivery day","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/ancillary/results","href":"/physical-assets-api-reference/ancillary/get-ancillary-results-by-delivery-day"},{"title":"Get ancillary results by bid IDs","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/ancillary/results-by-bid-ids","href":"/physical-assets-api-reference/ancillary/get-ancillary-results-by-bid-ids"}]},{"group":"control","pages":[{"title":"Get calculated setpoints for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/control/setpoints","href":"/physical-assets-api-reference/control/get-calculated-setpoints-for-a-physical-asset"}]},{"group":"eex","pages":[{"title":"Submit an EEX notification","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json post /physical-assets/{physicalAssetID}/eex","href":"/physical-assets-api-reference/eex/submit-an-eex-notification"},{"title":"List EEX notifications for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/eex/notifications","href":"/physical-assets-api-reference/eex/list-eex-notifications-for-a-physical-asset"},{"title":"Get an EEX notification by ID","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/eex/notifications/{eexNotificationID}","href":"/physical-assets-api-reference/eex/get-an-eex-notification-by-id"},{"title":"Delete an EEX notification","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json delete /physical-assets/{physicalAssetID}/eex/notifications/{eexNotificationID}","href":"/physical-assets-api-reference/eex/delete-an-eex-notification"},{"title":"Update an EEX notification","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json patch /physical-assets/{physicalAssetID}/eex/notifications/{eexNotificationID}","href":"/physical-assets-api-reference/eex/update-an-eex-notification"}]},{"group":"logbook","pages":[{"title":"List logbook entries for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/logbook-entries","href":"/physical-assets-api-reference/logbook/list-logbook-entries-for-a-physical-asset"},{"title":"Create a logbook entry","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json post /physical-assets/{physicalAssetID}/logbook-entries","href":"/physical-assets-api-reference/logbook/create-a-logbook-entry"},{"title":"Get a logbook entry by ID","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/logbook-entries/{entryID}","href":"/physical-assets-api-reference/logbook/get-a-logbook-entry-by-id"},{"title":"Delete a logbook entry","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json delete /physical-assets/{physicalAssetID}/logbook-entries/{entryID}","href":"/physical-assets-api-reference/logbook/delete-a-logbook-entry"},{"title":"Update a logbook entry","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json patch /physical-assets/{physicalAssetID}/logbook-entries/{entryID}","href":"/physical-assets-api-reference/logbook/update-a-logbook-entry"}]},{"group":"metadata","pages":[{"title":"List all metadata for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/metadata","href":"/physical-assets-api-reference/metadata/list-all-metadata-for-a-physical-asset"},{"title":"Get metadata for a physical asset category","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/metadata/{category}","href":"/physical-assets-api-reference/metadata/get-metadata-for-a-physical-asset-category"},{"title":"Create metadata for a physical asset category","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json post /physical-assets/{physicalAssetID}/metadata/{category}","href":"/physical-assets-api-reference/metadata/create-metadata-for-a-physical-asset-category"},{"title":"Delete metadata for a physical asset category","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json delete /physical-assets/{physicalAssetID}/metadata/{category}","href":"/physical-assets-api-reference/metadata/delete-metadata-for-a-physical-asset-category"},{"title":"Update metadata for a physical asset category","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json patch /physical-assets/{physicalAssetID}/metadata/{category}","href":"/physical-assets-api-reference/metadata/update-metadata-for-a-physical-asset-category"}]},{"group":"operational","pages":[{"title":"Gets a selection of operational data of a physical asset as a timeseries.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/operational","href":"/physical-assets-api-reference/operational/gets-a-selection-of-operational-data-of-a-physical-asset-as-a-timeseries"},{"title":"Update operational data for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json put /physical-assets/{physicalAssetID}/operational","href":"/physical-assets-api-reference/operational/update-operational-data-for-a-physical-asset"}]},{"group":"schedule","pages":[{"title":"Get schedule for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json get /physical-assets/{physicalAssetID}/schedule","href":"/physical-assets-api-reference/schedule/get-schedule-for-a-physical-asset"},{"title":"Update schedule for a physical asset","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/physical-assets/docs/doc.json put /physical-assets/{physicalAssetID}/schedule","href":"/physical-assets-api-reference/schedule/update-schedule-for-a-physical-asset"}]}]},{"group":"Asset Monitoring API","pages":[{"group":"monitoring","pages":[{"title":"Get raw monitoring data points for a physical asset.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints","href":"/monitoring-api-reference/monitoring/get-raw-monitoring-data-points-for-a-physical-asset"},{"title":"Get monitoring data points aggregated to 15-minute intervals.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/15min","href":"/monitoring-api-reference/monitoring/get-monitoring-data-points-aggregated-to-15-minute-intervals"},{"title":"Get monitoring data points aggregated to 1-minute intervals.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/1min","href":"/monitoring-api-reference/monitoring/get-monitoring-data-points-aggregated-to-1-minute-intervals"},{"title":"Get monitoring data points aggregated to 5-minute intervals.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/5min","href":"/monitoring-api-reference/monitoring/get-monitoring-data-points-aggregated-to-5-minute-intervals"},{"title":"Get monitoring data points aggregated to daily intervals.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/daily","href":"/monitoring-api-reference/monitoring/get-monitoring-data-points-aggregated-to-daily-intervals"},{"title":"Get monitoring data points aggregated to hourly intervals.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/hourly","href":"/monitoring-api-reference/monitoring/get-monitoring-data-points-aggregated-to-hourly-intervals"},{"title":"Get monitoring data points with automatic interval selection.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/interval","href":"/monitoring-api-reference/monitoring/get-monitoring-data-points-with-automatic-interval-selection"},{"title":"Get distinct data point names for a physical asset.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/names","href":"/monitoring-api-reference/monitoring/get-distinct-data-point-names-for-a-physical-asset"},{"title":"Get detailed summed statistics with calculated energy values.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/sum/detailed","href":"/monitoring-api-reference/monitoring/get-detailed-summed-statistics-with-calculated-energy-values"},{"title":"Get raw summed statistics for monitoring data points.","deprecated":null,"version":null,"openapi":"https://api.trlyr.com/monitoring/docs/doc.json get /{physicalAssetID}/datapoints/sum/raw","href":"/monitoring-api-reference/monitoring/get-raw-summed-statistics-for-monitoring-data-points"}]}]},{"group":"Admin API","pages":[]}]},{"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"}]}]},"basePath":"","title":"Post or update ancillary bids for a given virtual asset. - terralayr","buildId":"dpl_77Hw7ZuAABM8E3WMbYAf2ohQCr3v","deploymentId":"dpl_77Hw7ZuAABM8E3WMbYAf2ohQCr3v","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CVpqyvFO.js","utils-vpweLD0v.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BIOodqb0.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B1LM3qmu.js","snippetPresets-C5xK0GtN.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CCsxLnQl.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C2-WKG22.js","shallow-SdoLUC-q.js","getApiPlaygroundDisplay-BnI8L2hB.js","CodeSnippet-D5M8NCHI.js","CodeSnippets-CXRO8Uom.js","Page-CN9QbZiA.js","getPastedJson-CrfHEdRt.js","icon-Cr8AyUnW.js","MethodPill-J_Cs0kNw.js","DuplicateIcon-DrMboxGw.js","createIcon-B4CIWVbU.js","DynamicMarkdown-D9cdbgj9.js","SectionHeading-BO4CouT0.js","axios-vUo_bRtp.js","Markdown-L1m1-PSi.js","clsx-rIpTdK8h.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-ptfS1uB_.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-D31Sm3f9.js"]}