---
name: energyaustralia-compare-energy-plans
title: "Compare EnergyAustralia energy plans"
description: >-
  Retrieve and compare EnergyAustralia's published electricity and gas plans from the
  public Consumer Data Right Product Reference Data surface. No key, no registration and
  no consent required — this is the one EnergyAustralia surface any agent can call today.
api: openapi/energyaustralia-energy-plans-api-openapi.yml
base_url: https://cdr.energymadeeasy.gov.au/energyaustralia/cds-au/v1
auth: none
operations:
  - listEnergyPlans
  - getEnergyPlanDetail
generated: '2026-07-27'
method: generated
---

# Compare EnergyAustralia energy plans

## What this surface is

EnergyAustralia's plan data is **not hosted by EnergyAustralia**. In CDR banking each bank
stands up its own public product endpoint; in CDR energy the Australian Energy Regulator is
the designated data holder for product data and serves every retailer from one gateway on a
per-brand path. The base URL is therefore
`https://cdr.energymadeeasy.gov.au/energyaustralia/cds-au/v1`.

This is public. Do not attempt to authenticate. Do not send a bearer token.

## Before you start

Two rules govern every call:

1. **`x-v` is mandatory on every request.** It is the *payload* version, and it is set
   **per endpoint**, not per API. Omitting it, or sending a non-integer, returns HTTP 400
   `urn:au-cds:error:cds-all:Header/InvalidVersion`.
2. **Versions differ between endpoints.** `listEnergyPlans` answers at `x-v: 1`.
   `getEnergyPlanDetail` requires `x-v: 3` — sending `x-v: 1` returns HTTP 406
   `urn:au-cds:error:cds-all:Header/UnsupportedVersion` with the supported minimum in the
   detail. If you are unsure, send `x-min-v` alongside `x-v` and let the holder pick.

## Step 1 — list the plans (`listEnergyPlans`)

`GET /energy/plans` with header `x-v: 1`.

Useful query parameters, all declared in the spec:

| Parameter | Values | Default |
|---|---|---|
| `type` | `STANDING`, `MARKET`, `REGULATED`, `ALL` | `ALL` |
| `fuelType` | `ELECTRICITY`, `GAS`, `DUAL`, `ALL` | `ALL` |
| `effective` | `CURRENT`, `FUTURE`, `ALL` | `CURRENT` |
| `updated-since` | DateTimeString | — |
| `brand` | string | — |
| `page` | PositiveInteger | — |
| `page-size` | PositiveInteger, max 1000 | — |

Read `meta.totalRecords` and `meta.totalPages` to size the walk, then follow `links.next`
until it is absent. Requesting `page-size` above 1000 returns HTTP 400
`Field/InvalidPageSize`; requesting a page beyond the range returns HTTP 422
`Field/InvalidPage`.

Each `data.plans[]` entry carries `planId`, `effectiveFrom`, `effectiveTo`, `type`,
`fuelType`, `brand`, `brandName`, `customerType` and `geography`. Filter on
`brand == "energyaustralia"` if you are working from a wider dataset.

## Step 2 — fetch the detail (`getEnergyPlanDetail`)

`GET /energy/plans/{planId}` with header `x-v: 3`.

`planId` values are fully qualified and include an origin suffix — for example
`ENE831725MRE15@EME`. URL-encode the `@`.

The response carries `electricityContract` and/or `gasContract` (conditional on
`fuelType`), each an `EnergyPlanContractV3` holding the tariff periods, discounts,
incentives, fees, eligibility rules, solar feed-in tariffs, controlled load and GreenPower
charges. This is where the comparable economics live — the list response does not contain
pricing.

An unknown or retired `planId` returns HTTP 404
`urn:au-cds:error:cds-all:Resource/Invalid`, which is *permanent*. Do not retry it.

## Step 3 — comparing

To compare like for like, group by `fuelType` and `geography` before comparing tariff
periods. Plans are jurisdiction-scoped: an offer available in the Ausgrid network is not
comparable to one in SA Power Networks. `type` matters too — a `REGULATED` plan is a
default offer, not a market offer.

## Error handling

All errors return `application/json` with an `errors[]` array — **not** RFC 9457
`application/problem+json`. Each element has `code` (a `urn:au-cds:error:` URN), `title`
and `detail`. See `errors/energyaustralia-problem-types.yml` for the full catalog.

Retry policy: `Retry-After` is honoured on HTTP 429 and is exposed to browser clients via
CORS. `Resource/Invalid` is permanent; `Resource/Unavailable` is transient.

## Tracing

Send an RFC 4122 UUID in `x-fapi-interaction-id` and the gateway plays it back on the
response. If you do not send one it mints one. Log it — it is the only correlation handle
you have.

## What you cannot do here

`/energy/accounts` and every other consumer path returns HTTP 404 on this gateway. The AER
serves product data only. For anything about a real customer see
`energyaustralia-consumer-data-sharing.md`.
