> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trlyr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 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.

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. 




## OpenAPI

````yaml https://api.sandbox.trlyr.com/docs/doc.json post /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/bids
openapi: 3.1.0
info:
  description: >
    This API allows clients to manage virtual-assets and blocks on the terralayr
    system.


    A virtual asset is a virtual battery, it has static parameters that dictate
    how much power it can import / export, how much energy it can store, and how
    efficiently it charges / discharges. It also has a state of charge which
    changes as the virtual asset exports and imports power.


    A block represents a slice of the power capacity of a virtual asset over
    time, and has a schedule which can be updated to control what the
    virtual-asset will do.


    Virtual assets should be kept balanced: you should manage the schedule such
    that the such that state of charge at the end of its lifetime is 50%. It is
    possible to submit schedules that do not end at 50%, but the response will
    include information about how much imbalance is left.


    ### Authorization


    All the underneath requests require a Bearer-type `Authorization` Header
    i.e. in the form : `Authorization: Bearer <YOUR_TOKEN>`.


    To retrieve a valid token you must log in to our system using a
    password-username authentication as follows:


    ```

    POST https://api.sandbox.trlyr.com/auth/public/authenticate

    ```


    with the following JSON body:


    ```

    {
        "username": "YOUR_USERNAME",
        "password": "YOUR_PASSWORD"
    }

    ```


    Your username and password are the ones you created after receiving an
    invitation to join your organisation.


    You should receive a JSON response body from which you can extract your
    token under `access_token`.


    If you have any questions, don't hesitate to contact our account manager at
    the following address: support@trlyr.com.
  title: terralayr API
  version: 1.11.3
servers:
  - description: Production API
    url: https://api.trlyr.com
  - description: Sandbox API
    url: https://api.sandbox.trlyr.com
security: []
tags:
  - name: virtual-assets
  - name: afrr
  - name: fcr
  - name: ancillary
  - name: blocks
externalDocs:
  description: ''
  url: ''
paths:
  /organisations/{organisationID}/virtual-assets/{virtualAssetID}/ancillary/bids:
    post:
      tags:
        - ancillary
      summary: 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 (< 0), you pay the TSO.

        - aFRR Energy: This field can be removed or left as `null`.

        - aFRR Capacity: The capacity price of the bid in **EUR/MW/h**, e.g.
        `100.00`. This price is used to determine the position of the bid in the
        TSO's merit order.

        - FCR: The capacity price of the FCR bid in **EUR/MW**, e.g. `100.00`.
        This price is used to determine the position of the bid in the TSO's
        merit order. Since FCR auctions are Pay As Clear, its value is not
        relevant for revenue calculations. See example below.


        `energyPrice`:


        The max price that can be bid into both markets is 15,000 Euros, the min
        price is -15,000 Euros. If you bid a positive price (> 0), you will be
        paid by the TSO. If you bid a negative price (< 0), you pay the TSO.

        - aFRR Energy: The energy price of the bid in **EUR/MWh**, e.g.
        `100.00`. This price is used to determine the position of the bid in the
        TSO's merit order.

        - aFRR Capacity: The energy price of the 16 implicit aFRR Energy bids in
        **EUR/MWh**, e.g. `100.00`. 

        - FCR: This field can be removed or left as `null`.


        ## Bidding deadlines


        ### aFRR Energy

        All bids must be placed before the following deadline: **30 minutes**
        before the delivery period, e.g. a bid for delivery period 15:30pm must
        be submitted by 15:00pm. Moreover, bids must be placed after **12:00pm
        CET/CEST** on the day before delivery. If bids are made before that
        time, they are rejected.


        ### aFRR Capacity

        All bids must be placed before the following deadline: **8:40am
        CET/CEST** on the day before delivery. The auction opens a week before
        the delivery day.


        ### FCR

        All bids must be placed before the following deadline: **7:30 am
        CET/CEST** on the day before delivery. The auction opens a week before
        the delivery day.


        ## Additional context for aFRR bids


        ### aFRR Capacity bids and implicit aFRR Energy bids

        When submitting a bid into the aFRR Capacity market, it is mandatory to
        place 16 implicit aFRR Energy bids covering the 4-hour duration of the
        Capacity bid.


        This is done by providing a mandatory `energyPrice` on each Capacity
        bid. You do not need to submit the implicit Energy bids yourself, they
        are automatically created upon submission of an aFRR Capacity bid and
        returned as part of the response body.


        Each of the 16 Energy bids will have the same `offeredCapacity` as the
        corresponding Capacity bid.


        These Energy bids can still be updated in their `energyPrice` and
        `offeredCapacity` after the Capacity bid has received a result. However,
        if the Capacity bid was accepted, the `offeredCapacity` of the Energy
        bids cannot be reduced, only increased. If the Capacity bid is rejected,
        the implicit Energy bids are also rejected.


        ### Individual aFRR Energy bids


        You may also place aFRR Energy bids individually, i.e. without first
        submitting an aFRR Capacity bid. 


        These must be submitted within the aFRR Energy bidding deadlines.


        ## Determining available bidding capacity


        Individual market validation (validation 1) and the cross-market
        validation (validation 2) must be passed, or the bid will be rejected.
        We strongly recommend using the combined validation to simplify your
        implementation.


        ### Combined validation: Validation 1 + 2 in a single step (recommended)


        We recommend a simplified validation process which combines the
        individual market validation and the cross-market validation.


        The value can be retrieved from the `operationalData` endpoint on the
        virtual asset as a 15 minute timeseries by requesting the operational
        data category `afrrNegCapacityAvailableMinusFcr`,
        `afrrPosCapacityAvailableMinusFcr` and `fcrCapacityAvailable`
        respectively.


        These categories take the available individual market capacity as a
        basis and reduce it where necessary to account for other bid commitments
        and the maxTotalCapacity validation.


        Example:

        - `maxTotalAncillaryCapacityDischargeAvailable`:         5000 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. 
      parameters:
        - description: Access token
          in: header
          name: Authorization
          required: true
          schema:
            default: Bearer <access token value>
            type: string
        - description: Organisation ID
          in: path
          name: organisationID
          required: true
          schema:
            type: string
        - description: Virtual Asset ID
          in: path
          name: virtualAssetID
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              items:
                $ref: '#/components/schemas/PostAncillaryBidsBody'
              title: postAncillaryBids
              type: array
        description: Bids to be posted or updated
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/AncillaryBidsBody'
                type: array
          description: Created
        '400':
          description: Bad Request
        '401':
          description: Unauthorized
        '425':
          description: Too Early
        '500':
          description: Internal Server Error
components:
  schemas:
    PostAncillaryBidsBody:
      properties:
        bids:
          items:
            $ref: '#/components/schemas/PostAncillaryBidBody'
          type: array
          uniqueItems: false
        deliveryDay:
          example: '2025-11-11'
          type: string
        product:
          example: POS_00_04
          type: string
      required:
        - deliveryDay
        - product
      type: object
    AncillaryBidsBody:
      properties:
        bids:
          items:
            $ref: '#/components/schemas/AncillaryBidBody'
          type: array
          uniqueItems: false
        deliveryDay:
          example: '2025-11-11'
          type: string
        market:
          example: AFRRCapacity
          type: string
        product:
          example: POS_00_04
          type: string
      required:
        - deliveryDay
        - market
        - product
      type: object
    PostAncillaryBidBody:
      properties:
        capacityPrice:
          description: In EUR/MW/h (AFRR Capacity) or EUR/MW (FCR)
          example: 100.5
          format: float
          type: number
        energyPrice:
          description: In EUR/MWh (AFRR Capacity and AFRR Energy only)
          example: 100.5
          format: float
          type: number
        offeredCapacity:
          description: In kW
          example: 1000
          format: float
          type: number
      required:
        - offeredCapacity
      type: object
    AncillaryBidBody:
      properties:
        bidID:
          example: 11111111-1111-1111-1111-111111111111
          format: uuid
          type: string
        capacityPrice:
          description: In EUR/MW/h (AFRR Capacity) or EUR/MW (FCR)
          example: 100.5
          format: float
          type: number
        energyPrice:
          description: In EUR/MWh (AFRR Capacity and AFRR Energy only)
          example: 100.5
          format: float
          type: number
        offeredCapacity:
          description: In kW
          example: 1000
          format: float
          type: number
        status:
          example: submitted
          type: string
      required:
        - bidID
        - offeredCapacity
        - status
      type: object

````