Skip to main content
This page explains why there are validations and rejections when working with a Virtual Asset, how our system checks and corrects dispatch schedules for virtual assets to make sure they follow the rules which are enforced on us by the underlying physical assets to ultimately avoid errors, and remain compliant.

Introduction: Why there are re-validations and rejections: how we connect physical constraints and virtual assets

  • Physical assets enforce certain limitations, which must be adhered to while trading
  • Prominent limitations are for example the virtual asset size in MW and MWh, Ramp rates or Unavailabilities - as listed in detail under below
  • If the physical limitations are not respected, the underlying pool of physical assets cannot dispatch what has been traded by the user and scheduled on the virtual battery
  • Since LAYR by terralayr is only the interface to seemlessly interact with the physical assets, terralayr supports by providing a schedule validation to customers, to avoid such mismatch of physical possibilities and virtual schedules
  • terralayr evaluates the physical feasibility of a schedule submission according to a set of pre-agreed rules between customer and terralayr
  • The validation can result in i) schedule rejections and ii) schedule corrections, based on timing and cause of the error
Image 32 The following chapters will 1) map physical restrictions to virtual battery restrictions 2) outline how terralayr validates and corrects schedules 3) the majority of reasons for invalid schedules, and 4) show how errors are displayed on the platform .

1. Mapping physical restrictions to virtual battery restrictions

Physical asset restrictionVirtual battery restrictionAPI endpointDifference
Maximum powerMaximum rated powerMaximum rated powervirtual-assets/operational:
powerCapacityChargeRated and powerCapacityDischargeRated
no difference
Maximum Energy capacity of BatteryMaximum energy capacityMaximum energy capacityvirtual-assets/operational:
energyCapacityRate
no difference
Ramp ratesRamp-rate regulation of DSO. Technical details depending on local ramping implementation e.g. IoT gateways.Ramp-rate regulation of DSO. Technical details according to terralayr implementation (closely aligned to market standard of IoT gateways)virtual-assets:
rampRate
marginal differences - depending on service provider
RTEBased on recent measurements - deviations in real RTE turn into SoC driftContractually agreed on: Option 1: guaranteed RTE, no SoC drift
Option 2: Based on recent measurements - deviations in real RTE turn into SoC drift
virtual-assets/operational:
dischargeEfficiency * chargeEfficiency
terralayr can simplify and stabilise RTE on virtual asset if contractually agreed on
CyclesContractually agreed onContractually agreed onvirtual-assets:
dailyCycleLimit and totalAlowedCycles
no difference
Gate closure FCRRegulatory by TSO:
8am on d-1

→ can be earlier depending on Ancillary service pool provider
7.30am on d-1status quo: communicated upfront to customer, hardcoded
future: communicated via API
marginal differences - depending on service provider
Gate closure aFRRRegulatory by TSO:
aFRR Capacity: 9am on d-1
aFRR Energy: t-25 minutes, per 15-min slot

→ can be earlier depending on Ancillary service pool provider
aFRR Capacity: 8.40am on d-1
aFRR Energy: t-30 minutes, per 15-min slot
status quo: communicated upfront to customer, hardcoded
future: communicated via API
marginal differences - depending on service provider
Dispatch schedule gate closure5 minutes before delivery

+ communication latency depending on local setup
5.30 minutes before deliveryvirtual-assets:
dispatchGateClosureSeconds
virtual asset gate closure is <30 seconds earlier than physical asset gate closure
Ancillary restrictions on wholesale blockSubject to accepted FCR and aFRR bidsSubject to accepted FCR and aFRR bidsvirtual-assets/operational:
socBoundsUpper and socBoundsLower
no difference
Zero crossing of power in a quarterPhysically possible, but subject to restrictions of IoT Gateway on asset. In the default often not possible.Depending on agreed on solution. In the default not possible.Communicated upfront to customer, hardcoded set of rulesno difference - both somewhat flexible according to terms agreed on

2. Schedule validation, re-validation and corrections

Categories

Possible interventions: There are multiple types of interventions at different levels/ points in time. The following part describes how they differ and at which time they are relevant Strict (only apply to power exceeding available power, malformed requests, platform outages and submission after gate-closure)
  • Validation - rejection on submission = your schedule will be rejected
Soft, applying to most other reasons for invalid schedules
  • Correction after submission and before re-validation = your schedule will be corrected before the re-validation (e.g. typically when an unavailability starts to hit)
  • Correction on re-validation [coming Q4 2025] = your schedule will be corrected, as part of the re-validation [coming Q4 2025] 7 minute before delivery (e.g. typically when your schedule would lead to out of bounds SoC levels but the scheduled power is in the acceptable range)
  • Rejection if submitted after re-validation [coming Q4 2025] = even soft criteria, which would only lead to a correction as part of the re-validation, turn into hard criteria and therefore a rejected schedule, once the re-validation and correction has taken place
Validation process timeline: Image 33 Mapping causes of invalid schedules to the validation process Image 34

Validation process

1. Validation (strict)

  • Every schedule is validated against a strict set of rules
  • If these strict rules are not adhered to, the schedule is rejected Image 35

2. Correction after submission and before re-validation (soft)

  • After successful submission, a sucessfully accepted schedule can still become invalid in a way, that it would not have surpassed the original validation
  • That can happen as a consequence of external events such as unavailabilities
  • In such cases, terralayr intervenes through a schedule correction before the re-validation Image 36

3. Re-validation and correction (at 7min before delivery start) (soft)

Re-Validation Process At 7 minutes before delivery, the Dispatch Schedule is finally re-validated against a list of criteria such as physical deliverability or contractually agreed limitations of battery usage. You can find a list of the validation parameters in your contract Annex. Re-Validation results and subsequent actions
  • The result of your re-validation will either be positive or negative
    • “positive” result
      • your schedule and trading can proceed as normally
    • “negative” result
      • If the dispatch leads to a negative re-validation response, it will be corrected slightly until it no longer violates the set respective rule(s) → it will be corrected in the most minimal way possible, which makes sure the rules are adhered to again
Deep-dive: Negative re-validation → schedule correction
  • If your schedule leads to a negative re-validation result, because it violated one of the reasons for invalid schedules described, terralayr will slightly correct it
  • terralayr will take minimal corrective measures on the following 15 minute period schedule value to ensure feasibility, avoiding over-correction.
  • Summed up, terralayr is replacing an infeasible dispatch schedule value of the next 15min period with an adjusted dispatch schedule value that applies minimal corrections.
  • The “corrected” dispatch schedule will become the new Active Schedule, readable via API - as set out in Option 1 below
  • Example:
    • we are in q1 and it is 7 minute prior to delivery of q2
    • Your projected State of Energy is at 19MWh at the start of q2
    • Your upper SoC boundary is 100% with a maximum State of Energy available of 20MWh
    • You scheduled a charge of 10MW for q2
    • That scheduled charge would bring the asset to 21.5MWh, which would correspond to an SoC of 107.5% → which is above the SoC limit of 100%
    • The re-validation process would recognise that the schedule would lead to an SoC above the upper SoC boundary and correct the scheduled power in the minimal possible way: from 10MW charge down to 4MW charge over in q2
    • 4MW would bring the asset exactly to 20MWh SoE and thereby to the upper SoC boundary of 100% Image 37
Correction process
  1. Option: no active position closing
    • terralayr corrects the schedule in the most minimal way possible
    • the customer can access information on the corrected schedule via API
    • terralayr nominates (and customer counter-nominates) that corrected schedule
    • the customer has two options
      1. close trading positions to make them align with the corrected, nominated schedule, and avoid imbalance
      2. leave the schedule as it is, but face an imbalance between terralayr’s nominations and the trading positions Example:
    • picking up the example from above, your schedule has been corrected from 10MW to 4MW
    • we are 7 minute before delivery and your algo just receives feedback from our API that a schedule correction has taken place and that terralayr will nominate 4MW charge for q2
    • now you could either correct your trading positions from 10MW to 4MW or you could accept the imbalance
  2. Option: active position closing [vBA client solution]
    • terralayr corrects the schedule in the most minimal way possible
    • terralayr does however nominate the original uncorrected schedule, which is in line with the customers trading positions
    • in order to have no imbalance in terralayr’s balancing group, terralayr closes the position of the correction via a service provider
    • the cost or benefit from this position will be billed to the customer Example:
    • picking up the example from above, your schedule has been corrected from 10MW to 4MW charge in q2
    • terralayr will however nominate 10MW, and you also leave your trading position at 10MW
    • we are 7 minute before delivery and terralayr now (via a service provider) takes a 6MW sell position on the intraday markets
    • this position assures, that
      • the balancing group is equaled out (the deviation between the scheduled 4MW charge and the nominated 10MW charge is taken care of via selling the excess energy again on the intraday markets)
      • your nominations and terralayr’s nominations are also equaled out
Note: Main difference between option 1 and option 2: In option 1, the customer can choose to either close the trading position or accepting an imbalance. In option 2 terralayr will always close a trading position on its own and the customer will never run into an imbalance; in turn customer will not have to get active + can ensure to avoid imbalances

4. Adjustments after schedule validation (Later than 7min before delivery start but before gate-closure) - (strict)

  • After the 7 minute mark has surpassed, the once “soft” validation (> 7min) turn into a “hard” validation, based on the same criteria as within the 7min validation, to maintain flexibility to update dispatch schedules, without losing their correctness as validated at 7min, part. regarding hard A.S. boundaries. A schedule which does not adhere to the validation criteria later than 7minutes before delivery (i.e. after the re-validation and correction) will be rejected. Image 38

Exemplary timeline of re-validation, correction and adjustments after schedule validation

  • This visual of the timeline set out above already includes most of the reasons for invalid schedules. Image 39
Disclaimer: We have deliberately chosen an early scheduling timepoint (knowing that this is not required in real usecases) to avoid confusion with the 4-quarter ahead imbalance rules from Virtual Asset Unavailabilities

3. Majority of reasons for invalid schedules

List of reasons:
ReasonDescriptionConsequence1. validation and rejection on submission2. intervention before re-validation (earlier than 7 minutes before delivery)3. correction on re-validation [coming Q4 2025] (7 minutes before delivery)4. rejection if submitted after re-validationError message in Q3 2025 (if applicable)Outlook to error message in Q4 2025 (if applicable)Necessary user action
|Scheduled Power| > |Max Power available| - in the attempt to submit a scheduleIf your attempted schedule involves power which is higher magnitude (be it discharge or charge) than your maximum available powerStatus Q32025 Schedule rejectionYou have to send a new adjusted schedule which is satisfying conditions
yesalready correctedalready correctedyes400 + text string explanation400 + enumerated error code and more detailed explanationResubmit a valid schedule
|Scheduled Power| > |Max Power available| - after successfully submitting a schedule and an external event occurringIf your formerly accepted schedule involves power which is higher magnitude (be it discharge or charge) than your new maximum available power
e.g. unavailability
Status Q32025 Always active correction: Your power is corrected to the level of max power available
no (as you already submitted in the past)yesalready correctedyesno error message, just correction[optional] notification which warns about schedule adjustmentRevisit the new schedule and adjust according to limitations, if needed.

Correct trading positions to match the new schedule or accept imbalance
Schedule Power violates ramp rate rules - in the attempt to submit a scheduleIf your attempted schedule involves power which is violating the pre-set ramp rate rule frameworkStatus Q32025 - No active correction: Your responsibility to make sure your schedule respects ramp rate restrictions

Status Q42025 - Active correction as part of re-validation:
Your schedule is accepted, and validated 7 minutes prior to delivery and the power value for the next delivery period is corrected, if it would violate ramp rate restrictions
nonoyesyesno error message, just correction[optional] notification which warns about schedule adjustmentRevisit the new schedule and adjust according to limitations, if needed.

Correct trading positions to match the new schedule or accept imbalance
Scheduled SoC < Lower SoC boundary OR Scheduled SoC > Upper SoC boundary at a time - in the attempt to submit a schedule.If your attempted schedule involves bringing the SoC to a level which is above the upper SoC boundary or below the lower SoC boundaryStatus Q32025 - No active correction: Your responsibility to make sure your schedule respects SoC bounds

Status Q42025 - Active correction as part of re-validation:
Your schedule validated 7 minutes prior to delivery and the power value for the next delivery period is corrected, if it would lead to SoC getting out of bounds
nonoyesyesno error message, just correction[optional] notification which warns about schedule adjustmentRevisit the new schedule and adjust according to limitations, if needed.

Correct trading positions to match the new schedule or accept imbalance
Scheduled SoC < Lower SoC boundary OR Scheduled SoC > Upper SoC boundary at a time - after successfully submitting a schedule and an external event occurring.if your scheduled power brings the SoC to a level which is above the upper SoC boundary or below the lower SoC boundary
e.g. an unavailability reduces your max power and SoE available for a certain time period. That leads to your SoC going below 0% at a later point, where the unavailability is lifted again.
Status Q32025 - No active correction: Your responsibility to make sure your schedule respects SoC bounds

Status Q42025 - Active correction as part of re-validation:
Your schedule validated 7 minutes prior to delivery and the power value for the next delivery period is corrected, if it would lead to SoC getting out of bounds
no (as you already submitted in the past)noyesyesno error message, just correction[optional] notification which warns about schedule adjustmentRevisit the new schedule and adjust according to limitations, if needed.

Correct trading positions to match the new schedule or accept imbalance
Submission after gate-closureif you submit your schedule after gate closure time, that will lead to a negative validationAlways schedule rejection: Your schedule will be rejectedyes--yes400 + text string explanation400 + enumerated error code and more detailed explanationAdjust trading positions positions if still possible and if necessary
Exceeding cycle limitsYour schedule leads to an excess of cycle limits within the period of your virtual battery. That might be a daily or yearly basis.Correction is your responsibility: you will get negative validation feedback but there will be no active intervention. you still need to adjust your schedule yourself!nonoyesyesno error message, just correction[optional] notification which warns about schedule adjustmentRevisit the new schedule and adjust according to limitations, if needed.

Correct trading positions to match the new schedule or accept imbalance
Malformed requestThe intended action does not make sense. E.g. Formal errors (misspellings etc.) or other ways of wrong API usageYour schedule cannot be submitted and you have to check for the root causeyes--yes4XX error4XX errorResubmit a valid request
Error on the terralayr platformA platform outage occursOuttage on the platform
→ retry mechanism, try again what you have done
→ if still no acceptance, you should reach out to terralayr operations

Any imbalance resulting is terralayr’s responsibility
Normally---5XX error5XX errorRetry mechanism to figure out if there is really a platform issue

Reach out to terralayr support: support@trlyr.com

4. Error Response

Current error string

At the moment the complete JSON response in an error state looks like:
{
    "error: "<error text>"
}
<> indicates a placeholder.

Error Categories

For most of errors the error text reads "<category> error: <description>" The error categories at the moment are:
  • auth: the request failed authentication and/or authorisation - maps to 401 or 404 response
  • not found: the request was valid, but the requested object doesn’t exist - maps to 404 response
  • invalid operation: the request makes sense and the resources exist, but it fails some validation such as power limits - maps to 400 response
  • forbidden operation: the request is otherwise illegal by our business logic - maps to 403 response
  • error on the platform: a platform outage in some kind of shape occurred - maps to a 5XX response
Non-standard errors
  • Not all of these error texts are shown in full to the user, usually for data-protection reasons such as not showing the details of an authorisation failure if customer A tried to do something with a customer B resource. For most of those, the customer will just get an empty response with a 404 or 500 code as appropriate.
  • There are some ways to get an error that do not follow this pattern. Usually these are generic HTTP failures, such as:
    {
        "error": "could not parse request body"
    }
    
    if you have an invalid body.
  • Other standard HTTP errors may apply, which should all be in the 4XX range when they amount to user error such as a malformed request, or the 5XX range when they amount to platform outages.

Terralayr specific validation errors

These are errors that happen when a request fails some kind of validation specific to the terralayr platform, usually amounting to an attempt to do something with a virtual-asset that does not make sense or is otherwise against the rules. They all fall into the categories of invalid or forbidden operation errors. As such, the JSON response follows the pattern above, and the HTTP code is usually 400 or 403. Examples:
  • ErrPowerPointStartTimeIsNotAQuarterOfAnHour, “instruction start time must be a quarter of an hour” → the user has sent a schedule update not aligned to the 15 minute grid.
  • ErrCannotUpdatePowerPointPastGateClosure, “cannot update instruction after gate closure” → the user has tried to send a schedule after gate closure.
  • ErrCannotUpdateNonWholesaleBlock, “cannot update schedule of non wholesale block: <block ID>” → the user has tried to schedule wholesale power on an ancillary block.
  • ErrCannotUpdateBlockOutsideOfBlockTimespan, “cannot update block outside of its timespan: update timespan <update timespam> is not fully contained within block timespan <block timespan>”: → the user sends schedule points outside the lifetime of their virtual-asset

Outlook

The current error responses just provide a string indicating what went wrong. As the API is developed we may look to add more structured information to these responses to allow clients to take programmatic action to address the issue.

5. Examples

  1. Example: SoC out of bounds Image 40
  2. Example: Power limits exceeded - initial submission Image 41
  3. Example: Power limits exceeded - external event Image 42

6. Details and footnotes

SoC projections

The SoC projection is calculated based on the following parameters:
  • Defined round-trip efficiencies for charging and discharging
  • The lastest SoC including FCR and aFRR activations
  • For SoC-forwarding activated virtual batteries, any corrections from the latest SoC reading.

Calculation of SoC projection - part of re-validation

  • At 7 minutes before delivery, the SoC projection of the next 15min period is validated against the given lower and upper SoC bounds.
  • If the SoC at the end of the following 15min period is projected to be below the lower SoC bound, the following correction is applied, with t being the following 15min period:
    IF projected SoE (t) < max(lower SoE bound (t), lower SoE bound (t+1)):
    	delta_energy = max(lower SoE bound (t), lower SoE bound (t+1)) - projected SoE (t) (resulting in positive number)
    	power_correction = 4 * delta_energy (charging is a negative number)
    	adjusted dispatch schedule (t) = max(max_charge(t), dispatch_schedule(t) - power_correction)
    
  • If the SoC at the end of the following 15min period is projected to be above the upper SoC bound, the following correction is applied, with t being the following 15min period:
    IF projected SoE (t) > min(upper SoE bound (t), upper SoE bound (t+1)):
    	delta_energy = max(upper SoE bound (t), upper SoE bound (t+1)) - projected SoE (t) (resulting in negative number)
    	power_correction = 4 * delta_energy (discharging is a positive number)
    	adjusted dispatch schedule (t) = max(max_charge(t), dispatch_schedule(t) - power_correction)
    
Last modified on June 10, 2026