Price Setter Files
AEMO's NEMDE takes supply curves (generator and battery bids) and demand curves (battery bids, large load bids, and retailer loads at the ceiling price) and intersects them in every interval. As per economics 101, the price is set based on the bid price of the marginal generator. The price setter files contain information about which generator this was.
Interestingly, economics 101 only gets you so far. In many intervals the price is set by a generator in another region, or quite often by multiple generators, due to the complexities of inter-region losses, and constraints in security-constrained economic dispatch.
This data is useful for coming up with headlines like 'batteries have moved from being price takers, to setting the price often during midday', and questions like 'why did the price spike unexpectedly'?
There is typically more than one row per (market, region, interval), because one price may be set by many things at once.
(Additionally, Unit may contain multiple units per row.)
Links
To understand the data and files, read AEMO's NEMDE Queue User's Guide, section 8.3. This file refers the reader to "the NEMDE Price Setter File Description" and "the Publication of Price Setter Data – Business Specification". However those documents don't exist on AEMO's website today.
To understand the concepts, read these guides by Watt Clarity:
!!! tip "Tip": AEMO's Quarterly Energy Dynamics (QED) reports already include analysis of this data. Look for results there before trying to analyse this data yourself.
Column Schema
Unsure
I am unsure about the meaning of several columns. Treat my explanation as tentative. Get in touch if you know more.
BandCost
An amount in $/hour, rounded to eight decimal places. It is the “Increase” figure multiplied by the RRN band price.
This gives the contribution of this unit to the price. (Many factors drive the price. This is how you determine their relative significance.)
Despite AEMO saying that this is rounded to 8 decimal places, the values have at most 6 decimal places.
Examples: 92.585204, -8.97.
BandNo
For trade band or MNSP band variables this is the band number. For all other variables it is blank.
The marginal generator's bid has 10 bands. Which bid band was the marginal one?
Values 1-10. May be omitted.
Polars type: pl.UInt8.
DispatchedMarket
For trade band variables, this is the market that the trade band is for. For MNSP band variables it is the ENOF. For all other variables, it is the name of the variable.
Which market, or other cause, set the price?
e.g. Market=Energy and DispatchedMarket=L5RE means that the energy price was set to a certain value due to co-optimisation with something in the ancillary market (lower 5 minute regulation).
This may contain multiple values comma-separated (e.g. BDOF,LOAD)
Examples:
EnergyBDOF,GEN- Generation side of a bidirectional unit's offerBDOF,LOAD- Load side of a bidirectional unit's offerENOF- Energy offerL1SE- Lower 1 second FCASL5MI- Lower 5 minute FCASL5RE- Lower regulation FCASL5RE,GENL5RE,LOADL60S- Lower 60 second FCASL6SELDOFR1SE- Raise 1 second FCASR5MI- Raise 5 minute FCASR5RE- Raise regulation FCASR5RE,GENR5RE,LOADR60S- Raise 60 second FCASR6SEtbslack1tbslack2GenericConstraintSurplusGenericConstraintDeficitDROFLDOF- Load offer
The slack variables are possibly related to numerical relaxation in NEMDE.
They never appear as the only Unit to explain a given price.
Increase
An amount in MW, rounded to eight decimal places. For the Energy market, this is the marginal increase in band dispatch or constraint violation for a marginal 1MW increase in the energy demand for this region and market. For any FCAS market, this is the marginal decrease in band dispatch or constraint violation for a marginal 1MW decrease in the FCAS demand for this region and market. If the price-setting energy bands or energy-violations belong to a different region, the amount of increase may also take into account inter-regional losses.
This reflects the share of this unit's contribution to meeting marginal demand.
To meet a 1MW increase in demand, this unit must increase by this much.
Across multiple rows, all Increase values should sum to 1.
This comes from the lagrangian/dual inside NEMDE.
This value can be negative, in cases where an increase in marginal demand would result in this generator/storage being constrained down (or discharge/load constrained up). An individual value may be larger than 1 in magnitude.
Despite AEMO saying that it is rounded to 8 decimal places, this is typically rounded to 5 places.
Examples: -0.97527, 95
Market
The market the unit is trading into
This tells you whether a given row is about the price being set in the wholesale market (Energy) or FCAS.
Examples:
EnergyL1SEL5MIL5REL60SL6SER1SER5MIR5RER60SR6SE
PeriodID
The five-minute period for which data is displayed in the other columns
This timestamp is for the end of each interval.
Example: 2026-05-31T04:05:00+10:00
Price
The market price in $/MWh.
In $/MWh for energy.
For FCAS, prices are conceptually $/MW, however they are defined as $/MW for 1 hour, thus making them technically also $/MWh.
Example: 50.02401
RegionID
The ID of the region for which data is displayed in the other columns.
For more information, see the dedicated documentation page.
This is a factor/enum with values:
QLD1VIC1TAS1NSW1SA1
RRNBandPrice
An amount in $/MWh, rounded to eight decimal places. For energy and FCAS bands, this is the band prices, as referred to its RRN. For all other variables this is the constraint violation penalty (CVP) price
Probably the price bid by the relevant unit, reflected to the regional reference node (RRN). In $/MWh.
Despite AEMO saying that this is rounded to 8 decimal places, these values have at most 2 decimal places.
Examples: 0.01, 1.2.
Unit
For trade band variables, this is the unit that the trade band belongs to. For MNSP band variables it is the name of the interconnector and the region that the band belongs to. For tbslack1 and tbslack 2 variables it is a representation of the priced-tied trade bands. For generic constraint deficit and surplus variables it is the constraint name. For deficit product and surplus generation variables you will see the name of the region and market.
This column tells you which thing set the price.
For "trade band variables", this is a DUID.
(See the dedicated documentation page about generator identifiers).
Understanding these is very complicated, and beyond the scope of this site.
Examples:
TARONG#1T-V-MNSP1,TAS1
Warning
There is nuance here, when interpreting the 'who' part of the price-setter question.
e.g. Rooftop solar never bids, so can never appear in this dataset. However it is substantial enough in size that it obviously does affect the market.
e.g. Hydro has no marginal cost, but they may choose what price to bid based on the cost of gas. So if these files point to one fuel type, the underlying driver may be another fuel type.
Availability
These files are in an unusual location. One page per month.
Each page contains one zip per day (e.g. NemPriceSetter_20260522_xml.zip), containing many XML files.
On the same page there are also related but different files like NemSpdOutputs_20260501_loaded.zip for the Nemde Outputs. Ignore those.
These files are small. When compressed, these files add up to about 300 kB zip per day.
Example File
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SolutionAnalysis>
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="NSW1" Market="Energy" Price="90.50867" Unit="KESSB1" DispatchedMarket="BDOF,LOAD" BandNo="5" Increase="1.06481" RRNBandPrice="85" BandCost="90.508674" />
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="NSW1" Market="R1SE" Price="0.03" Unit="BLYTHB1" DispatchedMarket="R1SE" BandNo="1" Increase="-1" RRNBandPrice="0.03" BandCost="-0.03" />
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="NSW1" Market="R6SE" Price="0.05" Unit="MREHA3" DispatchedMarket="R6SE" BandNo="1" Increase="-1" RRNBandPrice="0.05" BandCost="-0.05" />
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="NSW1" Market="R60S" Price="0.04" Unit="DRVIOT03" DispatchedMarket="R60S" BandNo="2" Increase="-1" RRNBandPrice="0.04" BandCost="-0.04" />
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="NSW1" Market="R5MI" Price="0.01" Unit="DRGBND01" DispatchedMarket="R5MI" BandNo="1" Increase="-1" RRNBandPrice="0.01" BandCost="-0.01" />
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="NSW1" Market="R5RE" Price="12.21" Unit="BRNDBES1" DispatchedMarket="R5RE,LOAD" BandNo="4" Increase="-1" RRNBandPrice="12.21" BandCost="-12.21" />
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="NSW1" Market="L5RE" Price="1.2" Unit="LYA3" DispatchedMarket="L5RE" BandNo="2" Increase="-1" RRNBandPrice="1.2" BandCost="-1.2" />
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="QLD1" Market="Energy" Price="67.68287" Unit="KESSB1" DispatchedMarket="BDOF,LOAD" BandNo="5" Increase="0.79627" RRNBandPrice="85" BandCost="67.682873" />
...
<PriceSetting PeriodID="2026-05-22T04:05:00+10:00" RegionID="VIC1" Market="L5RE" Price="1.2" Unit="LYA3" DispatchedMarket="L5RE" BandNo="2" Increase="-1" RRNBandPrice="1.2" BandCost="-1.2" />
</SolutionAnalysis>