AESO · Arazzo Workflow

AESO price formation trace

Version 1.0.0

Reconstruct why Alberta's price cleared where it did — the offer stack, the units directed online, the outages that removed supply, and the resulting system marginal and pool prices.

1 workflow 5 source APIs 1 provider
View Spec View on GitHub EnergyCanadaAlbertaElectricityEnergy MarketsGridSystem OperatorMarket OperatorOpen Energy DataWholesale PowerDemand ResponseRenewablesUtilitiesArazzoWorkflows

Provider

aeso

Workflows

aeso-price-formation
Merit order, unit commitment and outages against the realised price series.
Note that unit commitment directives publish 60 days after the Unit Commitment End Time, so this workflow is retrospective for that step. Requires a free API-KEY subscription key.
5 steps inputs: endDate, startDate outputs: genCapacity, meritOrder, poolPrice, systemMarginalPrice, unitCommitment
1
read-merit-order
getMeritOrderReport
The stacked energy offers that determine which generation is dispatched and where the price clears.
2
read-unit-commitment
getUnitCommitmentDataReportV11ForDateRange
Directives that brought generating units online ahead of dispatch.
3
read-generation-outages
getAIESControlReport
Generation capacity and generator outages that removed supply from the stack.
4
read-system-marginal-price
getSystemMarginalPriceReportForDateRange
The realised real-time price signal across the window.
5
read-pool-price
getPoolPriceDateRangeReport
The settled hourly pool price to compare against the offer stack.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: AESO price formation trace
  summary: Reconstruct why Alberta's price cleared where it did — the offer stack, the units directed
    online, the outages that removed supply, and the resulting system marginal and pool prices.
  version: 1.0.0
sourceDescriptions:
- name: energymeritorder
  url: ../openapi/aeso-energymeritorder-api-v1-openapi.json
  type: openapi
- name: unitcommitmentdata-v2
  url: ../openapi/aeso-unitcommitmentdata-api-v2-openapi.json
  type: openapi
- name: aiesgencapacity
  url: ../openapi/aeso-aiesgencapacity-api-v1-openapi.json
  type: openapi
- name: systemmarginalprice
  url: ../openapi/aeso-systemmarginalprice-api-v1-1-openapi.json
  type: openapi
- name: poolprice
  url: ../openapi/aeso-poolprice-api-v1-1-openapi.json
  type: openapi
workflows:
- workflowId: aeso-price-formation
  summary: Merit order, unit commitment and outages against the realised price series.
  description: >-
    Note that unit commitment directives publish 60 days after the Unit Commitment End Time, so this
    workflow is retrospective for that step. Requires a free API-KEY subscription key.
  inputs:
    type: object
    required:
    - startDate
    properties:
      startDate:
        type: string
        description: The trading day to trace, in yyyy-MM-dd.
        example: '2026-05-01'
      endDate:
        type: string
        description: Optional last day of the price window, in yyyy-MM-dd. Range reports return at most
          one year per request.
        example: '2026-05-07'
  steps:
  - stepId: read-merit-order
    description: The stacked energy offers that determine which generation is dispatched and where the
      price clears.
    operationId: getMeritOrderReport
    parameters:
    - name: startDate
      in: query
      value: $inputs.startDate
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      meritOrder: $response.body
  - stepId: read-unit-commitment
    description: Directives that brought generating units online ahead of dispatch.
    operationId: getUnitCommitmentDataReportV11ForDateRange
    parameters:
    - name: startDate
      in: query
      value: $inputs.startDate
    - name: endDate
      in: query
      value: $inputs.endDate
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      unitCommitment: $response.body
  - stepId: read-generation-outages
    description: Generation capacity and generator outages that removed supply from the stack.
    operationId: getAIESControlReport
    parameters:
    - name: startDate
      in: query
      value: $inputs.startDate
    - name: endDate
      in: query
      value: $inputs.endDate
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      genCapacity: $response.body
  - stepId: read-system-marginal-price
    description: The realised real-time price signal across the window.
    operationId: getSystemMarginalPriceReportForDateRange
    parameters:
    - name: startDate
      in: query
      value: $inputs.startDate
    - name: endDate
      in: query
      value: $inputs.endDate
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      systemMarginalPrice: $response.body
  - stepId: read-pool-price
    description: The settled hourly pool price to compare against the offer stack.
    operationId: getPoolPriceDateRangeReport
    parameters:
    - name: startDate
      in: query
      value: $inputs.startDate
    - name: endDate
      in: query
      value: $inputs.endDate
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      poolPrice: $response.body
  outputs:
    meritOrder: $steps.read-merit-order.outputs.meritOrder
    unitCommitment: $steps.read-unit-commitment.outputs.unitCommitment
    genCapacity: $steps.read-generation-outages.outputs.genCapacity
    systemMarginalPrice: $steps.read-system-marginal-price.outputs.systemMarginalPrice
    poolPrice: $steps.read-pool-price.outputs.poolPrice