{
  "anchors": [
    {
      "about": "2-letter state/jurisdiction code (PD-003).",
      "format": "usps_state",
      "kind": "geography",
      "name": "state",
      "scope": "universal"
    }
  ],
  "capability": "power.price_ercot",
  "codebooks": {
    "market": {
      "codes": {
        "DAM": {
          "label": "Day-Ahead Market (hourly, cleared the day before the operating day)"
        }
      },
      "coverage": "DAM only",
      "note": "Every price in this block is a DAY-AHEAD (DAM) settlement-point price. Real-time / 5-minute prices are not served.",
      "semantics": "market_label",
      "source": "Constant \u2014 this block serves the Day-Ahead Market (DAM)."
    },
    "settlement_point_type": {
      "codes": {
        "AH": {
          "label": "ERCOT's own finer hub-average code (served verbatim; e.g. HB_HUBAVG)"
        },
        "HU": {
          "label": "Trading Hub \u2014 a regional benchmark price (e.g. HB_NORTH, HB_HOUSTON, HB_WEST)"
        },
        "LCCRN": {
          "label": "ERCOT's own finer resource-node subclass (served verbatim)"
        },
        "LZ": {
          "label": "Load Zone \u2014 a load-aggregation zone (e.g. LZ_HOUSTON, LZ_NORTH)"
        },
        "LZEW": {
          "label": "ERCOT's own finer load-zone code (served verbatim)"
        },
        "LZ_DC": {
          "label": "DC-tie load zone \u2014 a settlement point at a DC interconnection (e.g. DC_E)"
        },
        "LZ_DCEW": {
          "label": "ERCOT's own finer DC-tie code (served verbatim)"
        },
        "PCCRN": {
          "label": "ERCOT's own finer resource-node subclass (served verbatim)"
        },
        "PUN": {
          "label": "Private Use Network resource node (served verbatim)"
        },
        "RN": {
          "label": "Resource Node \u2014 a single generating resource's settlement point"
        },
        "SH": {
          "label": "ERCOT's own finer code (served verbatim; e.g. HB_BUSAVG)"
        }
      },
      "coverage": "the distinct ERCOT type codes served from the pinned settlement-points mapping",
      "note": "ERCOT's OWN verbatim codes, never collapsed. The common classes: HU = trading Hub (a regional benchmark, e.g. HB_NORTH/HB_HOUSTON), LZ = Load Zone (e.g. LZ_HOUSTON), RN = Resource Node (a single generating resource's connection point), LZ_DC = a DC-tie zone (a settlement point at a DC interconnection to a neighboring grid, e.g. DC_E). The finer codes \u2014 PCCRN, LCCRN, PUN, AH, SH, LZ_DCEW, LZEW \u2014 are ERCOT's own subclassifications, served as-is (see ERCOT's settlement-points list for their precise definitions); we never guess or collapse them. Filter by ERCOT's EXACT code.",
      "semantics": "as_reported_ercot_settlement_point_type",
      "source": "ERCOT's published settlement-points list (NP6-905-CD) \u2014 the type for each settlement point, joined by name."
    }
  },
  "data_point": {
    "does_not_answer": [
      "real-time or 5-minute prices (this is the DAY-AHEAD hourly market only; ERCOT's real-time settlement is 15-minute, deliberately not served \u2014 \"hourly is fine, not real-time trading\")",
      "an energy / congestion / loss component breakdown (ERCOT's day-ahead settlement-point price is published as a TOTAL only \u2014 there is no component split and no loss component; we never synthesize one)",
      "a SUM of prices (price is intensive, $/MWh \u2014 it is averaged/min'd/max'd over a scope, never added; a \"total price\" is meaningless)",
      "bus-level nodal LMP (the >18,000-bus firehose, NP4-183-CD, is not served; settlement points are the settlement-relevant grain)",
      "prices for any other ISO/RTO, or a cross-ISO blended/average price (ERCOT only \u2014 methodologies and licenses differ; never merged or compared across ISOs)",
      "county, plant, lat/lon, or generator attribution of a price (a settlement point is an electrical/aggregate location, not a plant \u2014 ERCOT supplies no such id; the only anchor is state = TX)",
      "capacity (MW) or generation (MWh) \u2014 a price ($/MWh) is none of these (for installed capacity use query_power_capacity_v1; for generation use query_power_generation_v1)",
      "a forecast of future prices, or any claim that a past price predicts a future one"
    ],
    "grain": "settlement_point_hourly",
    "id": "power.price_ercot",
    "note": "This is ERCOT's DAY-AHEAD wholesale price ($/MWh) \u2014 ERCOT's Settlement Point Prices (EMIL NP4-190-CD), cleared the day before each operating day at every ERCOT settlement point, served hourly. It is a TOTAL price only: ERCOT publishes NO energy/congestion/loss component split and no loss component, and none is synthesized. A price is INTENSIVE \u2014 avg / min / max over a scope, NEVER summed; an average across more than one settlement point is indicative, not a settlement value (group_by settlement_point, or filter to one point/type). `settlement_point_type` is ERCOT's OWN code (HU hub, LZ load zone, RN resource node, DC-tie \u2026) so a single-plant resource node is not mistaken for a regional-benchmark hub. This is the DAY-AHEAD hourly market, NOT real-time / 5-minute prices. A settlement point is electrical/aggregate, not a plant \u2014 ERCOT supplies no county/lat-lon; the only anchor is state = TX. Historical coverage begins 2014-05-02; older settlement-point names are served as published and can have a null current type. For installed capacity use query_power_capacity_v1; for generation use query_power_generation_v1. ERCOT only \u2014 never blended, averaged, or compared across ISOs.",
    "product_spec": "blocks/power_price_ercot/card.md",
    "represented_fact": "The Texas wholesale price signal \u2014 ERCOT's Day-Ahead Market Settlement Point Prices (EMIL NP4-190-CD), the price ($/MWh) cleared the day before each operating day at every ERCOT settlement point, served hourly, point by point, exactly as ERCOT publishes it. ERCOT's day-ahead feed is structurally a TOTAL settlement-point price only \u2014 there is NO energy/congestion/loss component split and NO loss component (confirmed against live cells), so the flatter structure is served faithfully and the components are never synthesized. Historical coverage begins 2014-05-02, the first delivery day in ERCOT's Data Access Portal archive. Older settlement-point names are served exactly as published; names absent from the current pinned type reference retain a null type rather than being rewritten or guessed. One atom is one (delivery_date, hour_ending, settlement_point) price; ERCOT's own hour-ending label (\"01:00\"..\"24:00\") and DST flag are carried verbatim (the fall-back duplicate hour is distinguished by `dst_flag`, so a day carries 24 hours normally, 25 on the fall-back date, 23 on the spring-forward date). `settlement_point` is ERCOT's own location id (a Hub like HB_NORTH, a Load Zone like LZ_HOUSTON, a Resource Node named for one generator, or a DC-tie); `settlement_point_type` is ERCOT's own verbatim classification code, joined by name from ERCOT's published settlement-points list and cited to it, never collapsed and never guessed. A settlement point is an ELECTRICAL/aggregate location, not a plant \u2014 ERCOT supplies no county, no lat/lon: the only geography anchor is `state` = TX. Price is an intensive quantity ($/MWh): it is averaged, min'd, and max'd across a scope, never summed (summing prices is meaningless). This is ERCOT only \u2014 never blended, averaged, or compared across ISOs.",
    "source_basis": [
      "energy.ercot.prices"
    ],
    "source_decisions": [
      "docs/sources/energy/ercot/lmp/build-plan.md"
    ]
  },
  "input": {
    "controls": [
      "include_records",
      "include_evidence",
      "limit",
      "order_by",
      "top_n",
      "order",
      "rollup_other"
    ],
    "date_range_params": [
      "delivery_date_from",
      "delivery_date_to"
    ],
    "date_ranges": [
      "delivery_date"
    ],
    "field_metadata": {},
    "filters": [
      "as_of",
      "delivery_date",
      "hour_ending",
      "settlement_point",
      "settlement_point_type",
      "state"
    ],
    "group_by": [
      "settlement_point",
      "settlement_point_type",
      "delivery_date",
      "hour_ending"
    ],
    "ranking": {
      "no_ranking": "Omit order_by and top_n to return all groups in group-key order.",
      "order": {
        "default": "desc",
        "valid_values": [
          "desc",
          "asc"
        ]
      },
      "order_by": {
        "accepts": "one of output.metrics",
        "note": "Ranks the groups by a metric (a measure). Not a group_by dimension \u2014 rows already come back grouped by each group_by field.",
        "requires": [
          "group_by"
        ],
        "valid_values": [
          "avg_price_usd_per_mwh",
          "min_price_usd_per_mwh",
          "max_price_usd_per_mwh",
          "source_record_count"
        ]
      },
      "top_n": {
        "note": "Keeps the top N groups by order_by; the rest fold into one (other) remainder (additive metrics sum into it, non-additive ones are nulled) so the result still reconciles to summary.totals.",
        "requires": [
          "group_by",
          "order_by"
        ],
        "type": "positive integer"
      }
    }
  },
  "output": {
    "aggregate_citation_fields": [
      "source_id",
      "publisher",
      "source_url",
      "source_file",
      "raw_file_sha256",
      "as_of",
      "source_rows_count",
      "source_rows_sample",
      "verify",
      "lineage_filter"
    ],
    "citation_fields": [
      "source_id",
      "source_url",
      "source_file",
      "sheet",
      "source_row",
      "raw_file_sha256",
      "as_of"
    ],
    "detail_fields": [
      "source_id",
      "sheet_name",
      "iso",
      "market",
      "state",
      "settlement_point",
      "settlement_point_type",
      "source_record_key",
      "delivery_date",
      "hour_ending",
      "dst_flag",
      "price_usd_per_mwh",
      "report_period",
      "source_row_number",
      "as_of",
      "raw_file_sha256",
      "citation"
    ],
    "metric_groups": {
      "price": [
        "avg_price_usd_per_mwh",
        "min_price_usd_per_mwh",
        "max_price_usd_per_mwh"
      ],
      "records": [
        "source_record_count"
      ]
    },
    "metric_metadata": {
      "avg_price_usd_per_mwh": {
        "additive_across_groups": false,
        "aggregation": "average",
        "authoritative_total_path": "summary.totals.avg_price_usd_per_mwh",
        "category": "price",
        "definition": "The average ERCOT day-ahead settlement-point price ($/MWh) over the result scope.",
        "description": "A price is INTENSIVE ($/MWh) \u2014 it is averaged, min'd, and max'd over the scope, NEVER summed (a 'total price' is meaningless). An average across MORE THAN ONE settlement point (e.g. a hub and a resource node) is indicative, not a settlement value \u2014 group_by settlement_point for the per-point series, or filter to one settlement_point / settlement_point_type. This is the DAY-AHEAD total settlement-point price; ERCOT publishes no energy/congestion/loss split and none is synthesized.",
        "display_name": "Average day-ahead price ($/MWh)",
        "display_precision": "Prices are rounded to 6 decimal places in JSON to remove binary floating-point noise.",
        "grain": "settlement_point x delivery_date x hour_ending",
        "null_handling": "A scope with no prices returns null for avg/min/max (not 0 \u2014 absence is not a measured zero).",
        "rollup_behavior": "non_additive_measure",
        "row_metric_path": "rows[].metrics.avg_price_usd_per_mwh",
        "source_fields": [
          "settlementPointPrice"
        ],
        "unit": "USD/MWh"
      },
      "max_price_usd_per_mwh": {
        "additive_across_groups": false,
        "aggregation": "maximum",
        "authoritative_total_path": "summary.totals.max_price_usd_per_mwh",
        "category": "price",
        "definition": "The maximum ERCOT day-ahead settlement-point price ($/MWh) over the result scope.",
        "description": "A price is INTENSIVE ($/MWh) \u2014 it is averaged, min'd, and max'd over the scope, NEVER summed (a 'total price' is meaningless). An average across MORE THAN ONE settlement point (e.g. a hub and a resource node) is indicative, not a settlement value \u2014 group_by settlement_point for the per-point series, or filter to one settlement_point / settlement_point_type. This is the DAY-AHEAD total settlement-point price; ERCOT publishes no energy/congestion/loss split and none is synthesized.",
        "display_name": "Maximum day-ahead price ($/MWh)",
        "display_precision": "Prices are rounded to 6 decimal places in JSON to remove binary floating-point noise.",
        "grain": "settlement_point x delivery_date x hour_ending",
        "null_handling": "A scope with no prices returns null for avg/min/max (not 0 \u2014 absence is not a measured zero).",
        "rollup_behavior": "non_additive_measure",
        "row_metric_path": "rows[].metrics.max_price_usd_per_mwh",
        "source_fields": [
          "settlementPointPrice"
        ],
        "unit": "USD/MWh"
      },
      "min_price_usd_per_mwh": {
        "additive_across_groups": false,
        "aggregation": "minimum",
        "authoritative_total_path": "summary.totals.min_price_usd_per_mwh",
        "category": "price",
        "definition": "The minimum ERCOT day-ahead settlement-point price ($/MWh) over the result scope.",
        "description": "A price is INTENSIVE ($/MWh) \u2014 it is averaged, min'd, and max'd over the scope, NEVER summed (a 'total price' is meaningless). An average across MORE THAN ONE settlement point (e.g. a hub and a resource node) is indicative, not a settlement value \u2014 group_by settlement_point for the per-point series, or filter to one settlement_point / settlement_point_type. This is the DAY-AHEAD total settlement-point price; ERCOT publishes no energy/congestion/loss split and none is synthesized.",
        "display_name": "Minimum day-ahead price ($/MWh)",
        "display_precision": "Prices are rounded to 6 decimal places in JSON to remove binary floating-point noise.",
        "grain": "settlement_point x delivery_date x hour_ending",
        "null_handling": "A scope with no prices returns null for avg/min/max (not 0 \u2014 absence is not a measured zero).",
        "rollup_behavior": "non_additive_measure",
        "row_metric_path": "rows[].metrics.min_price_usd_per_mwh",
        "source_fields": [
          "settlementPointPrice"
        ],
        "unit": "USD/MWh"
      },
      "source_record_count": {
        "additive_across_groups": true,
        "aggregation": "count source records",
        "authoritative_total_path": "summary.totals.source_record_count",
        "category": "records",
        "definition": "Count of (settlement_point, delivery_date, hour_ending) day-ahead prices in the current result scope.",
        "description": "Number of hourly prices contributing to the avg/min/max \u2014 e.g. 24 for one settlement point over one normal delivery day.",
        "display_name": "Price count",
        "display_precision": "Integer.",
        "grain": "settlement_point x delivery_date x hour_ending",
        "null_handling": "Always an integer count.",
        "rollup_behavior": "additive_partition_metric",
        "row_metric_path": "rows[].metrics.source_record_count",
        "source_fields": [
          "source_record_key"
        ],
        "unit": "count"
      }
    },
    "metrics": [
      "avg_price_usd_per_mwh",
      "min_price_usd_per_mwh",
      "max_price_usd_per_mwh",
      "source_record_count"
    ],
    "summary_fields": [
      "group_count",
      "totals"
    ]
  },
  "primitive": "query_power_price_ercot_v1",
  "status": "available"
}
