diff --git a/CLAUDE.md b/CLAUDE.md index 72f22fe3..a4511029 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,7 +3,9 @@ TinyERCOT preserves its legacy public Python API. The opt-in `tinyercot.catalog` module supplies offline metadata only. Read `docs/public-foundation.md` before adding current data capabilities. Read `docs/public-retrieval.md` for the opt-in -four-endpoint registry client, annual file adapter, and ESR website feed. +registry client, annual file adapter, and ESR website feed. Read +`docs/public-metadata.md` for reusable discovery, product facades, and evidence +accounting for the expanded public contracts. ## Local checks diff --git a/docs/api-archive-installed-task-note.md b/docs/api-archive-installed-task-note.md new file mode 100644 index 00000000..52d3d753 --- /dev/null +++ b/docs/api-archive-installed-task-note.md @@ -0,0 +1,33 @@ +# Installed archive verification + +Commands run on 2026-09-06 UTC from the current shared worktree unless noted: + +```bash +uv build +uv pip install --python /tmp/tinyercot-retrieval-wheel/bin/python --force-reinstall 'dist/tinyercot-0.2.2-py3-none-any.whl[files]' +``` + +Both passed. The probe ran with `/tmp` as its working directory: + +```bash +/tmp/tinyercot-retrieval-wheel/bin/python -I /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/tools/probe_api_archives.py --live --credentials-file /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.env --evidence /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence/catalog --output /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence/installed-api-archives --retired-history --download-oldest-bundle +``` + +Required checks passed with Python 3.14 from installed `site-packages`: +116 root products; 278 DME documents; four typed exact-text rows per current and +oldest cached DME ZIP; 103 DAM bundles; two first-page public retired-history +listings. The optional oldest-bundle transfer returned `SourceUnavailableError`; +its exact HTTP status was not retained. No bundle download or typed bundle rows +are claimed. Original DME ZIPs were not downloaded again. Source receipts and +selected document identities are checked in separately from ignored raw files. + +```bash +uv run --extra files pytest -q tests/test_probe_api_archives.py tests/test_api_archives.py tests/test_api_bundles.py tests/test_resource_dme.py tests/test_rt_archives.py +uv run ruff check tools/probe_api_archives.py tests/test_probe_api_archives.py +uv run ruff format --check tools/probe_api_archives.py tests/test_probe_api_archives.py +``` + +The test command passed **48 tests**. Lint and format checks passed after the +test import grouping was corrected. No legacy runtime files, exports, coverage +records, secrets, or credential contents were edited or copied in this subtask. +No commit, push, merge, or no-mistakes action was performed. diff --git a/docs/api-archives.md b/docs/api-archives.md new file mode 100644 index 00000000..1291bf87 --- /dev/null +++ b/docs/api-archives.md @@ -0,0 +1,127 @@ +# Selected public API archives + +`tinyercot.public.api_archives.APIArchiveClient` adds typed **document metadata** +and one selected public ZIP download. It inherits explicit public-account +credentials and bounded transport from `MetadataClient`. The generic transfer +keeps `APIArchiveFile.row_schema` as `"unknown"`; the separate, optional +`iter_resource_dme` decoder supports the verified NP3-988-ER CSV format below. + +```python +from tinyercot.public import Credentials +from tinyercot.public.api_archives import APIArchiveClient + +with APIArchiveClient(Credentials.from_env()) as client: + products, root_receipt = client.products() + page = client.archives("NP3-988-ER") + selected = page.documents[0] + file = client.download(selected) + assert file.row_schema == "unknown" +``` + +Calling `products()` establishes this instance's source-backed access gate and +invalidates previous download selections. An archive request requires an exact +product from that fetched root with explicit Public classification. Lifecycle is +separate: inactive or audit-retired products are marked `retired-or-inactive`, +and their historical public documents remain selectable when the current listing +verifies availability. That does not reinstate a retired live service. Secure, +Certified, missing classifications, unknown products, and unlisted document IDs +cannot authorize downloads. + +The source preserves publication timestamps without offsets. They remain exact +strings in `post_datetime`; the adapter does not invent UTC or market-time +semantics. Listing counts refer to documents, never decoded data rows. The source +advertised 278 NP3-988-ER archive records on one page during discovery. The adapter +returns source counters and does not follow further pages automatically. +Archive pagination remains deferred pending a verified query contract. + +Downloads use the +[primary OpenAPI contract](https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview): +`POST /archive/{emilId}/download` with JSON `{"docIds": [selected_id]}`. Selection +is limited to one unchanged document returned by this client. The response byte +budget, ZIP member count, expansion size, paths, and member integrity are checked; +members are never extracted to local paths. The returned document identity is +retained beside the receipt because a POST receipt URL alone cannot identify the +selected document. + +The bounded source discovery POST selected document 1270779234 on 2026-09-06 +UTC. ERCOT returned 22,983 ZIP bytes containing one CSV member (212,038 expanded +bytes). The source receipt and checked directory metadata are recorded in +`docs/evidence/api-archive-download.json`. One additional bounded historical check +selected document 1166614741, dated 2025-12-01, returning 21,892 ZIP bytes. Its +matching seven-column header and source rows are pinned alongside the current +sample in `tests/fixtures/public/resource-dme-excerpt.json`. This oldest listed +observation does not prove stable retention or complete history. + +## Optional resource decision-making entity CSV rows + +```python +from contextlib import closing +from tinyercot.public.resource_dme import iter_resource_dme + +# file is one previously selected NP3-988-ER APIArchiveFile. +with closing(iter_resource_dme(file, max_rows=None)) as records: + for record in records: + process(record.row.dme_duns) # Original string, including leading zeros. +``` + +The exact source columns are OWNER RE, RESOURCE NAME, TYPE, SPLIT GEN RESOURCE, +DME, DME DUNS, and RMR. Every cell remains a string: blanks, whitespace, quoting +results, flags, and identifier zeros are preserved. No string is silently parsed +as a number, boolean, or enumeration. `ResourceDmeRow` gives these observed +columns explicit field names. Receipt, source product, document/member identity, +UTF-8 decoding, ZIP expansion, header, and column checks fail explicitly on an +unknown schema epoch. `max_rows=None` iterates the complete selected CSV; +the default 1,000-row safeguard raises if more records remain. + +## Explicit historical bundles + +`client.bundles("NP4-190-CD")` returns a separate `APIBundlePage`. The actual +source response advertised 103 monthly bundles with signed negative document +identities, spanning the observed 2018-01 through 2026-08 labels. This is listing +evidence, not a claim of uninterrupted monthly data. Bundle metadata excerpts +and their source receipt are pinned in `tests/fixtures/public/api-bundle-excerpt.json`. + +`client.download_bundle(page.documents[0])` uses only +`POST /bundle/{emilId}/download` with that one source ID. Ordinary archive +documents cannot substitute for bundle identities, and a failed route never +falls back to another service. The caller's HTTP byte budget remains in force; +bundle defaults allow 512 ZIP members and 256 MB of advertised expansion. +Bundle CSV member-row schemas remain unknown. An installed-wheel attempt to +retrieve the oldest listed monthly bundle (-593019152, 2018-01) returned +`SourceUnavailableError` within a 16 MB response ceiling and one attempt. The +initial probe did not retain the exact HTTP status; no successful bundle bytes +or decoded rows are claimed. This does not establish that every bundle is +unavailable. There is no route fallback or repeated bundle request. + +## Installed-wheel evidence + +`docs/evidence/installed-api-archive-receipts.json` records real installed-client +root metadata (116 products), the 278-document DME listing, the 103-document DAM +bundle listing, and four typed DME rows from each of the two original ZIP caches. +Cache decoding checks original document publication/selection identity and +receipt hashes. The installed client did not download those files again. + +Two additional installed metadata requests verified public history listings for +audit-retired NP4-179-CD and NP3-990-EX: 1,000 of 4,236 and 1,000 of 2,602 +document entries respectively. Their lifecycle remains `retired-or-inactive`. +No document from either retired collection was downloaded. Further listing pages +remain outside this adapter's verified pagination contract. + +The explicit probe is `tools/probe_api_archives.py`. It requires an isolated +installed interpreter, `--live`, an existing mode-0600 `--credentials-file`, +`--evidence` pointing at the original ignored catalog evidence, and `--output`. +`--retired-history` adds only the two bounded listings. The separately opt-in +`--download-oldest-bundle` selects one bundle, with no monthly row extraction. +It refuses to overwrite an existing bundle output. The offline suite tests cache +binding and never executes authenticated requests. + +`tests/fixtures/public/api-archive-excerpt.json` records the exact primary spec +hash, public root receipt, one source product, archive-list receipt, and the first +two unmodified archive records. Source pagination counters remain unchanged in +the fixture; tests adjust them only when constructing a synthetic two-row page. +Offline checks cover metadata drift, public access gates, known retirement, +selection invalidation, JSON POST shape, untyped generic member data, malformed +archives, and byte/ZIP budgets. The optional DME decoder has current/historical +source-cell tests, identifier preservation, malformed schema tests, and complete +iteration beyond the sampling budget. Other binary row schemas remain unsupported; +these file adapters add no count to the typed REST data-path denominator. diff --git a/docs/evidence/aggregate-dashboard-fixture-provenance.json b/docs/evidence/aggregate-dashboard-fixture-provenance.json new file mode 100644 index 00000000..a2ddb260 --- /dev/null +++ b/docs/evidence/aggregate-dashboard-fixture-provenance.json @@ -0,0 +1,43 @@ +{ + "description": "Anonymous rolling outage and DC-tie website source captures; no historical date queries or continuous polling.", + "source_pages": [ + { + "url": "https://www.ercot.com/gridmktinfo/dashboards/generationoutages", + "observed_route": "/api/1/services/read/dashboards/generation-outages.json" + }, + { + "url": "https://www.ercot.com/gridmktinfo/dashboards/dctieflows", + "observed_route": "/api/1/services/read/dashboards/dc-tie-flows.json" + } + ], + "fixtures": [ + { + "fixture": "tests/fixtures/public/generation-outages-live.json", + "fixture_sha256": "feec97543fe9b88cee73b32cd5419eee67a6bd588d4dd0f114f52a8af1be6933", + "source_receipt": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/generation-outages.json", + "retrieved_at": "2026-09-06T00:34:49.810383+00:00", + "sha256": "93b58993e27f231852ea7fe9f91d078455c9e9e095c5e60a6f75ea4581494e9e", + "byte_count": 495264, + "status": 200 + }, + "transformation": "Retain first and last two observations in each current/previous section; retain all metadata and source categories; no value transformations.", + "authentication": "none; one anonymous snapshot request", + "observed_nullability": "No source nulls observed; models reject nulls." + }, + { + "fixture": "tests/fixtures/public/dc-tie-flows-live.json", + "fixture_sha256": "e2274cd4dcace70592400f63e5ebc75e14a82960ae36adcb7a5f8b8508cc3992", + "source_receipt": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/dc-tie-flows.json", + "retrieved_at": "2026-09-06T00:34:51.838286+00:00", + "sha256": "a5ff699999b2ef3974a1100c087839579dbd39b71441530793c32deac07ac137", + "byte_count": 1347948, + "status": 200 + }, + "transformation": "Retain first and last two observations; preserve all fields and serialize JSON numbers losslessly.", + "authentication": "none; one anonymous snapshot request", + "observed_nullability": "No source nulls observed; models reject nulls." + } + ] +} diff --git a/docs/evidence/api-archive-download.json b/docs/evidence/api-archive-download.json new file mode 100644 index 00000000..2c6d04a9 --- /dev/null +++ b/docs/evidence/api-archive-download.json @@ -0,0 +1,26 @@ +{ + "emil_id": "NP3-988-ER", + "document_id": 1270779234, + "selection_body": { + "docIds": [ + 1270779234 + ] + }, + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er/download", + "retrieved_at": "2026-09-06 00:41:23.171960+00:00", + "sha256": "98d58b35701a712bab1ca82449063ac512a8b63851fae51cf5096388773cd455", + "byte_count": 22983, + "status": 200 + }, + "members": [ + { + "name": "1270779234.rpt.00010036.0000000000000000.20260905.050243.ResDMEList_05092026.csv", + "expanded_bytes": 212038, + "compressed_bytes": 22709 + } + ], + "zip_crc_verified": true, + "member_row_schema": "unknown", + "transformation": "Receipt and ZIP directory metadata only; no CSV contents retained or typed." +} diff --git a/docs/evidence/dashboard-fixture-provenance.json b/docs/evidence/dashboard-fixture-provenance.json new file mode 100644 index 00000000..cf6ae799 --- /dev/null +++ b/docs/evidence/dashboard-fixture-provenance.json @@ -0,0 +1,41 @@ +{ + "description": "Two bounded public dashboard captures; snapshots only, no historical extraction or polling.", + "source_pages": [ + { + "url": "https://www.ercot.com/gridmktinfo/dashboards/fuelmix", + "observed_route": "/api/1/services/read/dashboards/fuel-mix.json" + }, + { + "url": "https://www.ercot.com/gridmktinfo/dashboards/gridconditions", + "observed_route": "/api/1/services/read/dashboards/daily-prc.json" + } + ], + "fixtures": [ + { + "fixture": "tests/fixtures/public/fuel-mix-live.json", + "fixture_sha256": "e8fcebd6ef548bf9fefe3d81fafe689feb2b2e91504b3973314012e2aa0d1602", + "source_receipt": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/fuel-mix.json", + "retrieved_at": "2026-09-06T00:27:11.954853+00:00", + "sha256": "9d969e4f9ba0cd976cc210b8ae1dadff6ee62f6da306a945a36fc9a2aae32de5", + "byte_count": 162715, + "status": 200 + }, + "transformation": "Retain first two and last two observations of each source day; retain all categories and monthlyCapacity; serialize numbers losslessly.", + "authentication": "none; anonymous ERCOT website request" + }, + { + "fixture": "tests/fixtures/public/daily-prc-live.json", + "fixture_sha256": "7c9d9684f91bbf1e50216222b4d6f8a55685a2098039c9eb70e448c7dbecb550", + "source_receipt": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/daily-prc.json", + "retrieved_at": "2026-09-06T00:27:11.989638+00:00", + "sha256": "e7e48bf1454fc0a50e0dd8d3c817c0f332ce59c08567808f4b9457b70b751aef", + "byte_count": 777495, + "status": 200 + }, + "transformation": "Retain first two and last two PRC observations and all current_condition fields; serialize numbers losslessly.", + "authentication": "none; anonymous ERCOT website request" + } + ] +} diff --git a/docs/evidence/fixture-provenance.json b/docs/evidence/fixture-provenance.json index cbaa2dd5..4fa36076 100644 --- a/docs/evidence/fixture-provenance.json +++ b/docs/evidence/fixture-provenance.json @@ -214,6 +214,138 @@ "byte_count": 2098, "status": 200 } + }, + { + "fixture": "api-archive-excerpt.json", + "sha256": "3f02500550f4910c82b72783609f1c5e51f9a1cb4d83d4f7f4c758fe1f68ae55", + "transformation": "One product from the public root and first two archive entries. Source metadata counters and all retained field values remain unchanged. Tests adjust count to two only in synthetic responses.", + "sources": [ + { + "source_url": "https://api.ercot.com/api/public-reports/", + "retrieved_at": "2026-09-06 00:28:10.305638+00:00", + "sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38", + "byte_count": 204591, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er", + "retrieved_at": "2026-09-06 00:36:49.025821+00:00", + "sha256": "fb7e721472adabcd6850e71c096f29eff591f97811425835879fc84f3de39cf7", + "byte_count": 59354, + "status": 200 + } + ] + }, + { + "fixture": "api-bundle-excerpt.json", + "sha256": "4a8dac40101c2bd112037f6044b149b998e2df6369484c267c1d06b44e35a8d4", + "transformation": "First two and final source bundle records, without altering source field values or pagination counters.", + "sources": [ + { + "source_url": "https://api.ercot.com/api/public-reports/bundle/np4-190-cd", + "retrieved_at": "2026-09-06 00:45:59.453486+00:00", + "sha256": "c8f081661149de29141e7d4cf1431d11d0e6739951f4452f0536b3261c3aef47", + "byte_count": 22196, + "status": 200 + } + ] + }, + { + "fixture": "daily-prc-live.json", + "sha256": "7c9d9684f91bbf1e50216222b4d6f8a55685a2098039c9eb70e448c7dbecb550", + "transformation": "Retain first two and last two PRC observations and all current_condition fields; serialize numbers losslessly.", + "source": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/daily-prc.json", + "retrieved_at": "2026-09-06T00:27:11.989638+00:00", + "sha256": "e7e48bf1454fc0a50e0dd8d3c817c0f332ce59c08567808f4b9457b70b751aef", + "byte_count": 777495, + "status": 200 + } + }, + { + "fixture": "dc-tie-flows-live.json", + "sha256": "e2274cd4dcace70592400f63e5ebc75e14a82960ae36adcb7a5f8b8508cc3992", + "transformation": "Retain first and last two observations; preserve all fields and serialize JSON numbers losslessly.", + "source": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/dc-tie-flows.json", + "retrieved_at": "2026-09-06T00:34:51.838286+00:00", + "sha256": "a5ff699999b2ef3974a1100c087839579dbd39b71441530793c32deac07ac137", + "byte_count": 1347948, + "status": 200 + } + }, + { + "fixture": "fuel-mix-live.json", + "sha256": "e8fcebd6ef548bf9fefe3d81fafe689feb2b2e91504b3973314012e2aa0d1602", + "transformation": "Retain first two and last two observations of each source day; retain all categories and monthlyCapacity; serialize numbers losslessly.", + "source": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/fuel-mix.json", + "retrieved_at": "2026-09-06T00:27:11.954853+00:00", + "sha256": "9d969e4f9ba0cd976cc210b8ae1dadff6ee62f6da306a945a36fc9a2aae32de5", + "byte_count": 162715, + "status": 200 + } + }, + { + "fixture": "generation-outages-live.json", + "sha256": "feec97543fe9b88cee73b32cd5419eee67a6bd588d4dd0f114f52a8af1be6933", + "transformation": "Retain first and last two observations in each current/previous section; retain all metadata and source categories; no value transformations.", + "source": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/generation-outages.json", + "retrieved_at": "2026-09-06T00:34:49.810383+00:00", + "sha256": "93b58993e27f231852ea7fe9f91d078455c9e9e095c5e60a6f75ea4581494e9e", + "byte_count": 495264, + "status": 200 + } + }, + { + "fixture": "resource-dme-excerpt.json", + "sha256": "fc4826fc0f1e4fa77db57b3b9e834ef67f07ab9f781e3b112ecb677995ec6cca", + "transformation": "Exact CSV headers and first three data records of two selected public source documents. All cells remain strings; complete CSV/ZIP bytes remain ignored local evidence.", + "sources": [ + { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er/download", + "retrieved_at": "2026-09-06 00:41:23.171960+00:00", + "sha256": "98d58b35701a712bab1ca82449063ac512a8b63851fae51cf5096388773cd455", + "byte_count": 22983, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er/download", + "retrieved_at": "2026-09-06 00:46:01.484878+00:00", + "sha256": "a9bba9ffbe187ba84ba64452378c229bf99e6b76e5a04f596d6952b89cf6408d", + "byte_count": 21892, + "status": 200 + } + ] + }, + { + "fixture": "rt-archive-excerpt.json", + "sha256": "6d2c5a06228cf4ccf67420f715e155eefb80746d073c4e3b8daddc3a8bb71468", + "transformation": "First header and three data rows from Dec_1/2010 and Jan/2026; unmodified cell values. Workbook bytes remain outside the repository.", + "sources": [ + { + "source_url": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=13061", + "retrieved_at": "2026-09-06 00:26:33.636260+00:00", + "sha256": "0c7866f25ce81543e62538522df8d1c6eda20a60ef9bcf37558255ab7cdb5a11", + "byte_count": 7812, + "status": 200 + }, + { + "source_url": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=318479603&reportTypeId=13061", + "retrieved_at": "2026-09-06 00:26:46.768037+00:00", + "sha256": "c5bd52346cc6644abdf65dbf452060fef6dac40f4b79c151726f3d3c8c4c8fe0", + "byte_count": 1292145, + "status": 200 + }, + { + "source_url": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=1268443390&reportTypeId=13061", + "retrieved_at": "2026-09-06 00:27:10.672048+00:00", + "sha256": "d2dd9f121dbcbdba370d4bc50f9652ff4e7d38987860b9e8fe454e65adc25238", + "byte_count": 9091870, + "status": 200 + } + ] } ] } diff --git a/docs/evidence/installed-aggregate-dashboards.json b/docs/evidence/installed-aggregate-dashboards.json new file mode 100644 index 00000000..f415b416 --- /dev/null +++ b/docs/evidence/installed-aggregate-dashboards.json @@ -0,0 +1,35 @@ +{ + "distribution_version": "0.2.2", + "installed_module": "/private/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/public/aggregate_dashboards.py", + "verified_at": "2026-09-06T00:49:59.809551+00:00", + "authentication": "none", + "scope": "Two rolling snapshots; no polling or historical extraction.", + "captures": [ + { + "adapter": "generation_outages", + "receipt": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/generation-outages.json", + "retrieved_at": "2026-09-06T00:49:57.691582+00:00", + "sha256": "0bd37237b2f64ead3f610a06e2f083e5d2156403faf1460c0e264853516bd0e5", + "byte_count": 496014, + "status": 200 + }, + "source_last_updated": "2026-09-05 19:46:00-0500", + "typed_rows": 1966, + "stale_at_ten_minutes": false + }, + { + "adapter": "dc_tie_flows", + "receipt": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/dc-tie-flows.json", + "retrieved_at": "2026-09-06T00:49:59.701530+00:00", + "sha256": "30a15dde2303551dd1ca361b6d353af899240b7a06dcce402850a51b0b77d0c3", + "byte_count": 1366048, + "status": 200 + }, + "source_last_updated": "2026-09-05 19:48:00-0500", + "typed_rows": 7128, + "stale_at_ten_minutes": false + } + ] +} diff --git a/docs/evidence/installed-api-archive-receipts.json b/docs/evidence/installed-api-archive-receipts.json new file mode 100644 index 00000000..69434097 --- /dev/null +++ b/docs/evidence/installed-api-archive-receipts.json @@ -0,0 +1,121 @@ +{ + "installed_module": "/private/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "checks": [ + { + "kind": "installed-public-root", + "product_count": 116, + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/", + "retrieved_at": "2026-09-06 00:58:15.179809+00:00", + "sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38", + "byte_count": 204591, + "status": 200 + } + }, + { + "kind": "installed-archive-listing", + "emil_id": "NP3-988-ER", + "documents": 278, + "total_records": 278, + "lifecycle": "active", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er", + "retrieved_at": "2026-09-06 00:58:17.003587+00:00", + "sha256": "fb7e721472adabcd6850e71c096f29eff591f97811425835879fc84f3de39cf7", + "byte_count": 59354, + "status": 200 + } + }, + { + "kind": "installed-cached-typed-dme", + "document": { + "emil_id": "np3-988-er", + "document_id": 1270779234, + "friendly_name": "ResDMEList_05092026", + "post_datetime": "2026-09-05T05:02:43.000" + }, + "typed_rows": 4, + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er/download", + "retrieved_at": "2026-09-06 00:41:23.171960+00:00", + "sha256": "98d58b35701a712bab1ca82449063ac512a8b63851fae51cf5096388773cd455", + "byte_count": 22983, + "status": 200 + }, + "network_download": false + }, + { + "kind": "installed-cached-typed-dme", + "document": { + "emil_id": "np3-988-er", + "document_id": 1166614741, + "friendly_name": "ResDMEList_01122025", + "post_datetime": "2025-12-01T05:13:53.000" + }, + "typed_rows": 4, + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er/download", + "retrieved_at": "2026-09-06 00:46:01.484878+00:00", + "sha256": "a9bba9ffbe187ba84ba64452378c229bf99e6b76e5a04f596d6952b89cf6408d", + "byte_count": 21892, + "status": 200 + }, + "network_download": false + }, + { + "kind": "installed-bundle-listing", + "emil_id": "NP4-190-CD", + "documents": 103, + "total_records": 103, + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/bundle/np4-190-cd", + "retrieved_at": "2026-09-06 00:58:19.105527+00:00", + "sha256": "c8f081661149de29141e7d4cf1431d11d0e6739951f4452f0536b3261c3aef47", + "byte_count": 22196, + "status": 200 + } + }, + { + "kind": "installed-retired-history-listing", + "emil_id": "NP4-179-CD", + "documents": 1000, + "total_records": 4236, + "lifecycle": "retired-or-inactive", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np4-179-cd", + "retrieved_at": "2026-09-06 00:58:21.477582+00:00", + "sha256": "ee4d528a7e9f30d96dfa4ca24b628a44e92d5cf084fd21fc0a5446c60b21f47a", + "byte_count": 206581, + "status": 200 + } + }, + { + "kind": "installed-retired-history-listing", + "emil_id": "NP3-990-EX", + "documents": 1000, + "total_records": 2602, + "lifecycle": "retired-or-inactive", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-990-ex", + "retrieved_at": "2026-09-06 00:58:23.374081+00:00", + "sha256": "da1fffd15e5c0d1219981205a27b43c82b2668eaec99d3e62f09d1def4428b80", + "byte_count": 214693, + "status": 200 + } + }, + { + "kind": "selected-bundle-boundary", + "document": { + "emil_id": "np4-190-cd", + "document_id": -593019152, + "friendly_name": "DAMSPNP4190_2018-01", + "post_datetime": "2018-01-31T23:59:59.000" + }, + "result": "SourceUnavailableError", + "response_byte_limit": 16000000, + "typed_rows": 0 + } + ], + "all_history_extraction": false, + "interpretation": "Real installed public metadata requests; two original source ZIPs decoded from hash-verified local cache. One selected oldest bundle transfer failed with SourceUnavailableError; no bundle bytes or rows claimed. Exact HTTP status was not retained by this initial probe." +} diff --git a/docs/evidence/installed-dashboards.json b/docs/evidence/installed-dashboards.json new file mode 100644 index 00000000..e6e89946 --- /dev/null +++ b/docs/evidence/installed-dashboards.json @@ -0,0 +1,35 @@ +{ + "distribution_version": "0.2.2", + "installed_module": "/private/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/public/dashboards.py", + "verified_at": "2026-09-06T00:49:59.758286+00:00", + "authentication": "none", + "scope": "Two rolling snapshots; no polling or historical extraction.", + "captures": [ + { + "adapter": "fuel_mix", + "receipt": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/fuel-mix.json", + "retrieved_at": "2026-09-06T00:49:57.634616+00:00", + "sha256": "a1ed94a8a4bafb9957f2e3bae590a452fb317cb5f61b91f2ae4586a2bb79818f", + "byte_count": 164279, + "status": 200 + }, + "source_last_updated": "2026-09-05 19:46:00-0500", + "typed_rows": 526, + "stale_at_ten_minutes": false + }, + { + "adapter": "grid_conditions", + "receipt": { + "source_url": "https://www.ercot.com/api/1/services/read/dashboards/daily-prc.json", + "retrieved_at": "2026-09-06T00:49:59.668003+00:00", + "sha256": "c4c8fd6502cac5da82e9e1c7cd550b676b47c5d984712c774156a3fd72f9de90", + "byte_count": 792480, + "status": 200 + }, + "source_last_updated": "2026-09-05 19:49:26-0500", + "typed_rows": 7137, + "stale_at_ten_minutes": false + } + ] +} diff --git a/docs/evidence/installed-registry-index.json b/docs/evidence/installed-registry-index.json new file mode 100644 index 00000000..74f8ba6d --- /dev/null +++ b/docs/evidence/installed-registry-index.json @@ -0,0 +1,1961 @@ +{ + "format_version": 1, + "manifest_sha256": "c3cc79d66d3eca8cf510f6d9f7ae317e3028ddcc76f07e456daa77a10cb25404", + "generated_unique_paths": 56, + "installed_unique_paths": 56, + "current_unique_paths": 56, + "current_requests": 57, + "oldest_first_unique_paths": 56, + "oldest_first_requests": 56, + "observed_public_data_paths": 243, + "pending_generated_paths": [], + "pagination": { + "live_paginated_unique_paths": 2, + "live_complete_selection_unique_paths": 1, + "partial_selection": { + "path": "/np4-190-cd/dam_stlmnt_pnt_prices", + "pages": [ + 1, + 2 + ], + "total_pages": 12, + "evidence": "docs/evidence/installed-receipts.json" + }, + "complete_selection": { + "path": "/np6-905-cd/spp_node_zone_hub", + "pages": [ + 1, + 2 + ], + "total_records": 2, + "evidence": "docs/evidence/installed-reports-receipts.json" + }, + "new_batch_pagination_requests": 0, + "complete_history_extraction": false, + "annual_complete_iteration": "Offline synthetic multi-worksheet proof only; live source files sampled from verified cache." + }, + "limits": "One-row newest/oldest source-directed selections for the 52-path batch. Oldest is scoped to source retention and optional filters, not all historical availability. No cross-epoch schema or full-history completeness claim.", + "authenticated_public_requests": true, + "restricted_requests": false, + "historical_bulk_extraction": false, + "paths": [ + { + "path": "/gen-55-cd/hrly_rt_load_fcast_actual", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:48:30.776612+00:00", + "sha256": "1f13194f01aff5b70ffe5ce39239f2e71a2231547b7d927a777827eeacb1ffb6", + "byte_count": 1674, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-02-25", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:48:33.039038+00:00", + "sha256": "8f0155f666c3607327c4bc7d9814d18fcf5e015c6415637434a37fa488692ad0", + "byte_count": 1681, + "status": 200 + } + } + ] + }, + { + "path": "/np1-302/as_obligation", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-03-09", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np1-302/as_obligation?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:48:34.983959+00:00", + "sha256": "36f971b0020b4186524c7c7e5fa8c7245fd4f3b428d2e2c6e13b43a3cf8672b2", + "byte_count": 2473, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-12-05", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np1-302/as_obligation?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:48:37.120052+00:00", + "sha256": "7ea5d9661aa9744d086b052605b815b3eca42c2a4e43d15ba5dc2cd799dc4d5e", + "byte_count": 2455, + "status": 200 + } + } + ] + }, + { + "path": "/np3-161-cd/7d_plus_avail_res_poc_margin", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 18:00:08", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:39.285331+00:00", + "sha256": "780f72f2049581f9b4a73de823bcc336d5f653f48a48bc12eb7384805d317d66", + "byte_count": 2320, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-06-25 18:00:07", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:41.174144+00:00", + "sha256": "abf3829f721bc0e1e9f551a6313a1ff5728732235ecbbd4ed5e808954c6f0954", + "byte_count": 2314, + "status": 200 + } + } + ] + }, + { + "path": "/np3-162-cd/7d_avail_res_poc_margin", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 19:05:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:43.394101+00:00", + "sha256": "64d6f7d9551479a30d896e51321cae1f06b1def528ad50c8935e79f52e454091", + "byte_count": 2615, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-06-25 17:05:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:45.434747+00:00", + "sha256": "705b702f2f12a56068efebbb5f9bbe317b600bb6c95281dac95f55d99e6ed3d1", + "byte_count": 2614, + "status": 200 + } + } + ] + }, + { + "path": "/np3-233-cd/hourly_res_outage_cap", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 19:00:47", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:47.534726+00:00", + "sha256": "39e3ec64a38c93e280b4cecb1e6b2ee1b661a81b98d85462cb1d498fc7818767", + "byte_count": 3020, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2023-12-11 15:03:49", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:49.635095+00:00", + "sha256": "d2280b7e7a6c864f2650501bdbcb4307fcfd2580f2b47ceb802e48fa242f469d", + "byte_count": 3025, + "status": 200 + } + } + ] + }, + { + "path": "/np3-560-cd/7d_load_fcast_by_fzn", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 19:30:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:52.094037+00:00", + "sha256": "5e437bd30381b74c0cda614dc74f3e1af0125714b66e21ee7b9f33737000019f", + "byte_count": 1809, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-03-26 15:30:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:53.855880+00:00", + "sha256": "35354df61beb7ef65de9788a557ca12fb1ae9cd71297a858349679dd53c64be9", + "byte_count": 1805, + "status": 200 + } + } + ] + }, + { + "path": "/np3-561-cd/7d_load_fcast_by_wzn", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 19:30:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:56.078962+00:00", + "sha256": "07b07250cd9ee51044c99e4bb7779d3a13277648e08c23ed0284b4c13920b901", + "byte_count": 2320, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-03-26 12:30:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:48:58.249386+00:00", + "sha256": "896f0026fd3affb4d1d9d6f620fc3f111e47544b853da7959f7f6b4518305a5b", + "byte_count": 2309, + "status": 200 + } + } + ] + }, + { + "path": "/np3-562-cd/ih_load_fcast_by_wzn", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 19:42:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:49:00.143383+00:00", + "sha256": "aa34c3e7e89a93759507a8881797e8e821ddefd99ca0432c3ede9903eeceffa8", + "byte_count": 2516, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-03-26 11:42:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:49:02.388759+00:00", + "sha256": "e2a81d00041478fee8990d8c0931de956321e26291be0829a3cac2b683de901c", + "byte_count": 2515, + "status": 200 + } + } + ] + }, + { + "path": "/np3-565-cd/lf_by_model_weather_zone", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 19:30:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:49:04.813169+00:00", + "sha256": "52e6b5bb552d5850b3b0565c73fd0d66e5aa03a92c2bcae4c2feee3eee6f2aaf", + "byte_count": 2608, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2023-12-11 14:30:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:49:07.267868+00:00", + "sha256": "c2049defc914d78879883917ea87cb46f8010bfa077e414843632d91a13da986", + "byte_count": 2605, + "status": 200 + } + } + ] + }, + { + "path": "/np4-158-sg/dam_essps", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 12:34:27", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:49:08.582161+00:00", + "sha256": "2ec1865a530ed3acaa47f7b1d47ee0a60bbce036584d2be19ffd318ff5248f61", + "byte_count": 1548, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-05-28 12:35:15", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:49:10.662315+00:00", + "sha256": "41062012de7a8e87058091f7228ebfb4e2f43547fd9acf3038cbee9f05d52228", + "byte_count": 1544, + "status": 200 + } + } + ] + }, + { + "path": "/np4-159-cd/load_distribution_factors", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-08-14 15:31:48", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:49:13.727413+00:00", + "sha256": "576c1159973290954a60dc33843bb1e02baa5e53897e03a44c0fad2e9a0c038b", + "byte_count": 1846, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2024-02-01 17:24:06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:49:15.156467+00:00", + "sha256": "c169e6a1bcc8e4b0276bfba9f826bb7a97442d4571edf1e86e172bd430c2ea3b", + "byte_count": 1834, + "status": 200 + } + } + ] + }, + { + "path": "/np4-183-cd/dam_hourly_lmp", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-05", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:17.136667+00:00", + "sha256": "cfa236240f8622d5755d3c1896af78322e875f9923ab981157181a021e60ef1f", + "byte_count": 1235, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-05", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:19.028480+00:00", + "sha256": "1c9275c26f20a05a4c8386121890e93f4f8685ada25650b4e89f24174650204b", + "byte_count": 1231, + "status": 200 + } + } + ] + }, + { + "path": "/np4-188-cd/dam_clear_price_for_cap", + "installed_module": "isolated site-packages/tinyercot/__init__.py (Python 3.14)", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 2, + "sort": "deliveryDate", + "receipt": { + "retrieved_at": "2026-09-05 21:07:59.139161+00:00", + "byte_count": 1336, + "source_url": "https://api.ercot.com/api/public-reports/np4-188-cd/dam_clear_price_for_cap?ancillaryType=REGUP&page=1&size=2&sort=deliveryDate&dir=desc&deliveryDateFrom=2026-09-04&deliveryDateTo=2026-09-04", + "status": 200, + "sha256": "2bb390340e7bd53c5813eb9feec867fb9344e60b9d8f7a406b36c4c9a4c40db4" + }, + "evidence_ref": "docs/evidence/installed-receipts.json#/receipts/4" + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "receipt": { + "retrieved_at": "2026-09-05 21:08:02.329327+00:00", + "byte_count": 1237, + "source_url": "https://api.ercot.com/api/public-reports/np4-188-cd/dam_clear_price_for_cap?ancillaryType=REGUP&page=1&size=1&sort=deliveryDate&dir=asc", + "status": 200, + "sha256": "ed8731e3b8bb8e9c682403f11b0722f6c61f935d5a1ce23dac219b164623f855" + }, + "evidence_ref": "docs/evidence/installed-receipts.json#/receipts/5" + } + ] + }, + { + "path": "/np4-19-cd/dam_agg_as_offer_curve", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:23.172864+00:00", + "sha256": "01f76a32421c4eabbeda42e45dcbb0dec10ef7a4fb05c095b158150793a58da6", + "byte_count": 1358, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-12-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:24.402470+00:00", + "sha256": "112ed960c283728aa67652f67fa1ecaa134eb41fb10f535af3bbbde2799dc562", + "byte_count": 1359, + "status": 200 + } + } + ] + }, + { + "path": "/np4-190-cd/dam_stlmnt_pnt_prices", + "installed_module": "isolated site-packages/tinyercot/__init__.py (Python 3.14)", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 2, + "sort": "deliveryDate", + "receipt": { + "retrieved_at": "2026-09-05 21:07:45.518924+00:00", + "byte_count": 1383, + "source_url": "https://api.ercot.com/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices?settlementPoint=HB_HOUSTON&page=1&size=2&sort=deliveryDate&dir=asc&deliveryDateFrom=2026-09-04&deliveryDateTo=2026-09-04", + "status": 200, + "sha256": "a15b73447a360b4e75809f3211d80f448b79717cfa0d0ed52a6e2c152856895f" + }, + "evidence_ref": "docs/evidence/installed-receipts.json#/receipts/0" + }, + { + "period": "current", + "status": "typed", + "rows": 2, + "sort": "deliveryDate", + "receipt": { + "retrieved_at": "2026-09-05 21:07:47.526077+00:00", + "byte_count": 1383, + "source_url": "https://api.ercot.com/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices?settlementPoint=HB_HOUSTON&page=2&size=2&sort=deliveryDate&dir=asc&deliveryDateFrom=2026-09-04&deliveryDateTo=2026-09-04", + "status": 200, + "sha256": "1ff1da41ba3ecad8ef29b6d5f5bf274bd18a44b6301fe38ea71f6af41a8b7cdc" + }, + "evidence_ref": "docs/evidence/installed-receipts.json#/receipts/1" + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "receipt": { + "retrieved_at": "2026-09-05 21:07:54.843199+00:00", + "byte_count": 1279, + "source_url": "https://api.ercot.com/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices?settlementPoint=HB_HOUSTON&page=1&size=1&sort=deliveryDate&dir=asc", + "status": 200, + "sha256": "c887c6583e05dede55a538e49f1d19136d6b733df1542eaf87f7b24672357ef6" + }, + "evidence_ref": "docs/evidence/installed-receipts.json#/receipts/2" + } + ] + }, + { + "path": "/np4-191-cd/dam_shadow_prices", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:25.644445+00:00", + "sha256": "db45f1a9cb9f9cd1b1c99e27813b992446bcc029b2a39c4639a4baf4aae652f0", + "byte_count": 2674, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2023-12-13", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:27.619194+00:00", + "sha256": "de4b4145be0ec6b778a82fdfeb20d4dfbc1d85c1c24c74cef4fc959c1ddebb8b", + "byte_count": 2674, + "status": 200 + } + } + ] + }, + { + "path": "/np4-192-cd/dam_total_energy_purchased", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:29.686887+00:00", + "sha256": "1c4bf6d563b3e77e988766b08cd083598e37ff0ecb297f65918c09cbce362a66", + "byte_count": 1280, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-12-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:31.814820+00:00", + "sha256": "84234f8ad8273961086d9bddab4bbfa5014e2f23d3cf8f370fc59a4be32c5330", + "byte_count": 1274, + "status": 200 + } + } + ] + }, + { + "path": "/np4-193-cd/total_dam_energy_sold", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:33.861418+00:00", + "sha256": "9a2a56d1bc33f2a79cdb8f2bcdbef7d34ae3ab32fe6d23783d3bbc1e91eff4f9", + "byte_count": 1260, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-12-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:35.920269+00:00", + "sha256": "da2ce61b6c5bd72f62af5705613c88f28cd7e28c22cde16ccdd76b6ff40e088b", + "byte_count": 1261, + "status": 200 + } + } + ] + }, + { + "path": "/np4-194-cd/dam_ptp_obligation_sp_results", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:38.011127+00:00", + "sha256": "9fa2ba5a6579c6187dd44163d5bf9a1659b681843d697cde4cbbdc00380adf55", + "byte_count": 1463, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-06-26", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:40.106174+00:00", + "sha256": "8b9cc5740cc0f00497248a284bdef1a929a0e3cce8627df32adb97a9b9470d4f", + "byte_count": 1459, + "status": 200 + } + } + ] + }, + { + "path": "/np4-196-m/dam_price_corrections_eblmp", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-12-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:42.472636+00:00", + "sha256": "73a38d542e10bee603ef8d7957332b7a977ff806dff171eafa3727c9e4a5c656", + "byte_count": 1550, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2024-01-10", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:44.337789+00:00", + "sha256": "c48c8ec1db8c625acb254116d4760d2b18323bb500ebda873e39bcd319863500", + "byte_count": 1553, + "status": 200 + } + } + ] + }, + { + "path": "/np4-196-m/dam_price_corrections_mcpc", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-06-27", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:46.644528+00:00", + "sha256": "3c0814c609efe98095dc5f475e84760b80dac09c9a528b1566fb428fc4579091", + "byte_count": 1525, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2024-01-10", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:48.497602+00:00", + "sha256": "b8e89ccaf67a683bf2498a7d7e17dedc5aeb09e4727904945410a7b131bdcca7", + "byte_count": 1524, + "status": 200 + } + } + ] + }, + { + "path": "/np4-196-m/dam_price_corrections_spp", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-12-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:50.693260+00:00", + "sha256": "0986bf2b1d6c488c242c4a898e18f62e5c6f7278b991d48cc12e777e2d1ad359", + "byte_count": 1586, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2024-01-10", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:49:52.736171+00:00", + "sha256": "bb578b6630a5e4d18cc67f46243b91420504dceee91b3761a99ebee239333e72", + "byte_count": 1590, + "status": 200 + } + } + ] + }, + { + "path": "/np4-197-m/rtm_price_corrections_eblmp", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-08-30 09:25:18", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:26.873799+00:00", + "sha256": "3c5dea8f56af02bbce5a48ccbb19f5850624b31bc1b002c787a288d6302c22df", + "byte_count": 1792, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2023-10-22 12:15:16", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:28.262793+00:00", + "sha256": "7abba5a9589f63a422f3cd7e987d1aebda546bcd0ef20907978783fec742eae0", + "byte_count": 1789, + "status": 200 + } + } + ] + }, + { + "path": "/np4-197-m/rtm_price_corrections_mcpc_sced", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-08-30 09:15:19", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:29.783008+00:00", + "sha256": "f603f64a418ba88a5a92de01e1929e5ff768c905916f37e346127877195386dd", + "byte_count": 1792, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-01-10 00:45:16", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:31.876949+00:00", + "sha256": "6307e492749c04525fe05cac1dbf51edd82a98f29ed0735f0194f8bde2e7f26c", + "byte_count": 1791, + "status": 200 + } + } + ] + }, + { + "path": "/np4-197-m/rtm_price_corrections_mcpc_spp", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-08-30", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:50:34.003638+00:00", + "sha256": "fbb304d4504addd1b5e73f8c2fa4d04823224b7f00285c5ac8532124c986d3c8", + "byte_count": 1725, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-01-10", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:50:36.223459+00:00", + "sha256": "eeb144654fc2913f308fcf676c614fb7a307a1c3c8a5042e4988a30c83352d06", + "byte_count": 1723, + "status": 200 + } + } + ] + }, + { + "path": "/np4-197-m/rtm_price_corrections_shadow", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-08-30 09:25:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:38.198965+00:00", + "sha256": "f5606e297fb1d959006e4768e4c05ef868dd0868e122e278f69d3a0791543601", + "byte_count": 2340, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2023-10-22 12:15:16", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:40.282037+00:00", + "sha256": "0dd9440b9b6a75387286287f289543aa1361c71e7d0baf894f4f3e3cf7ee4b72", + "byte_count": 2332, + "status": 200 + } + } + ] + }, + { + "path": "/np4-197-m/rtm_price_corrections_soglmp", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-08-30 09:25:18", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:42.867404+00:00", + "sha256": "6e44a667ea8adf224d6516c9df931bbd0ad9b4d80d26c51573d19af1af278dce", + "byte_count": 2650, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2023-10-22 12:15:16", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:44.984355+00:00", + "sha256": "c8629403994867e0335a4e0ed090b7ce75a66b8b118d490b3bc58ba0e72703c4", + "byte_count": 2647, + "status": 200 + } + } + ] + }, + { + "path": "/np4-197-m/rtm_price_corrections_sogprice", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-08-30", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:50:47.040564+00:00", + "sha256": "3ec799b42a7f5dbbcf928e22341229aa28202ec7a04bd68208059f2e72a9f67b", + "byte_count": 2013, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2023-10-22", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:50:49.233054+00:00", + "sha256": "40515fc1bb929fababb59e5838b2f4f3ef6a7c86abfe59e6258dc1644392f601", + "byte_count": 2008, + "status": 200 + } + } + ] + }, + { + "path": "/np4-197-m/rtm_price_corrections_splmp", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-08-30 09:25:18", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:51.149615+00:00", + "sha256": "258b17eb9fbb0ddcf66436cf271a8526691da7193985a4629dce8bcbe24e9b7e", + "byte_count": 1440, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2023-10-22 12:15:16", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:50:53.110064+00:00", + "sha256": "82792ad8259c3ed0b7c6162a4583999cc40f9c00700c7b7a48933a0a8b5d5d90", + "byte_count": 1441, + "status": 200 + } + } + ] + }, + { + "path": "/np4-197-m/rtm_price_corrections_spp", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-08-30", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:50:55.259065+00:00", + "sha256": "058496e9703c6dc9381b788dab58a8551638f06cb4be13efc354e3e62020033e", + "byte_count": 1865, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2023-10-22", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:50:57.347162+00:00", + "sha256": "9a7592136c8c0179bc1f114a33c326ec8c5ebc848b8a9b3cd4dd8115c7c1ab3a", + "byte_count": 1863, + "status": 200 + } + } + ] + }, + { + "path": "/np4-200-cd/dam_de_energized_spbc", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:50:59.216324+00:00", + "sha256": "04fce1756dcf0732ef9aae79179c8d0f8cff83f7f313931584c0a4c094df7361", + "byte_count": 1133, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-08-01", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:51:01.555333+00:00", + "sha256": "08ac3b070979f0acf986d284df465112be8b6ebce528458e1a2be3e7d2034a68", + "byte_count": 1132, + "status": 200 + } + } + ] + }, + { + "path": "/np4-212-cd/dam_sced_as_demand_curves", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 04:55:40", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:51:10.293891+00:00", + "sha256": "c0f4e123289450c5181d49b4355075216ffd9546820726a9e95b684b8809e7c0", + "byte_count": 1681, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2025-12-05 04:56:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:51:13.880102+00:00", + "sha256": "fdf0c6af9faa4867820233b305d59d0acfcafbb12d74a14a6918bad439d24ca1", + "byte_count": 1682, + "status": 200 + } + } + ] + }, + { + "path": "/np4-213-cd/hruc_as_demand_curves", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:51:21.546132+00:00", + "sha256": "4a4d5f8551c941d5c9978cb435f4c90a3bfd8ce77052c17127df3bfdb75b349b", + "byte_count": 1674, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-02-26", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:51:35.223245+00:00", + "sha256": "66d52d07fc7ac60680f5722ecb8a41f0b4e2c927043c91e3a89385bb64558367", + "byte_count": 1673, + "status": 200 + } + } + ] + }, + { + "path": "/np4-214-cd/druc_as_demand_curves", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:51:35.744116+00:00", + "sha256": "70e2be03bae063a1228ad564f4ee5ca9a5ed120580867da6158bbaaa1f063626", + "byte_count": 1670, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-02-28", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:51:37.759995+00:00", + "sha256": "8c9352a6467b5e4692f5ccea9aeb38f2cb68e02d25a8e845f056a16ad056aa15", + "byte_count": 1672, + "status": 200 + } + } + ] + }, + { + "path": "/np4-215-cd/wruc_as_demand_curves", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 02:54:35", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:51:42.018062+00:00", + "sha256": "ed7433735b66b8920357ad1770c025117b8c4f3fae2c0f174e1a9d5d28013e62", + "byte_count": 1825, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-02-27 02:46:04", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:51:43.843894+00:00", + "sha256": "e8e396838ccf075c55dd8a8077550334c56b0f07f65b738cc1a77ab4da90e157", + "byte_count": 1826, + "status": 200 + } + } + ] + }, + { + "path": "/np4-231-cd/electrical_bus_map_heur_price", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 05:50:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:51:44.269302+00:00", + "sha256": "0757c36af7899c97591b482f4f7e9380dc03c393078d36b2b59c9c940196e2bc", + "byte_count": 1393, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-07-31 05:50:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:51:46.343568+00:00", + "sha256": "14f185bca4e7364790b212ec7d5d5a6ccf79d3e9edf533e2d1ce4e6b06527d64", + "byte_count": 1389, + "status": 200 + } + } + ] + }, + { + "path": "/np4-33-cd/dam_as_plan", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2026-09-05 05:00:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan?page=1&size=1&dir=desc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:51:48.559219+00:00", + "sha256": "539470e910a7ca129662f1cc5f9bc58a6eff0c637a08d5ece825b7a712550eca", + "byte_count": 1346, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "postedDatetime", + "source_time": "2023-12-12 05:00:00", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan?page=1&size=1&dir=asc&sort=postedDatetime", + "retrieved_at": "2026-09-06 00:51:50.628809+00:00", + "sha256": "9a2cd73cbb7b336405dafe83b96f50ed8666b2a648e861e9c6151042f4715446", + "byte_count": 1346, + "status": 200 + } + } + ] + }, + { + "path": "/np4-523-cd/dam_system_lambda", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-06", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:51:52.631764+00:00", + "sha256": "766feac4c56955e0a17ad211f1591588f375f40e8da86206d748897b66bdb7a0", + "byte_count": 1061, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2023-12-13", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:51:54.701091+00:00", + "sha256": "2b988b1c0c75b3a7aa1eea3c6658c0237f22cae1870eaaf8e6f17879bb0e02b8", + "byte_count": 1059, + "status": 200 + } + } + ] + }, + { + "path": "/np6-322-cd/sced_system_lambda", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 19:45:24", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:51:56.848194+00:00", + "sha256": "c167276b1783c1a3e241e78c5b719594bb2c8959eecd4f9c70723177695c2f67", + "byte_count": 1136, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2023-12-11 14:30:18", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:51:59.028692+00:00", + "sha256": "bf24795af0b2903787b246ad870e9fb6a3af44539efb07b8bf36cb669785f424", + "byte_count": 1139, + "status": 200 + } + } + ] + }, + { + "path": "/np6-323-cd/rt_price_adder_sced", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 19:45:24", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:52:01.100465+00:00", + "sha256": "6a09e7a8a80abd0584b517f9e21c6fb61b6f20927367a0f602c35bc2519dcfb6", + "byte_count": 3211, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2025-12-05 00:10:17", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:52:03.160739+00:00", + "sha256": "93abbe69b7cc865a65bcf0c9f8d1b94d379211a27a78fb11b28e40d167697943", + "byte_count": 3211, + "status": 200 + } + } + ] + }, + { + "path": "/np6-324-cd/rt_15min_price_adders", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-05", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:52:05.734939+00:00", + "sha256": "efa94ba388d806c20f90719ff65885b82d0cb9aa0cda46cdadf9d6c9e8d43f99", + "byte_count": 1891, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-12-05", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:52:07.687756+00:00", + "sha256": "5d90fac25f3184aeb4b21d3e0b8f7cb65e5d40ddd713bf23ce168ee207033083", + "byte_count": 1891, + "status": 200 + } + } + ] + }, + { + "path": "/np6-325-cd/rtd_price_adders", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "RTDTimestamp", + "source_time": "2026-09-05 19:45:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders?page=1&size=1&dir=desc&sort=RTDTimestamp", + "retrieved_at": "2026-09-06 00:52:09.627054+00:00", + "sha256": "d5c698ae7aaefba422c2501b4b56d9a83f824392be48b91c8410289d6a952a0f", + "byte_count": 3647, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "RTDTimestamp", + "source_time": "2025-12-05 00:00:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders?page=1&size=1&dir=asc&sort=RTDTimestamp", + "retrieved_at": "2026-09-06 00:52:12.689338+00:00", + "sha256": "cd76f149d2532631576d913f386d1722656b4acf68554c3da1c4468a2afaf313", + "byte_count": 3635, + "status": 200 + } + } + ] + }, + { + "path": "/np6-326-cd/rt_price_sog", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-05", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:54:10.740664+00:00", + "sha256": "51ee024447556b34dcde108bc3e7463284540027102e70c347a09cfa283fc65c", + "byte_count": 1646, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-04-30", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:54:12.101640+00:00", + "sha256": "a8aeb19efea4ba2854c1539d405cb2d38443103de77561446c852a2c3a4e0152", + "byte_count": 1644, + "status": 200 + } + } + ] + }, + { + "path": "/np6-327-cd/lmp_sog_price_adders", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 19:50:22", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:16.605984+00:00", + "sha256": "fabee85fce554900b0762a3f718a27dd82ad5813a4ba701d43b658b9a613eb02", + "byte_count": 1957, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2025-12-05 00:10:17", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:17.704881+00:00", + "sha256": "71d0abe3ee25a38d713f075f8681397498fd3f4e19bee25e57f73334d36b0f0a", + "byte_count": 1957, + "status": 200 + } + } + ] + }, + { + "path": "/np6-328-cd/tot_as_res_cap", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 19:50:22", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:18.858780+00:00", + "sha256": "0be083d2c25fce0734e429c7b13acaa2b5e6558ff3ee26ef735eb78e37771d6e", + "byte_count": 2008, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2025-12-04 23:45:16", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:21.202013+00:00", + "sha256": "43d4146ac570b7178dd37fe5e5bd6fbbc695a1e6b29863df6e763dbb17ab0d67", + "byte_count": 2007, + "status": 200 + } + } + ] + }, + { + "path": "/np6-329-cd/rtd_ind_mcpc", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "RTDTimestamp", + "source_time": "2026-09-05 19:50:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc?page=1&size=1&dir=desc&sort=RTDTimestamp", + "retrieved_at": "2026-09-06 00:54:23.110226+00:00", + "sha256": "2fc6003d2e29d6f3f9e98ecb82b3a99a69f48d43119e3d599368668ea493f367", + "byte_count": 1890, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "RTDTimestamp", + "source_time": "2025-12-05 00:00:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc?page=1&size=1&dir=asc&sort=RTDTimestamp", + "retrieved_at": "2026-09-06 00:54:25.608954+00:00", + "sha256": "ac9bce41acecc91b9a2ca32ccf38c1ec96ae86e1008fad86bb1cd2d612941549", + "byte_count": 1892, + "status": 200 + } + } + ] + }, + { + "path": "/np6-331-cd/rt_clear_price_cap", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2026-09-05", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap?page=1&size=1&dir=desc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:54:27.338551+00:00", + "sha256": "61c9a8dcbd807e16cb5508ca8352cb72575eda7fbfa8094d73e0862c60384ab5", + "byte_count": 1386, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "source_time": "2025-12-04", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap?page=1&size=1&dir=asc&sort=deliveryDate", + "retrieved_at": "2026-09-06 00:54:29.347069+00:00", + "sha256": "fd33eb975daf9e9e1944b78a770f24a0de948024cb854cda6f6c5aa8b0116fba", + "byte_count": 1385, + "status": 200 + } + } + ] + }, + { + "path": "/np6-332-cd/rt_clear_price_cap_sced", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 19:50:22", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:31.500907+00:00", + "sha256": "6697089422c9ab7e9f1c15a42d455e64a118386d75802e5686bfc546e1d09733", + "byte_count": 1272, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2025-12-05 00:05:17", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:33.662959+00:00", + "sha256": "8efd55d9ba90daca12ad46ba693e4b3a5507b8e35d77c95f6ae2a580fdaae490", + "byte_count": 1270, + "status": 200 + } + } + ] + }, + { + "path": "/np6-345-cd/act_sys_load_by_wzn", + "installed_module": "/private/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 2, + "sort": "operatingDay", + "receipt": { + "retrieved_at": "2026-09-06 00:11:12.286973+00:00", + "byte_count": 2262, + "source_url": "https://api.ercot.com/api/public-reports/np6-345-cd/act_sys_load_by_wzn?operatingDayFrom=2026-09-04&operatingDayTo=2026-09-04&page=1&size=2&dir=desc&sort=operatingDay", + "status": 200, + "sha256": "e9b68e868a08ba0e04becd610fbbd781421f87545864d26b05f1ac234403cf13" + }, + "evidence_ref": "docs/evidence/installed-reports-receipts.json#/receipts/2" + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "operatingDay", + "receipt": { + "retrieved_at": "2026-09-06 00:11:14.396157+00:00", + "byte_count": 2098, + "source_url": "https://api.ercot.com/api/public-reports/np6-345-cd/act_sys_load_by_wzn?page=1&size=1&dir=asc&sort=operatingDay", + "status": 200, + "sha256": "061222a12fc005428f277f7692ff4e530e2177c2ff8e4fe8e3763426a32e41c7" + }, + "evidence_ref": "docs/evidence/installed-reports-receipts.json#/receipts/3" + } + ] + }, + { + "path": "/np6-346-cd/act_sys_load_by_fzn", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "operatingDay", + "source_time": "2026-09-04", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn?page=1&size=1&dir=desc&sort=operatingDay", + "retrieved_at": "2026-09-06 00:54:35.637907+00:00", + "sha256": "dc5832d9a14dc3ebf634cad1fcdcb34d7bcf955a102dd40b910cf7e698b31456", + "byte_count": 1584, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "operatingDay", + "source_time": "2023-12-11", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn?page=1&size=1&dir=asc&sort=operatingDay", + "retrieved_at": "2026-09-06 00:54:37.705613+00:00", + "sha256": "e174bfdd94814df13b850064adaae472f24e4fec341c438300feeb3d5c76dcfb", + "byte_count": 1582, + "status": 200 + } + } + ] + }, + { + "path": "/np6-787-cd/lmp_electrical_bus", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 19:50:22", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:41.210350+00:00", + "sha256": "971be657f656b4ee65923c5b24604ebf61cd9928e76da1fefee6d2cdb66ae041", + "byte_count": 1329, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 00:00:20", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:42.841971+00:00", + "sha256": "8d67cf729f4bc621cfedfbae330a51857165309c07c24f5fc162db1050c91ae5", + "byte_count": 1328, + "status": 200 + } + } + ] + }, + { + "path": "/np6-788-cd/lmp_node_zone_hub", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 19:50:22", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:44.122981+00:00", + "sha256": "812ead259540652cb94556c5382fd31c35cc185955d0977e1a7a1a292afe6ce8", + "byte_count": 1205, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 00:00:20", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:46.175864+00:00", + "sha256": "3737f8d532af0839401d68810857c84b4c80261377e0d876a5d763e2fad63a24", + "byte_count": 1206, + "status": 200 + } + } + ] + }, + { + "path": "/np6-86-cd/shdw_prices_bnd_trns_const", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 18:55:21", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:48.276483+00:00", + "sha256": "a56d0f58cc9348f746e2a354af30679aa7ed95259a7a9b91e5bb5aabf8c24f35", + "byte_count": 2699, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2023-12-11 14:00:24", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:50.518992+00:00", + "sha256": "890c8e8a29b30d9f42070f7fc64b510f45ce9fb0f53755c2c6ad030b4356996c", + "byte_count": 2676, + "status": 200 + } + } + ] + }, + { + "path": "/np6-905-cd/spp_node_zone_hub", + "installed_module": "/private/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 2, + "sort": "deliveryDate", + "receipt": { + "retrieved_at": "2026-09-06 00:11:08.089128+00:00", + "byte_count": 1711, + "source_url": "https://api.ercot.com/api/public-reports/np6-905-cd/spp_node_zone_hub?settlementPoint=HB_HOUSTON&deliveryDateFrom=2026-09-04&deliveryDateTo=2026-09-04&page=1&size=2&dir=desc&sort=deliveryDate", + "status": 200, + "sha256": "211a6808039b86dfefbdfcab99e8859cf83de61ab67d2da87bd4b4bc13545c6a" + }, + "evidence_ref": "docs/evidence/installed-reports-receipts.json#/receipts/0" + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "deliveryDate", + "receipt": { + "retrieved_at": "2026-09-06 00:11:10.314260+00:00", + "byte_count": 1605, + "source_url": "https://api.ercot.com/api/public-reports/np6-905-cd/spp_node_zone_hub?settlementPoint=HB_HOUSTON&page=1&size=1&dir=asc&sort=deliveryDate", + "status": 200, + "sha256": "b1b0c0845989e9ae6717beb8d093bfcedd9b433971703898429387be1d719a63" + }, + "evidence_ref": "docs/evidence/installed-reports-receipts.json#/receipts/1" + } + ] + }, + { + "path": "/np6-915-cd/sum_hdl_ldl", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-09-05 19:50:22", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl?page=1&size=1&dir=desc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:52.453587+00:00", + "sha256": "d344c266e527aa407fc376bcc0d0b7a5a1c3d4d8f1a452adeba6708f784f1657", + "byte_count": 1258, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "SCEDTimestamp", + "source_time": "2026-04-30 11:10:19", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl?page=1&size=1&dir=asc&sort=SCEDTimestamp", + "retrieved_at": "2026-09-06 00:54:54.529111+00:00", + "sha256": "54300b55e6200b9f3d3ed90e31681070b6aa6836347e05f2c71f163bd79658a9", + "byte_count": 1257, + "status": 200 + } + } + ] + }, + { + "path": "/np6-970-cd/rtd_lmp_node_zone_hub", + "installed_module": "/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "records": [ + { + "period": "current", + "status": "typed", + "rows": 1, + "sort": "RTDTimestamp", + "source_time": "2026-09-05 19:50:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub?page=1&size=1&dir=desc&sort=RTDTimestamp", + "retrieved_at": "2026-09-06 00:54:57.753274+00:00", + "sha256": "aa762cc522e3288d4304c9de4278cb11736f8725bb1d452cf29d2d9f567b7713", + "byte_count": 1836, + "status": 200 + } + }, + { + "period": "historical", + "status": "typed", + "rows": 1, + "sort": "RTDTimestamp", + "source_time": "2026-09-05 00:00:03", + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub?page=1&size=1&dir=asc&sort=RTDTimestamp", + "retrieved_at": "2026-09-06 00:54:59.847079+00:00", + "sha256": "14c5ac6ed0da26671f655b2d2767e4a90eee983721b3dd45c46d00b751e09fcb", + "byte_count": 1832, + "status": 200 + } + } + ] + } + ] +} diff --git a/docs/evidence/installed-rt-archives.json b/docs/evidence/installed-rt-archives.json new file mode 100644 index 00000000..01ddba28 --- /dev/null +++ b/docs/evidence/installed-rt-archives.json @@ -0,0 +1,58 @@ +{ + "installed_package": "/private/tmp/tinyercot-retrieval-wheel/lib/python3.14/site-packages/tinyercot/__init__.py", + "listing": { + "source_url": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=13061", + "retrieved_at": "2026-09-06 00:49:57.719070+00:00", + "sha256": "0c7866f25ce81543e62538522df8d1c6eda20a60ef9bcf37558255ab7cdb5a11", + "byte_count": 7812, + "status": 200 + }, + "samples": [ + { + "document": { + "document_id": "318479603", + "report_type_id": 13061, + "friendly_name": "RTMLZHBSPP_2010", + "published_at": "2013-06-14 14:07:18-05:00", + "byte_count": 1292145, + "security": "P" + }, + "download": { + "source_url": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=318479603&reportTypeId=13061", + "retrieved_at": "2026-09-06 00:26:46.768037+00:00", + "sha256": "c5bd52346cc6644abdf65dbf452060fef6dac40f4b79c151726f3d3c8c4c8fe0", + "byte_count": 1292145, + "status": 200 + }, + "initial_cache_hit": true, + "cache_reuse_verified": true, + "sheet": "Dec_1", + "typed_rows": 4, + "complete_file_iteration": false + }, + { + "document": { + "document_id": "1268443390", + "report_type_id": 13061, + "friendly_name": "RTMLZHBSPP_2026", + "published_at": "2026-08-30 08:07:44-05:00", + "byte_count": 9091870, + "security": "P" + }, + "download": { + "source_url": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=1268443390&reportTypeId=13061", + "retrieved_at": "2026-09-06 00:27:10.672048+00:00", + "sha256": "d2dd9f121dbcbdba370d4bc50f9652ff4e7d38987860b9e8fe454e65adc25238", + "byte_count": 9091870, + "status": 200 + }, + "initial_cache_hit": true, + "cache_reuse_verified": true, + "sheet": "Jan", + "typed_rows": 4, + "complete_file_iteration": false + } + ], + "authenticated_requests": 0, + "all_history_extraction": false +} diff --git a/docs/public-aggregates.md b/docs/public-aggregates.md new file mode 100644 index 00000000..115ef7ce --- /dev/null +++ b/docs/public-aggregates.md @@ -0,0 +1,82 @@ +# Anonymous outage and DC-tie aggregates + +The opt-in `tinyercot.public.aggregate_dashboards.AggregateDashboardClient` +adds `generation_outages()` and `dc_tie_flows()`. It inherits the existing +dashboard client's bounded transport, connection lifetime, and fuel-mix and +grid-condition methods. Each new method makes one logical anonymous capture +with bounded retries. It never requests historical dates or starts polling. + +```python +from tinyercot.public.aggregate_dashboards import AggregateDashboardClient + +with AggregateDashboardClient() as client: + outages = client.generation_outages() + ties = client.dc_tie_flows() + +print(outages.current[-1].row.dispatchable.unplanned) +print(ties.rows[-1].dcN, ties.rows[-1].currentFrequency) +``` + +Generation outages retain the original current/previous sections, day and +resource-type labels, source epoch keys, delivery timestamps, DST flags, and +Combined/Dispatchable/Renewable planned, unplanned, and total values. Source +totals and the `currentOutages` display value are retained without recalculation. +One captured response includes a rolling previous-six-day section; this is not +a date-selection adapter or a guarantee of retained history or complete days. + +DC-tie observations retain all four signed source flows and the public +aggregate frequency and inertia values returned alongside them. Negative flow +means import to ERCOT; positive flow means export. `currentFrequency` preserves +JSON numeric precision as Decimal. The observed integer fields remain strict +integers. Original offset-bearing timestamp, epoch, interval, and DST labels +remain available. + +Both decoders verify Texas offsets and epoch evidence, reject future rows +relative to source update time, and require increasing instants within each +section. Outage observations must belong to the source section's day labels. +Distinct fall-back offsets remain separate observations. They preserve source +DST labels without interpreting their meaning. No source nulls were observed +in these captures; nulls, missing fields, unknown categories, type drift, and +nonfinite values fail closed instead of being silently replaced or guessed. + +Snapshots expose the same original bytes, source update timestamp, UTC receipt, +HTTP status, hash, and caller-selected freshness check as other dashboards. +These website subsets cover GEN-546-UI and GEN-538-UI separately from Public +API data paths. They do not implement private telemetry, outage submissions, +individual-unit details, DC-tie schedules, or state-estimator APIs. Source +schemas outside the observed aggregate payloads remain unknown. + +## Primary source evidence + +ERCOT's [generation-outage dashboard](https://www.ercot.com/gridmktinfo/dashboards/generationoutages) +configures [`generation-outages.json`](https://www.ercot.com/api/1/services/read/dashboards/generation-outages.json). +Its description says the MW reductions include partial and full outages, +including storage, relative to seasonal maximum capability. It also explains +that submitted outage information can arrive after an event, and that extended +planned outages can become forced outages. A capture therefore does not prove +the information available at an earlier point in time. The page warns that +NP1-346-ER can differ; this adapter does not substitute for that report. + +ERCOT's [DC-tie dashboard](https://www.ercot.com/gridmktinfo/dashboards/dctieflows) +configures [`dc-tie-flows.json`](https://www.ercot.com/api/1/services/read/dashboards/dc-tie-flows.json). +The page supplies the import/export sign convention. Its chart labels identify +the East, Laredo VFT, North, and Railroad series. + +Two bounded anonymous captures on 2026-09-06 UTC established these models. +[Provenance](evidence/aggregate-dashboard-fixture-provenance.json) records the +full response hashes, retrieval timestamps, source URLs, compact fixture hashes, +and exact excerpt transformations. The outage fixture retains first/last two +rows per section plus all metadata. The DC-tie fixture retains first/last two +rows. Full response snapshots are not checked in. Offline tests cover strict +types, source drift, time/section contradictions, repeated DST hours, original +totals, and anonymous transport. + +An explicit installed-wheel probe is available: + +```bash +/absolute/venv/bin/python -I tools/probe_aggregate_dashboards.py --live --output /tmp/aggregate-receipts.json +``` + +It requires an isolated venv import, performs at most two anonymous attempts +with retries disabled, and saves only receipts, source update times, and typed +row counts. It does not load `.env`, authenticate, poll, or extract history. diff --git a/docs/public-dashboards.md b/docs/public-dashboards.md new file mode 100644 index 00000000..25291343 --- /dev/null +++ b/docs/public-dashboards.md @@ -0,0 +1,80 @@ +# Anonymous dashboard snapshots + +`tinyercot.public.dashboards.DashboardClient` adds two opt-in website captures: +fuel mix and Daily PRC with the current grid-condition status. Imports and +offline decoding require no credentials. Each method makes one logical GET +with the existing bounded retry, response-size, pacing, and request budgets. +There is no timer, date selection, or historical download operation. + +```python +from tinyercot.public.dashboards import DashboardClient + +with DashboardClient() as client: + fuel = client.fuel_mix() + grid = client.grid_conditions() + +print(fuel.rows[-1].generation.natural_gas) # Decimal MW +print(grid.current_condition.state) # Original ERCOT status label +print(grid.source_last_updated, grid.is_stale()) +``` + +Fuel mix exposes all eight observed fuel categories and keeps `monthlyCapacity` +separate from interval generation. Original signed storage values and numeric +precision remain intact. Day keys and offset-bearing timestamp keys are retained. +Daily PRC retains condition text, status, EEA/energy values, display PRC text, +source index, source epoch, and every returned PRC observation. It does not turn +source labels into a client-defined emergency-state classification. + +The decoder checks explicit offsets against America/Chicago. PRC epoch +milliseconds and local interval labels must agree with their timestamp, and +the condition epoch seconds must agree with the source update time. Both feeds +require strictly increasing observation instants, allowing distinct offsets +during the repeated fall hour. Source DST flags remain uninterpreted. + +Original bytes, source timestamps, retrieval timestamps, public URLs, HTTP +status, and response hashes remain available. `is_stale()` compares source +update time with capture time; its default ten-minute threshold is caller +policy, not an ERCOT update guarantee. Future timestamps are stale. Unknown +fields, missing fuel categories, nulls, numeric strings, booleans in number +fields, nonfinite values, and conflicting time evidence fail closed. New status +*strings* are retained without guessing their meaning. + +These are website source-family subsets, separate from the 243 observed Public +API data paths. They do not establish historical retention, complete-day +coverage, a latency SLA, historical condition-state schemas, generation outage +coverage, private resource telemetry, or the four-second ESR Public Data API. +The source may change or deny anonymous access; errors use the new public +exception hierarchy. Restricted and unavailable source families remain explicit +in the coverage inventory. + +## Source evidence and reproduction + +ERCOT's [fuel-mix page](https://www.ercot.com/gridmktinfo/dashboards/fuelmix) +directly configures +[`fuel-mix.json`](https://www.ercot.com/api/1/services/read/dashboards/fuel-mix.json). +ERCOT's [grid-conditions page](https://www.ercot.com/gridmktinfo/dashboards/gridconditions) +directly configures +[`daily-prc.json`](https://www.ercot.com/api/1/services/read/dashboards/daily-prc.json). +The latter page explains PRC as responsive resource capability available online +in real time. The adapter preserves this source series without calculating a +forecast or interpreting future reserve sufficiency. + +Two anonymous source captures on 2026-09-06 UTC established the explicit row +models. [Fixture provenance](evidence/dashboard-fixture-provenance.json) records +full-response hashes, retrieval times, public source URLs, fixture hashes, and +exact excerpt transformations. The compact fuel fixture retains first/last two +observations per day; the PRC fixture retains first/last two observations and +all current-condition fields. Numbers are serialized losslessly. Full snapshots +are not checked in. Offline tests mutate these fixtures to exercise type drift, +source-time conflicts, freshness, DST, access denial, and anonymous transport. + +For a deliberately small real installed-wheel validation: + +```bash +/absolute/venv/bin/python -I tools/probe_dashboards.py --live --output /tmp/dashboard-receipts.json +``` + +The probe rejects source-tree imports, requires an isolated venv interpreter, +limits the total budget to two attempts, disables retries, and saves receipts +and typed row counts. It neither loads `.env` nor uses ERCOT authentication. +It does not run in the default offline test suite. diff --git a/docs/public-metadata-task-note.md b/docs/public-metadata-task-note.md new file mode 100644 index 00000000..5b222e8b --- /dev/null +++ b/docs/public-metadata-task-note.md @@ -0,0 +1,106 @@ +# Metadata expansion task note + +PR #4 stacks on `feat/public-rt-load` at +`12d60654632ce5c47543ef5f3410ec55972c8471`. It adds 52 generated operations, +bringing typed installed-client retrieval to 56 unique paths of 243 observed +public data paths. The other 187 paths remain active work. The stable public +entry point is `products..`; existing imports and the three +legacy runtime files remain unchanged. + +The exact machine-readable index is +`docs/evidence/installed-registry-index.json`: 57 current requests across 56 +paths, 56 oldest-first requests across 56 paths. The extra current request is +an earlier DAM second page. Pagination is separate: two paths have live +multiple-page evidence; one RT selection completed two pages/two rows. The +new 52-path batch contributes no pagination or completeness claim. No full +history or complete annual file was extracted. + +Additional bounded scopes are metadata root/archive/bundle listings, four +anonymous rolling dashboards, RT annual listing/cached 2010 and 2026 decoding, +and current/oldest DME CSV decoding from captured ZIPs. Public retired-product +listings are available. One monthly bundle transfer was unsuccessful, so no +successful bundle download is claimed. Public BINARY documents and available +retired history remain active work. Secure, Certified, EWS, private participant +records and customer data stay restricted; hourly-load 2001 stays unavailable. +Authorized public authentication occurred; no restricted requests, paid access, +secret copying, forecaster computation, or bulk historical extraction occurred. + +## Local checks + +These working-tree commands passed: + +```sh +uv run python tools/generate_client.py --check +uv run python tools/generate_public.py --check +uv run --extra files pytest -q +uv build +uv pip install --python /tmp/tinyercot-typing-proof.fbtIin/venv/bin/python --no-deps --reinstall dist/tinyercot-0.2.2-py3-none-any.whl +uv run python tools/check_typing.py --python /tmp/tinyercot-typing-proof.fbtIin/venv/bin/python +git diff --cached --check +git diff d1daad25df42d3fff41f88b907d99ef325b970e0 -- tinyercot/__init__.py tinyercot/_client.py tinyercot/_generated.py +git check-ignore .env +``` + +The full suite returned **1259 passed, 1 skipped** on Python 3.14.0. The +installed PEP 561 proof verified 510 legacy methods, 1334 legacy row fields, +56 current endpoint/product facades, 498 current row fields, 847 filter fields, +live/archive/metadata contracts, and rejection of 64 invalid uses. The legacy +diff was empty. The credential file was ignored; its contents were never read +by offline validation or included in Git. + +Concurrent PR #5 work added untracked fixtures while checking the second +interpreter, causing an expected fixture-inventory mismatch. Final checks used +an exact copy of the staged PR #4 files, preserving that ongoing work: + +```sh +git checkout-index --all --prefix=/tmp/tinyercot-pr4-check.fjDuNo/ +cd /tmp/tinyercot-pr4-check.fjDuNo +/tmp/tinyercot-locked-wheel/bin/python -m pytest -q +/tmp/tinyercot-typing-proof.fbtIin/venv/bin/python -m pytest -q +/tmp/tinyercot-typing-proof.fbtIin/venv/bin/python -m ruff check tools tinyercot/catalog.py tinyercot/public tests +/tmp/tinyercot-typing-proof.fbtIin/venv/bin/python -m ruff format --check tools tinyercot/catalog.py tinyercot/public tests +/tmp/tinyercot-typing-proof.fbtIin/venv/bin/python tools/generate_client.py --check +/tmp/tinyercot-typing-proof.fbtIin/venv/bin/python tools/generate_public.py --check +``` + +Both interpreter suites passed **1259 tests, 1 skipped** (Python 3.11.14 and +3.14.0); Ruff lint passed and all 62 Python files were formatted. Both +generators matched their pinned outputs. Both separate test environments +needed the optional decoder installed first with +`uv pip install --python /tmp/tinyercot-locked-wheel/bin/python openpyxl==3.1.5` +and `uv pip install --python /tmp/tinyercot-typing-proof.fbtIin/venv/bin/python openpyxl==3.1.5`. +Google-style public docstrings document access, lifecycle, source times, +iteration, and failure contracts. Generated documentation follows the same +existing model conventions; no project license-header convention was invented. + +## Bounded installed evidence commands + +The three authenticated registry calls used an isolated installed wheel: + +```sh +/tmp/tinyercot-retrieval-wheel/bin/python -I tools/probe_registry.py --live --credentials-file /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.env --output /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence/installed-registry --start 0 --count 20 +/tmp/tinyercot-retrieval-wheel/bin/python -I tools/probe_registry.py --live --credentials-file /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.env --output /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence/installed-registry --start 20 --count 20 +/tmp/tinyercot-retrieval-wheel/bin/python -I tools/probe_registry.py --live --credentials-file /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.env --output /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence/installed-registry --start 40 --count 20 +/tmp/tinyercot-retrieval-wheel/bin/python -I tools/probe_dashboards.py --live --output /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence/installed-dashboards.json +/tmp/tinyercot-retrieval-wheel/bin/python -I tools/probe_aggregate_dashboards.py --live --output /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence/installed-aggregate-dashboards.json +/tmp/tinyercot-retrieval-wheel/bin/python -I tools/probe_rt_archives.py --live --output /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence/installed-rt-archives --source-evidence /Users/kevin/.treehouse/tinyercot-1bad13/1/tinyercot/.local-evidence +uv run python tools/index_public_evidence.py --registry .local-evidence/installed-registry +``` + +All required checks passed; receipts were indexed without repeating live calls. +[The archive task note](api-archive-installed-task-note.md) records its exact +commands and the optional bundle failure. No merge or no-mistakes action ran. +The next renewable/load/RUC batch already has source samples, and further +Public Reports disclosure discovery is active. Subsequent stacked PRs continue +the public/history objective without waiting for earlier merges. + +## CI smoke correction + +The first CI run passed generation, tests, lint, formatting and build, then +caught stale fixed coverage counts in `tests/wheel_smoke.py`, a standalone +script outside pytest discovery. The script now reconciles installed data-path +coverage with the installed registry and checks the new product facade. +`uv run ruff check tests/wheel_smoke.py` passed; both +`/tmp/tinyercot-typing-proof.fbtIin/venv/bin/python -I tests/wheel_smoke.py` and +`/tmp/tinyercot-locked-wheel/bin/python -I tests/wheel_smoke.py` passed using +installed wheels. This correction changes only validation and documentation. diff --git a/docs/public-metadata.md b/docs/public-metadata.md new file mode 100644 index 00000000..2fdbf831 --- /dev/null +++ b/docs/public-metadata.md @@ -0,0 +1,91 @@ +# Public metadata and generated retrieval + +The opt-in registry now has 56 typed Public Reports operations. Its 52 new +operations use the same `ReportsClient.page`, `iter_pages`, and `iter_rows` +contracts as the four previously delivered operations. Legacy runtime files +remain byte-identical. Importing metadata or generated products makes no +request and requires no credentials. + +```python +from tinyercot.public import Credentials, ReportsClient, products + +endpoint = products.np6_322_cd.sced_system_lambda +with ReportsClient(Credentials.from_env()) as client: + page = client.page(endpoint, size=1, sort="SCEDTimestamp", direction="desc") + for row in page.rows: + print(row) +``` + +Use the exact field/filter names in the generated product facade. Date-time +query fields retain ERCOT's naive `yyyy-MM-ddTH24:mm:ss` format; timezone-aware +or subsecond query values are rejected. This does not infer UTC for ambiguous +market timestamps. Source numeric values use Decimal where declared numeric; +string identifiers remain strings. Explicitly observed nulls are accepted only +for source-declared fields and every field stays required. Unknown types, +unobserved nullability, missing fields, and changed schemas fail closed. + +## Sources and reproduction + +The current query pin is ERCOT's [Public Reports OpenAPI export](https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview), +SHA-256 `b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8`. +The authenticated public [product root](https://api.ercot.com/api/public-reports/) +returned 116 products (97 DATA, 19 BINARY) and 242 artifact paths. Both audience +and security classification must explicitly say Public; neither authentication +nor an endpoint link grants entitlement to restricted information. + +`tools/observe_catalog.py` saves bounded response/receipt pairs, with at most +20 product identities and an explicit request budget per invocation. It never +updates generation inputs. `tools/register_public_batch.py` cross-checks the +saved public product root, exact OpenAPI bytes, response receipts, field types, +and current/historical observations. It outputs reviewable projections and an +operation-state report. `tools/generate_public.py` reads only pinned local +inputs and generates models, filter TypedDicts, endpoint registry, and product +facades. Missing or ineligible evidence cannot generate a row model. + +```sh +uv run python -m tools.register_public_batch --evidence .local-evidence/catalog --spec /path/to/explorer-export.json --output .local-evidence/projected +uv run python tools/generate_public.py --check +uv run python tools/generate_client.py --check +``` + +The checked-in current contracts retain compact field/query projections, +source hashes, public product identity, and receipts. Two one-row response +fixtures per new path support independent offline decoding. Fixtures in +`tests/fixtures/public/batch/` add one terminal newline to the exact captured +response; removing that single newline reproduces the original receipt hash. +The root fixture uses the same reversible transformation. No authorization +headers, tokens, credential values, or private responses are retained. + +## Exact evidence limits + +[The machine-readable installed index](evidence/installed-registry-index.json) +contains all 56 unique generated paths and their receipt references. It records +57 current requests across 56 paths (including an earlier DAM second page), +and 56 oldest-first requests across 56 paths. The new 52-path batch contributes +104 one-row requests. All have successful typed decoding through an isolated +installed wheel. The index builder is offline and makes no repeat requests. + +Pagination evidence is separate: two API paths have live multiple-page +retrieval, and one RT selection completed its two pages/two rows. The new +52-path batch adds no live pagination or completeness proof. Complete page +iteration, failure budgets, and annual multi-worksheet iteration also have +offline mocked tests. No complete history or annual extraction was performed. +Oldest-first rows identify available observations within source retention and +filters; they do not establish every historical schema epoch. + +Public metadata, archive documents and monthly bundles have typed identity and +file-result contracts separate from row models; see [archive evidence](api-archive-installed-task-note.md). +Public BINARY content is excluded from row generation, while public document +retrieval remains active work. Retired total-AS-offer and SASM products retain +available archive listings even when source metadata still says Active. +The 2001 hourly-load gap remains unavailable. Secure, Certified, EWS, private +telemetry/bids/COP/awards and customer/participant settlement data remain +restricted. Delayed disclosures explicitly classified Public are a separate +public coverage category. + +The other 187 observed data paths and remaining public document/history +families remain active work for subsequent stacked PRs. Website fuel mix, +PRC, outage and DC-tie snapshots, RT annual files, and DME document decoding +have separate evidence; they do not increase the 243-path API numerator. +Authorized public authentication occurred. No restricted request, paid access, +forecaster computation, secret copying, or historical bulk extraction occurred. diff --git a/docs/public-retrieval.md b/docs/public-retrieval.md index 1dad15bf..95a1bd1b 100644 --- a/docs/public-retrieval.md +++ b/docs/public-retrieval.md @@ -7,10 +7,10 @@ Use `coverage()` for retrieval scope states. ## Coverage and evidence On 2026-09-05/06 UTC isolated installed wheels retrieved and decoded public data. -Generated typed API coverage is **4 operations in 4 products**: NP4-190-CD, -NP4-188-CD, NP6-905-CD, and NP6-345-CD. PR #2 established the first two DAM -contracts; this iteration adds RT settlement prices and weather-zone actual load -through a shared registry and retrieval client. +Generated typed API coverage is **56 operations**, each checked through an +installed wheel with current and oldest-first source requests. PRs #2–3 +established four contracts; the [metadata batch](public-metadata.md) adds 52 +through reusable product/artifact discovery and generation. The denominator is **243 observed public data paths in 98 product namespaces** (242 public-reports paths and one public-data ESR path). This is a bounded vertical slice, not broad typed coverage. The legacy 102 endpoints do not add @@ -25,15 +25,17 @@ Public Data API. A namespace count does not establish an EMIL product census. | New typed installed-client current fetch | NP6-905-CD HB_HOUSTON RT prices and NP6-345-CD weather-zone load: two rows each for 2026-09-04. | | New typed installed-client historical fetch | One oldest-first row per new endpoint, both dated 2023-12-11. These dates establish observations, not complete retention. | | Complete bounded installed-client query | Two RT rows for HB_HOUSTON, 2026-09-04, hour 1, intervals 1–2, retrieved across two one-row pages with matching totals. | -| Real source retrieval only | NP4-190-CD product metadata, retained as a fixture. This is not an implemented product-metadata method. | +| Public metadata | `MetadataClient` retrieves product/artifact identities, preserving access and lifecycle separately from row schema. The installed root lists 116 products and 242 artifacts. | | Fixture-only behavior | Rate limits, transport retries, expired tokens, 401/403, malformed JSON/ZIP/XLSX, cache mutation, repeated pages, DST transitions. These faults were simulated, not induced on ERCOT. | -| Deferred schema | The other 239 observed data paths. Stage 0 recorded 40 missing and 203 unverified cached schemas. Current field evidence verifies four endpoints. No guessed raw or typed models. | +| Pending schema | The other 187 observed data paths remain active coverage work. Stage 0 recorded 40 missing and 203 unverified cached schemas. Current source evidence verifies 56 endpoints. No guessed raw or typed models. | | Restricted | Secure, Certified, EWS, private telemetry, bids/COP/awards, participant settlements and customer data. No requests. | -| Unavailable | Retired total-AS-offer and SASM sources and the unavailable hourly-load 2001 year, as recorded in the audit. | +| Retired | Total-AS-offer and SASM new publication ended. Installed archive listings verify available public history; first-page listings do not establish full document or row retrieval. | +| Unavailable | Hourly-load 2001, as explicitly recorded by ERCOT. One bounded 2018 DAM bundle attempt was unsuccessful; other public bundle/history access remains active work. | -Only two selected annual files were downloaded. Each was retrieved once during -source discovery and once through the installed adapter. Later uses reuse a -hash-verified cache. No all-year iteration or bulk historical extraction ran. +The first DAM milestone downloaded two selected annual files. This expansion +adds two selected RT annual files and two small DME documents; installed decoding +reuses verified source captures. No all-year iteration or bulk historical +extraction ran. See [API archives](api-archives.md) and [RT files](rt-archives.md). Authorized Public API authentication did occur in this milestone. No credential or token values were retained in evidence, fixtures, logs, source, or PR text. @@ -44,7 +46,7 @@ No adapter provides an as-of vintage, revision merge, or complete-year claim. Typed installed-client retrieval means generated or explicit Pydantic row decoding. The wheel now separately includes PEP 561 metadata. An isolated mypy proof checks all 510 legacy method return contracts, all 1,334 legacy row fields, new public -row/filter/iterator contracts, and rejection of four invalid uses. Legacy +row/filter/iterator contracts, and rejection of invalid uses. Legacy runtime files remain byte-identical; companion stubs expose their existing types. ## Use annual files diff --git a/docs/rt-archives.md b/docs/rt-archives.md new file mode 100644 index 00000000..11ea0ceb --- /dev/null +++ b/docs/rt-archives.md @@ -0,0 +1,60 @@ +# Public RT annual archives + +`tinyercot.public.archive_reports` adds anonymous listing, receipt-verified ZIP +downloads, and typed streaming rows for **NP6-785-ER / report 13061**. ERCOT +identifies this product as public in its +[primary product metadata](https://www.ercot.com/mp/data-products/data-product-details?id=np6-785-er). +The adapter uses the website's public `IceDocListJsonWS` listing and +`mirDownload` routes. It never uses EWS or credential headers. + +```python +from contextlib import closing +from pathlib import Path +from tinyercot.public.archive_reports import RTArchiveClient, iter_rt_archive + +with RTArchiveClient() as client: + documents, receipt = client.archives() + document = next(d for d in documents if d.friendly_name == "RTMLZHBSPP_2010") + download = client.download(document, cache=Path(".ercot-cache")) + with closing(iter_rt_archive(download, max_rows=None, max_scan_rows=None)) as rows: + for record in rows: + process(record.row) # Caller-defined consumer. +``` + +The default row limit is 1,000. Reaching a row or scan budget raises explicitly; +None enables complete iteration through the selected file, including all its +worksheets. Source duplicates and ordering are retained. This does not establish +complete annual interval coverage or historical revisions. Source dates, hours, +quarter-hour intervals, and repeated-hour flags remain separate; UTC intervals +are not inferred. A changed header or unsupported cell type fails explicitly. +Empty worksheets must still carry the verified header. + +On 2026-09-06 UTC, anonymous discovery fetched one listing and exactly two +selected files: the 1,292,145-byte 2010 archive and the 9,091,870-byte 2026 +archive. Both have the same seven-column schema. Only the first few rows and +worksheet metadata were inspected; no full-year row extraction ran. The checked-in +`tests/fixtures/public/rt-archive-excerpt.json` contains the source receipts, +listing records, member/sheet names, exact headers, and three source rows per +file. Full ZIPs remain ignored local evidence. Other years are listed but were +not retrieved or separately validated. Matching schema is required on every +selected worksheet; older or future incompatible schema epochs remain unsupported. + +Offline tests build tiny workbooks from those recorded cells and cover complete +two-sheet iteration, cache reuse/mutation, nonpublic listings, unlisted documents, +schema drift, invalid cell types/ranges, requested-sheet absence, and budgets. +The independent installed-wheel probe is explicitly opt-in: + +```bash +/absolute/wheel-venv/bin/python -I tools/probe_rt_archives.py --live --output /absolute/evidence/rt-archives --source-evidence /absolute/discovery-evidence +``` + +That command fetches a fresh public listing, seeds the isolated cache from the +two existing discovery ZIPs and original receipts after checking hashes and byte +counts, decodes four typed rows per file, and verifies cache reuse. The installed +client validates each receipt against the new listing before decoding. This proves +installed typed decoding and cache reuse, not a repeated installed file download. +It is never invoked by the offline suite. + +This adapter adds one narrow MIS/archive source, not REST endpoint coverage. +Restricted, retired, unavailable, and unknown products remain outside this +adapter. It makes no authenticated request and performs no bulk history traversal. diff --git a/tests/fixtures/public/api-archive-excerpt.json b/tests/fixtures/public/api-archive-excerpt.json new file mode 100644 index 00000000..b62b8227 --- /dev/null +++ b/tests/fixtures/public/api-archive-excerpt.json @@ -0,0 +1,115 @@ +{ + "source_spec_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "source_spec_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "root_receipt": { + "source_url": "https://api.ercot.com/api/public-reports/", + "retrieved_at": "2026-09-06 00:28:10.305638+00:00", + "sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38", + "byte_count": 204591, + "status": 200 + }, + "product": { + "emilId": "NP3-988-ER", + "name": "Resource Decision-Making Entity List", + "description": "Daily Resource Decision-Making Entity List containing the decision-making entities for each Resource.", + "status": "Active", + "reportTypeId": 10036, + "audience": "Public", + "generationFrequency": "Chron - Daily", + "securityClassification": "Public", + "lastUpdated": "2025-12-05", + "firstRun": "2010-12-01", + "eceii": "", + "channel": "Public,EWS", + "userGuide": null, + "postingType": "Report", + "market": "Nodal", + "extractSubscriber": "", + "xsdName": "", + "misPostingLocation": "", + "certificateRole": "", + "fileType": "csv", + "ddlName": "", + "misDisplayDuration": 31, + "archiveDuration": 2555, + "notificationType": "", + "contentType": "BINARY", + "downloadLimit": 1000, + "lastPostDatetime": "2026-09-05T05:02:43", + "bundle": 1, + "protocolRules": { + "NP3.2.5(10)": "https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(10)" + }, + "artifacts": [], + "_links": { + "self": { + "href": "https://api.ercot.com/api/public-reports/np3-988-er" + }, + "parent": { + "href": "https://api.ercot.com/api/public-reports" + }, + "archive": { + "href": "https://api.ercot.com/api/public-reports/archive/np3-988-er" + }, + "bundle": { + "href": "https://api.ercot.com/api/public-reports/bundle/np3-988-er" + } + } + }, + "archive_receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er", + "retrieved_at": "2026-09-06 00:36:49.025821+00:00", + "sha256": "fb7e721472adabcd6850e71c096f29eff591f97811425835879fc84f3de39cf7", + "byte_count": 59354, + "status": 200 + }, + "archive_excerpt": { + "_meta": { + "totalRecords": 278, + "pageSize": 1000, + "totalPages": 1, + "currentPage": 1, + "query": { + "parameterCount": 0, + "parameters": {}, + "sortedBy": "postDatetime: DESC" + } + }, + "product": { + "emilId": "NP3-988-ER", + "name": "Resource Decision-Making Entity List", + "reportTypeId": 10036 + }, + "archives": [ + { + "docId": 1270779234, + "friendlyName": "ResDMEList_05092026", + "postDatetime": "2026-09-05T05:02:43.000", + "_links": { + "endpoint": { + "href": "https://api.ercot.com/api/public-reports/archive/np3-988-er?download=1270779234" + } + } + }, + { + "docId": 1270379615, + "friendlyName": "ResDMEList_04092026", + "postDatetime": "2026-09-04T05:01:01.000", + "_links": { + "endpoint": { + "href": "https://api.ercot.com/api/public-reports/archive/np3-988-er?download=1270379615" + } + } + } + ], + "_links": { + "self": { + "href": "https://api.ercot.com/api/public-reports/archive/np3-988-er" + }, + "parent": { + "href": "https://api.ercot.com/api/public-reports" + } + } + }, + "transformation": "One product from the public root and first two archive entries. Source metadata counters and all retained field values remain unchanged. Tests adjust count to two only in synthetic responses." +} diff --git a/tests/fixtures/public/api-bundle-excerpt.json b/tests/fixtures/public/api-bundle-excerpt.json new file mode 100644 index 00000000..e925eb77 --- /dev/null +++ b/tests/fixtures/public/api-bundle-excerpt.json @@ -0,0 +1,126 @@ +{ + "product": { + "emilId": "NP4-190-CD", + "name": "DAM Settlement Point Prices", + "description": "The Settlement Point Prices for all Resource Nodes, Load Zones, and Trading Hubs from the Day-Ahead Market.", + "status": "Active", + "reportTypeId": 12331, + "audience": "Public", + "generationFrequency": "Event - Per DAM Run", + "securityClassification": "Public", + "lastUpdated": "2024-07-10", + "firstRun": "2010-11-29", + "eceii": "", + "channel": "Public,EWS,Data Portal", + "userGuide": null, + "postingType": "Report", + "market": "Nodal", + "extractSubscriber": "", + "xsdName": "Current Day Reports XSD", + "misPostingLocation": "", + "certificateRole": "", + "fileType": "zip,csv,xml", + "ddlName": "", + "misDisplayDuration": 31, + "archiveDuration": 2555, + "notificationType": "", + "contentType": "DATA", + "downloadLimit": 500, + "lastPostDatetime": "2026-09-05T12:32:38", + "bundle": 1, + "protocolRules": { + "NP4.5.3(2)(b)": "https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(b)" + }, + "artifacts": [ + { + "reportTypeId": 12331, + "displayName": "DAM Settlement Point Prices", + "_links": { + "endpoint": { + "href": "https://api.ercot.com/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices" + } + } + } + ], + "_links": { + "self": { + "href": "https://api.ercot.com/api/public-reports/np4-190-cd" + }, + "parent": { + "href": "https://api.ercot.com/api/public-reports" + }, + "archive": { + "href": "https://api.ercot.com/api/public-reports/archive/np4-190-cd" + }, + "bundle": { + "href": "https://api.ercot.com/api/public-reports/bundle/np4-190-cd" + } + } + }, + "bundle_excerpt": { + "_meta": { + "totalRecords": 103, + "pageSize": 1000, + "totalPages": 1, + "currentPage": 1, + "query": { + "parameterCount": 0, + "parameters": {}, + "sortedBy": "postDatetime: DESC" + } + }, + "product": { + "emilId": "NP4-190-CD", + "name": "DAM Settlement Point Prices", + "reportTypeId": 12331 + }, + "bundles": [ + { + "docId": -1257192853, + "friendlyName": "DAMSPNP4190_2026-08", + "postDatetime": "2026-08-31T23:59:59.000", + "_links": { + "endpoint": { + "href": "https://api.ercot.com/api/public-reports/bundle/np4-190-cd?download=-1257192853" + } + } + }, + { + "docId": -1233594477, + "friendlyName": "DAMSPNP4190_2026-06", + "postDatetime": "2026-06-30T23:59:59.000", + "_links": { + "endpoint": { + "href": "https://api.ercot.com/api/public-reports/bundle/np4-190-cd?download=-1233594477" + } + } + }, + { + "docId": -593019152, + "friendlyName": "DAMSPNP4190_2018-01", + "postDatetime": "2018-01-31T23:59:59.000", + "_links": { + "endpoint": { + "href": "https://api.ercot.com/api/public-reports/bundle/np4-190-cd?download=-593019152" + } + } + } + ], + "_links": { + "self": { + "href": "https://api.ercot.com/api/public-reports/bundle/np4-190-cd" + }, + "parent": { + "href": "https://api.ercot.com/api/public-reports" + } + } + }, + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/bundle/np4-190-cd", + "retrieved_at": "2026-09-06 00:45:59.453486+00:00", + "sha256": "c8f081661149de29141e7d4cf1431d11d0e6739951f4452f0536b3261c3aef47", + "byte_count": 22196, + "status": 200 + }, + "transformation": "First two and final source bundle records, without altering source field values or pagination counters." +} diff --git a/tests/fixtures/public/batch/gen-55-cd--hrly_rt_load_fcast_actual--current.json b/tests/fixtures/public/batch/gen-55-cd--hrly_rt_load_fcast_actual--current.json new file mode 100644 index 00000000..54b55dd2 --- /dev/null +++ b/tests/fixtures/public/batch/gen-55-cd--hrly_rt_load_fcast_actual--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":266127,"pageSize":1,"totalPages":266127,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"hrly_rt_load_fcast_actual","reportDisplayName":"Hourly Real-Time Load vs. Actual Report","reportId":"13499","reportEMIL":"GEN-55-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"currentDayFcast","label":"Current Day Forecast","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"dayAheadFcast","label":"Day Ahead Forecast","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"actualLoad","label":"Actual Load","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"dayAheadHSL","label":"Day Ahead HSL","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"currentDayHSL","label":"Current Day HSL","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06",1,63314.2292,63314.2292,null,89854.7,null,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual"},"parent":{"href":"https://api.ercot.com/api/public-reports/gen-55-cd"}}} diff --git a/tests/fixtures/public/batch/gen-55-cd--hrly_rt_load_fcast_actual--historical.json b/tests/fixtures/public/batch/gen-55-cd--hrly_rt_load_fcast_actual--historical.json new file mode 100644 index 00000000..3e1980f3 --- /dev/null +++ b/tests/fixtures/public/batch/gen-55-cd--hrly_rt_load_fcast_actual--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":266127,"pageSize":1,"totalPages":266127,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"hrly_rt_load_fcast_actual","reportDisplayName":"Hourly Real-Time Load vs. Actual Report","reportId":"13499","reportEMIL":"GEN-55-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"currentDayFcast","label":"Current Day Forecast","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"dayAheadFcast","label":"Day Ahead Forecast","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"actualLoad","label":"Actual Load","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"dayAheadHSL","label":"Day Ahead HSL","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"currentDayHSL","label":"Current Day HSL","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-02-25",24,46276.4192,46596.5797,46924.93,70465.6,67332.9,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual"},"parent":{"href":"https://api.ercot.com/api/public-reports/gen-55-cd"}}} diff --git a/tests/fixtures/public/batch/np1-302--as_obligation--current.json b/tests/fixtures/public/batch/np1-302--as_obligation--current.json new file mode 100644 index 00000000..e9f8671c --- /dev/null +++ b/tests/fixtures/public/batch/np1-302--as_obligation--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":421329,"pageSize":1,"totalPages":421329,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"as_obligation","reportDisplayName":"Ancillary Service Obligations Report","reportId":"10039","reportEMIL":"NP1-302","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"qseName","label":"QSE Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"REGUPOblAdvisory","label":"Reg Up Obligation Advisory","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"REGDNOblAdvisory","label":"Reg Down Obligation Advisory","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RRSOblAdvisory","label":"RRS Obligation Advisory","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"NSPINOblAdvisory","label":"NSPIN Obligation Advisory","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ECRSOblAdvisory","label":"ECRS Obligation Advisory","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"REGUPOblFinal","label":"Reg Up Obligation Final","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"REGDNOblFinal","label":"Reg Down Obligation Final","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RRSOblFinal","label":"RRS Obligation Final","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"NSPINOblFinal","label":"NSPIN Obligation Final","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ECRSOblFinal","label":"ECRS Obligation Final","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-03-09","01:00","QACCEN",0.08245,0.08245,0.64634,0.30603,0.167,0.08243,0.08245,0.64629,0.95247,0.167]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np1-302/as_obligation"},"parent":{"href":"https://api.ercot.com/api/public-reports/np1-302"}}} diff --git a/tests/fixtures/public/batch/np1-302--as_obligation--historical.json b/tests/fixtures/public/batch/np1-302--as_obligation--historical.json new file mode 100644 index 00000000..5ca5740c --- /dev/null +++ b/tests/fixtures/public/batch/np1-302--as_obligation--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":421329,"pageSize":1,"totalPages":421329,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"as_obligation","reportDisplayName":"Ancillary Service Obligations Report","reportId":"10039","reportEMIL":"NP1-302","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"qseName","label":"QSE Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"REGUPOblAdvisory","label":"Reg Up Obligation Advisory","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"REGDNOblAdvisory","label":"Reg Down Obligation Advisory","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RRSOblAdvisory","label":"RRS Obligation Advisory","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"NSPINOblAdvisory","label":"NSPIN Obligation Advisory","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ECRSOblAdvisory","label":"ECRS Obligation Advisory","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"REGUPOblFinal","label":"Reg Up Obligation Final","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"REGDNOblFinal","label":"Reg Down Obligation Final","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RRSOblFinal","label":"RRS Obligation Final","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"NSPINOblFinal","label":"NSPIN Obligation Final","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ECRSOblFinal","label":"ECRS Obligation Final","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2025-12-05","24:00","QYENTA",0.00374,0.0029,0.03289,0.02517,0.00969,0.0,0.0,0.0,0.0,0.0]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np1-302/as_obligation"},"parent":{"href":"https://api.ercot.com/api/public-reports/np1-302"}}} diff --git a/tests/fixtures/public/batch/np3-161-cd--7d_plus_avail_res_poc_margin--current.json b/tests/fixtures/public/batch/np3-161-cd--7d_plus_avail_res_poc_margin--current.json new file mode 100644 index 00000000..c76e5716 --- /dev/null +++ b/tests/fixtures/public/batch/np3-161-cd--7d_plus_avail_res_poc_margin--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":262080,"pageSize":1,"totalPages":262080,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"7d_plus_avail_res_poc_margin","reportDisplayName":"Available Resource Planned Outage Capacity Margin_7 Day Plus","reportId":"22470","reportEMIL":"NP3-161-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"operatingDate","label":"Operating Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"nonIRRNonPUN","label":"Resource POL (Non-IRR, Non-PUN)","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ESR","label":"Resource POL (ESR)","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdNonIRRNonPUN","label":"Aggregate Approved Resource POL (Non-IRR, Non-PUN)","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdNonIRRNonPUN","label":"Aggregate Received Resource POL (Non-IRR, Non-PUN)","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"IRR","label":"Resource POL (IRR)","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdIRR","label":"Aggregate Approved Resource POL (IRR)","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdIRR","label":"Aggregate Received Resource POL (IRR)","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdESR","label":"Aggregate Approved Resource POL (ESR)","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdESR","label":"Aggregate Received Resource POL (ESR)","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T18:00:08","2027-01-15",5082.0,872.0,772.0,0.0,3519.0,0.0,257.0,0.0,0.0]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-161-cd"}}} diff --git a/tests/fixtures/public/batch/np3-161-cd--7d_plus_avail_res_poc_margin--historical.json b/tests/fixtures/public/batch/np3-161-cd--7d_plus_avail_res_poc_margin--historical.json new file mode 100644 index 00000000..c72c2f22 --- /dev/null +++ b/tests/fixtures/public/batch/np3-161-cd--7d_plus_avail_res_poc_margin--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":262080,"pageSize":1,"totalPages":262080,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"7d_plus_avail_res_poc_margin","reportDisplayName":"Available Resource Planned Outage Capacity Margin_7 Day Plus","reportId":"22470","reportEMIL":"NP3-161-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"operatingDate","label":"Operating Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"nonIRRNonPUN","label":"Resource POL (Non-IRR, Non-PUN)","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ESR","label":"Resource POL (ESR)","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdNonIRRNonPUN","label":"Aggregate Approved Resource POL (Non-IRR, Non-PUN)","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdNonIRRNonPUN","label":"Aggregate Received Resource POL (Non-IRR, Non-PUN)","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"IRR","label":"Resource POL (IRR)","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdIRR","label":"Aggregate Approved Resource POL (IRR)","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdIRR","label":"Aggregate Received Resource POL (IRR)","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdESR","label":"Aggregate Approved Resource POL (ESR)","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdESR","label":"Aggregate Received Resource POL (ESR)","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-06-25T18:00:07","2026-07-02",2216.0,0.0,30.0,0.0,3519.0,0.0,0.0,0.0,0.0]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-161-cd"}}} diff --git a/tests/fixtures/public/batch/np3-162-cd--7d_avail_res_poc_margin--current.json b/tests/fixtures/public/batch/np3-162-cd--7d_avail_res_poc_margin--current.json new file mode 100644 index 00000000..ab43c4a1 --- /dev/null +++ b/tests/fixtures/public/batch/np3-162-cd--7d_avail_res_poc_margin--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":290640,"pageSize":1,"totalPages":290640,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"7d_avail_res_poc_margin","reportDisplayName":"Available Resource Planned Outage Capacity Margin_7 Day","reportId":"22469","reportEMIL":"NP3-162-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"operatingDate","label":"Operating Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"nonIrrNonPun","label":"Maximum Daily Resource POL","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdNonIRRNonPUN","label":"Aggregate Approved Resource POL (Non-IRR, Non-PUN)","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdNonIRRNonPUN","label":"Aggregate Received Resource POL (Non-IRR, Non-PUN)","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"IRR","label":"Maximum Daily Resource POL (IRR)","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdIRR","label":"Aggregate Approved Resource POL (IRR)","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdIRR","label":"Aggregate Received Resource POL (IRR)","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ESR","label":"Maximum Daily Resource POL (ESR)","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdESR","label":"Aggregate Approved Resource POL (ESR)","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdESR","label":"Aggregate Received Resource POL (ESR)","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":13,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T19:05:03","2026-09-12",18,11273.0,148.0,0.0,3519.0,58.0,0.0,872.0,0.0,0.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-162-cd"}}} diff --git a/tests/fixtures/public/batch/np3-162-cd--7d_avail_res_poc_margin--historical.json b/tests/fixtures/public/batch/np3-162-cd--7d_avail_res_poc_margin--historical.json new file mode 100644 index 00000000..d700c058 --- /dev/null +++ b/tests/fixtures/public/batch/np3-162-cd--7d_avail_res_poc_margin--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":290640,"pageSize":1,"totalPages":290640,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"7d_avail_res_poc_margin","reportDisplayName":"Available Resource Planned Outage Capacity Margin_7 Day","reportId":"22469","reportEMIL":"NP3-162-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"operatingDate","label":"Operating Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"nonIrrNonPun","label":"Maximum Daily Resource POL","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdNonIRRNonPUN","label":"Aggregate Approved Resource POL (Non-IRR, Non-PUN)","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdNonIRRNonPUN","label":"Aggregate Received Resource POL (Non-IRR, Non-PUN)","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"IRR","label":"Maximum Daily Resource POL (IRR)","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdIRR","label":"Aggregate Approved Resource POL (IRR)","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdIRR","label":"Aggregate Received Resource POL (IRR)","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ESR","label":"Maximum Daily Resource POL (ESR)","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggApprvdESR","label":"Aggregate Approved Resource POL (ESR)","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"aggRcvdESR","label":"Aggregate Received Resource POL (ESR)","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":13,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-06-25T17:05:03","2026-06-25",17,41315.0,30.0,0.0,3519.0,159.0,0.0,0.0,100.0,0.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-162-cd"}}} diff --git a/tests/fixtures/public/batch/np3-233-cd--hourly_res_outage_cap--current.json b/tests/fixtures/public/batch/np3-233-cd--hourly_res_outage_cap--current.json new file mode 100644 index 00000000..1210ee28 --- /dev/null +++ b/tests/fixtures/public/batch/np3-233-cd--hourly_res_outage_cap--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":4602408,"pageSize":1,"totalPages":4602408,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"operatingDate: DESC"}},"report":{"reportName":"hourly_res_outage_cap","reportDisplayName":"Hourly Resource Outage Capacity","reportId":"13103","reportEMIL":"NP3-233-CD","downloadLimit":2000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"operatingDate","label":"Operating Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalResourceMWZoneSouth","label":"Total Resource MW Zone South","cardinality":4,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalResourceMWZoneNorth","label":"Total Resource MW Zone North","cardinality":5,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalResourceMWZoneWest","label":"Total Resource MW Zone West","cardinality":6,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalResourceMWZoneHouston","label":"Total Resource MW Zone Houston","cardinality":7,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalIRRMWZoneSouth","label":"Total IRR MW Zone South","cardinality":8,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalIRRMWZoneNorth","label":"Total IRR MW Zone North","cardinality":9,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalIRRMWZoneWest","label":"Total IRR MW Zone West","cardinality":10,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalIRRMWZoneHouston","label":"Total IRR MW Zone Houston","cardinality":11,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalNewEquipResourceMWZoneSouth","label":"Total New Equipment Resource MW Zone South","cardinality":12,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalNewEquipResourceMWZoneNorth","label":"Total New Equipment Resource MW Zone North","cardinality":13,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalNewEquipResourceMWZoneWest","label":"Total New Equipment Resource MW Zone West","cardinality":14,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalNewEquipResourceMWZoneHouston","label":"Total New Equipment Resource MW Zone Houston","cardinality":15,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T01:00:47","2026-09-12",1,1549,1979,135,904,663,701,1975,22,694,1678,200,611]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-233-cd"}}} diff --git a/tests/fixtures/public/batch/np3-233-cd--hourly_res_outage_cap--historical.json b/tests/fixtures/public/batch/np3-233-cd--hourly_res_outage_cap--historical.json new file mode 100644 index 00000000..028b9659 --- /dev/null +++ b/tests/fixtures/public/batch/np3-233-cd--hourly_res_outage_cap--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":4602408,"pageSize":1,"totalPages":4602408,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"operatingDate: ASC"}},"report":{"reportName":"hourly_res_outage_cap","reportDisplayName":"Hourly Resource Outage Capacity","reportId":"13103","reportEMIL":"NP3-233-CD","downloadLimit":2000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"operatingDate","label":"Operating Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalResourceMWZoneSouth","label":"Total Resource MW Zone South","cardinality":4,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalResourceMWZoneNorth","label":"Total Resource MW Zone North","cardinality":5,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalResourceMWZoneWest","label":"Total Resource MW Zone West","cardinality":6,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalResourceMWZoneHouston","label":"Total Resource MW Zone Houston","cardinality":7,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalIRRMWZoneSouth","label":"Total IRR MW Zone South","cardinality":8,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalIRRMWZoneNorth","label":"Total IRR MW Zone North","cardinality":9,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalIRRMWZoneWest","label":"Total IRR MW Zone West","cardinality":10,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalIRRMWZoneHouston","label":"Total IRR MW Zone Houston","cardinality":11,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalNewEquipResourceMWZoneSouth","label":"Total New Equipment Resource MW Zone South","cardinality":12,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalNewEquipResourceMWZoneNorth","label":"Total New Equipment Resource MW Zone North","cardinality":13,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalNewEquipResourceMWZoneWest","label":"Total New Equipment Resource MW Zone West","cardinality":14,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"totalNewEquipResourceMWZoneHouston","label":"Total New Equipment Resource MW Zone Houston","cardinality":15,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true}],"data":[["2023-12-11T15:03:49","2023-12-10",24,7346,3705,445,3902,2061,1169,2943,321,1172,2057,1488,766]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-233-cd"}}} diff --git a/tests/fixtures/public/batch/np3-560-cd--7d_load_fcast_by_fzn--current.json b/tests/fixtures/public/batch/np3-560-cd--7d_load_fcast_by_fzn--current.json new file mode 100644 index 00000000..83424847 --- /dev/null +++ b/tests/fixtures/public/batch/np3-560-cd--7d_load_fcast_by_fzn--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":752064,"pageSize":1,"totalPages":752064,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"7d_load_fcast_by_fzn","reportDisplayName":"Seven-Day Load Forecast by Forecast Zone","reportId":"12311","reportEMIL":"NP3-560-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"north","label":"North","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"south","label":"South","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"houston","label":"Houston","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"systemTotal","label":"System Total","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":9,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T19:30:00","2026-09-12","24:00",24698.874273730475,18076.866746264648,10739.49019543457,16368.728013085938,69883.95922851562,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-560-cd"}}} diff --git a/tests/fixtures/public/batch/np3-560-cd--7d_load_fcast_by_fzn--historical.json b/tests/fixtures/public/batch/np3-560-cd--7d_load_fcast_by_fzn--historical.json new file mode 100644 index 00000000..fa9d3a3e --- /dev/null +++ b/tests/fixtures/public/batch/np3-560-cd--7d_load_fcast_by_fzn--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":752064,"pageSize":1,"totalPages":752064,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"7d_load_fcast_by_fzn","reportDisplayName":"Seven-Day Load Forecast by Forecast Zone","reportId":"12311","reportEMIL":"NP3-560-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"north","label":"North","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"south","label":"South","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"houston","label":"Houston","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"systemTotal","label":"System Total","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":9,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-03-26T15:30:00","2026-03-26","1:00",15384.6252116333,13187.777784252932,9286.056515051272,11946.260581835937,49804.72009277344,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-560-cd"}}} diff --git a/tests/fixtures/public/batch/np3-561-cd--7d_load_fcast_by_wzn--current.json b/tests/fixtures/public/batch/np3-561-cd--7d_load_fcast_by_wzn--current.json new file mode 100644 index 00000000..2eb01ba0 --- /dev/null +++ b/tests/fixtures/public/batch/np3-561-cd--7d_load_fcast_by_wzn--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":752640,"pageSize":1,"totalPages":752640,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"7d_load_fcast_by_wzn","reportDisplayName":"Seven-Day Load Forecast by Weather Zone","reportId":"12312","reportEMIL":"NP3-561-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"coast","label":"Coast","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"east","label":"East","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"farWest","label":"Far West","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"north","label":"North","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"northCentral","label":"North Central","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southCentral","label":"South Central","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southern","label":"Southern","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"systemTotal","label":"System Total","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":13,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T19:30:00","2026-09-12","12:00",19041.3008,2475.3999,8827.7197,2259.96,23242.6992,12168.7998,5659.8198,2103.78,75779.4792,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-561-cd"}}} diff --git a/tests/fixtures/public/batch/np3-561-cd--7d_load_fcast_by_wzn--historical.json b/tests/fixtures/public/batch/np3-561-cd--7d_load_fcast_by_wzn--historical.json new file mode 100644 index 00000000..4c3cf3f8 --- /dev/null +++ b/tests/fixtures/public/batch/np3-561-cd--7d_load_fcast_by_wzn--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":752640,"pageSize":1,"totalPages":752640,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"7d_load_fcast_by_wzn","reportDisplayName":"Seven-Day Load Forecast by Weather Zone","reportId":"12312","reportEMIL":"NP3-561-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"coast","label":"Coast","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"east","label":"East","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"farWest","label":"Far West","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"north","label":"North","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"northCentral","label":"North Central","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southCentral","label":"South Central","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southern","label":"Southern","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"systemTotal","label":"System Total","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":13,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-03-26T12:30:00","2026-03-26","1:00",12378.5,1566.4399,7497.3701,1673.17,12922.5,8060.8599,4192.3901,1513.49,49804.72,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-561-cd"}}} diff --git a/tests/fixtures/public/batch/np3-562-cd--ih_load_fcast_by_wzn--current.json b/tests/fixtures/public/batch/np3-562-cd--ih_load_fcast_by_wzn--current.json new file mode 100644 index 00000000..ad217cf5 --- /dev/null +++ b/tests/fixtures/public/batch/np3-562-cd--ih_load_fcast_by_wzn--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":2256218,"pageSize":1,"totalPages":2256218,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"ih_load_fcast_by_wzn","reportDisplayName":"Intra-Hour Load Forecast by Weather Zone","reportId":"16553","reportEMIL":"NP3-562-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalEnding","label":"Interval Ending","cardinality":2,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"coast","label":"Coast","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"east","label":"East","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"farWest","label":"Far West","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"north","label":"North","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"northCentral","label":"North Central","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southCentral","label":"South Central","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southern","label":"Southern","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"systemTotal","label":"System Total","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"model","label":"Model","cardinality":12,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"inUseFlag","label":"In Use Flag","cardinality":13,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"DSTFlag","label":"DST Flag","cardinality":14,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T19:32:00","2026-09-05T21:30:00",17389.56640625,2132.75610351563,8070.7685546875,2164.255859375,23262.13671875,13255.0439453125,6254.6015625,2447.33959960937,74976.46875,"A6",false,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-562-cd"}}} diff --git a/tests/fixtures/public/batch/np3-562-cd--ih_load_fcast_by_wzn--historical.json b/tests/fixtures/public/batch/np3-562-cd--ih_load_fcast_by_wzn--historical.json new file mode 100644 index 00000000..75ed21a2 --- /dev/null +++ b/tests/fixtures/public/batch/np3-562-cd--ih_load_fcast_by_wzn--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":2256218,"pageSize":1,"totalPages":2256218,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"ih_load_fcast_by_wzn","reportDisplayName":"Intra-Hour Load Forecast by Weather Zone","reportId":"16553","reportEMIL":"NP3-562-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalEnding","label":"Interval Ending","cardinality":2,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"coast","label":"Coast","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"east","label":"East","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"farWest","label":"Far West","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"north","label":"North","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"northCentral","label":"North Central","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southCentral","label":"South Central","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southern","label":"Southern","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"systemTotal","label":"System Total","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"model","label":"Model","cardinality":12,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"inUseFlag","label":"In Use Flag","cardinality":13,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"DSTFlag","label":"DST Flag","cardinality":14,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-03-26T11:42:00","2026-03-26T11:45:00",14440.2001953125,1592.41003417969,7492.72021484375,2101.72998046875,14991.2998046875,8430.83984375,4567.33984375,1421.42004394531,55037.9609375,"E",true,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-562-cd"}}} diff --git a/tests/fixtures/public/batch/np3-565-cd--lf_by_model_weather_zone--current.json b/tests/fixtures/public/batch/np3-565-cd--lf_by_model_weather_zone--current.json new file mode 100644 index 00000000..be493489 --- /dev/null +++ b/tests/fixtures/public/batch/np3-565-cd--lf_by_model_weather_zone--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":35752015,"pageSize":1,"totalPages":35752015,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"lf_by_model_weather_zone","reportDisplayName":"Seven-Day Load Forecast by Model and Weather Zone","reportId":"14837","reportEMIL":"NP3-565-CD","downloadLimit":2000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"coast","label":"Coast","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"east","label":"East","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"farWest","label":"Far West","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"north","label":"North","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"northCentral","label":"North Central","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southCentral","label":"South Central","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southern","label":"Southern","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"systemTotal","label":"System Total","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"model","label":"Model","cardinality":13,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"inUseFlag","label":"In Use Flag","cardinality":14,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"DSTFlag","label":"DST Flag","cardinality":15,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T04:30:00","2026-09-12","1:00",16437.5078,2131.4731,7976.1543,1958.792,20050.1934,10896.4346,5409.1528,2105.8247,66965.5327,"A3",false,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-565-cd"}}} diff --git a/tests/fixtures/public/batch/np3-565-cd--lf_by_model_weather_zone--historical.json b/tests/fixtures/public/batch/np3-565-cd--lf_by_model_weather_zone--historical.json new file mode 100644 index 00000000..fc45b525 --- /dev/null +++ b/tests/fixtures/public/batch/np3-565-cd--lf_by_model_weather_zone--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":35752015,"pageSize":1,"totalPages":35752015,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"lf_by_model_weather_zone","reportDisplayName":"Seven-Day Load Forecast by Model and Weather Zone","reportId":"14837","reportEMIL":"NP3-565-CD","downloadLimit":2000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"coast","label":"Coast","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"east","label":"East","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"farWest","label":"Far West","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"north","label":"North","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"northCentral","label":"North Central","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southCentral","label":"South Central","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"southern","label":"Southern","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"systemTotal","label":"System Total","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"model","label":"Model","cardinality":13,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"inUseFlag","label":"In Use Flag","cardinality":14,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"DSTFlag","label":"DST Flag","cardinality":15,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-12-11T20:30:00","2023-12-11","1:00",11464.3535,1752.3236,6228.228,1416.5325,13226.084,7852.3584,3588.604,1443.9821,46972.4661,"A3",false,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone"},"parent":{"href":"https://api.ercot.com/api/public-reports/np3-565-cd"}}} diff --git a/tests/fixtures/public/batch/np4-158-sg--dam_essps--current.json b/tests/fixtures/public/batch/np4-158-sg--dam_essps--current.json new file mode 100644 index 00000000..d1e37b65 --- /dev/null +++ b/tests/fixtures/public/batch/np4-158-sg--dam_essps--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":2332484,"pageSize":1,"totalPages":2332484,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"dam_essps","reportDisplayName":"DAM Electrically Similar Settlement Points","reportId":"13058","reportEMIL":"NP4-158-SG","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"groupIndex","label":"Group Index","cardinality":5,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"updateTime","label":"Update Time","cardinality":6,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":7,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T12:34:27","2026-09-06","10:00","LARDVFTN_G5",167,"2026-09-05T12:30:26",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-158-sg"}}} diff --git a/tests/fixtures/public/batch/np4-158-sg--dam_essps--historical.json b/tests/fixtures/public/batch/np4-158-sg--dam_essps--historical.json new file mode 100644 index 00000000..8da158dd --- /dev/null +++ b/tests/fixtures/public/batch/np4-158-sg--dam_essps--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":2332484,"pageSize":1,"totalPages":2332484,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"dam_essps","reportDisplayName":"DAM Electrically Similar Settlement Points","reportId":"13058","reportEMIL":"NP4-158-SG","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"groupIndex","label":"Group Index","cardinality":5,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"updateTime","label":"Update Time","cardinality":6,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":7,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-05-28T12:35:15","2026-05-29","01:00","CHAMON_UN1",1,"2026-05-28T12:30:15",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-158-sg"}}} diff --git a/tests/fixtures/public/batch/np4-159-cd--load_distribution_factors--current.json b/tests/fixtures/public/batch/np4-159-cd--load_distribution_factors--current.json new file mode 100644 index 00000000..0669c0a0 --- /dev/null +++ b/tests/fixtures/public/batch/np4-159-cd--load_distribution_factors--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":28818186,"pageSize":1,"totalPages":28818186,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"LDFDate: DESC"}},"report":{"reportName":"load_distribution_factors","reportDisplayName":"Load Distribution Factors","reportId":"12324","reportEMIL":"NP4-159-CD","downloadLimit":2000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"LDFDate","label":"LDF Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"LDFHour","label":"LDF Hour","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"substation","label":"Substation","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"distributionFactor","label":"Distribution Factor","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"loadId","label":"Load Id","cardinality":6,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"MVARDistributionFactor","label":"MVAR Distribution Factor","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"MRIDLoad","label":"MRID Load","cardinality":8,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"DSTFlag","label":"DST Flag","cardinality":9,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-14T15:31:48","2026-08-21","02:00","GRLTC",13.0,"LDLXFMR1",0.0,"{1C4C182B-1485-48CA-B724-90AA581EF59D}",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-159-cd"}}} diff --git a/tests/fixtures/public/batch/np4-159-cd--load_distribution_factors--historical.json b/tests/fixtures/public/batch/np4-159-cd--load_distribution_factors--historical.json new file mode 100644 index 00000000..2557c9c6 --- /dev/null +++ b/tests/fixtures/public/batch/np4-159-cd--load_distribution_factors--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":28818186,"pageSize":1,"totalPages":28818186,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"LDFDate: ASC"}},"report":{"reportName":"load_distribution_factors","reportDisplayName":"Load Distribution Factors","reportId":"12324","reportEMIL":"NP4-159-CD","downloadLimit":2000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"LDFDate","label":"LDF Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"LDFHour","label":"LDF Hour","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"substation","label":"Substation","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"distributionFactor","label":"Distribution Factor","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"loadId","label":"Load Id","cardinality":6,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"MVARDistributionFactor","label":"MVAR Distribution Factor","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"MRIDLoad","label":"MRID Load","cardinality":8,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"DSTFlag","label":"DST Flag","cardinality":9,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2024-02-01T17:24:06","2024-02-02","01:00","WSTHL",5.9,"LDLXFMR2",-7.24576950073242,"{5ED8D6D7-0224-4332-91AC-E184DD6879DF}",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-159-cd"}}} diff --git a/tests/fixtures/public/batch/np4-183-cd--dam_hourly_lmp--current.json b/tests/fixtures/public/batch/np4-183-cd--dam_hourly_lmp--current.json new file mode 100644 index 00000000..b3ea8a35 --- /dev/null +++ b/tests/fixtures/public/batch/np4-183-cd--dam_hourly_lmp--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":465096,"pageSize":1,"totalPages":465096,"currentPage":1,"query":{"parameterCount":2,"parameters":{"deliveryDateFrom":"2026-09-05","deliveryDateTo":"2026-09-05"},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_hourly_lmp","reportDisplayName":"DAM Hourly LMPs","reportId":"12328","reportEMIL":"NP4-183-CD","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"busName","label":"Bus Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMP","label":"LMP","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05","01:00","_AK__AK_G1",29.94,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-183-cd"}}} diff --git a/tests/fixtures/public/batch/np4-183-cd--dam_hourly_lmp--historical.json b/tests/fixtures/public/batch/np4-183-cd--dam_hourly_lmp--historical.json new file mode 100644 index 00000000..0ece324a --- /dev/null +++ b/tests/fixtures/public/batch/np4-183-cd--dam_hourly_lmp--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":465096,"pageSize":1,"totalPages":465096,"currentPage":1,"query":{"parameterCount":2,"parameters":{"deliveryDateFrom":"2026-09-05","deliveryDateTo":"2026-09-05"},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_hourly_lmp","reportDisplayName":"DAM Hourly LMPs","reportId":"12328","reportEMIL":"NP4-183-CD","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"busName","label":"Bus Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMP","label":"LMP","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05","24:00","ZPT4671",36.17,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-183-cd"}}} diff --git a/tests/fixtures/public/batch/np4-19-cd--dam_agg_as_offer_curve--current.json b/tests/fixtures/public/batch/np4-19-cd--dam_agg_as_offer_curve--current.json new file mode 100644 index 00000000..9eb8b260 --- /dev/null +++ b/tests/fixtures/public/batch/np4-19-cd--dam_agg_as_offer_curve--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":6244640,"pageSize":1,"totalPages":6244640,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_agg_as_offer_curve","reportDisplayName":"DAM Aggregated Ancillary Service Offer Curve","reportId":"12330","reportEMIL":"NP4-19-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"ancillaryType","label":"Ancillary Type","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"price","label":"Price","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":6,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","17:00","REGUP",42.76,7557.9,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-19-cd"}}} diff --git a/tests/fixtures/public/batch/np4-19-cd--dam_agg_as_offer_curve--historical.json b/tests/fixtures/public/batch/np4-19-cd--dam_agg_as_offer_curve--historical.json new file mode 100644 index 00000000..12f0159d --- /dev/null +++ b/tests/fixtures/public/batch/np4-19-cd--dam_agg_as_offer_curve--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":6244640,"pageSize":1,"totalPages":6244640,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_agg_as_offer_curve","reportDisplayName":"DAM Aggregated Ancillary Service Offer Curve","reportId":"12330","reportEMIL":"NP4-19-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"ancillaryType","label":"Ancillary Type","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"price","label":"Price","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":6,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2025-12-06","08:00","ECRSS",40.0,6397.9,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-19-cd"}}} diff --git a/tests/fixtures/public/batch/np4-191-cd--dam_shadow_prices--current.json b/tests/fixtures/public/batch/np4-191-cd--dam_shadow_prices--current.json new file mode 100644 index 00000000..88b0de62 --- /dev/null +++ b/tests/fixtures/public/batch/np4-191-cd--dam_shadow_prices--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":973889,"pageSize":1,"totalPages":973889,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_shadow_prices","reportDisplayName":"DAM Shadow Prices","reportId":"12332","reportEMIL":"NP4-191-CD","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"constraintId","label":"Constraint Id","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintName","label":"Constraint Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"contingencyName","label":"Contingency Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"constraintLimit","label":"Constraint Limit","cardinality":6,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintValue","label":"Constraint Value","cardinality":7,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"violationAmount","label":"Violation Amount","cardinality":8,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"shadowPrice","label":"Shadow Price","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"fromStation","label":"From Station","cardinality":10,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"toStation","label":"To Station","cardinality":11,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"fromStationkV","label":"From Station kV","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"toStationkV","label":"To Station kV","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryTime","label":"Delivery Time","cardinality":14,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":15,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","01:00",1," FTST_SOLSTI1_1"," BASE CASE",189,189,0,0.029," SOLSTICE"," FTST",138.0,138.0,"2026-09-06T00:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-191-cd"}}} diff --git a/tests/fixtures/public/batch/np4-191-cd--dam_shadow_prices--historical.json b/tests/fixtures/public/batch/np4-191-cd--dam_shadow_prices--historical.json new file mode 100644 index 00000000..43767617 --- /dev/null +++ b/tests/fixtures/public/batch/np4-191-cd--dam_shadow_prices--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":973889,"pageSize":1,"totalPages":973889,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_shadow_prices","reportDisplayName":"DAM Shadow Prices","reportId":"12332","reportEMIL":"NP4-191-CD","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"constraintId","label":"Constraint Id","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintName","label":"Constraint Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"contingencyName","label":"Contingency Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"constraintLimit","label":"Constraint Limit","cardinality":6,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintValue","label":"Constraint Value","cardinality":7,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"violationAmount","label":"Violation Amount","cardinality":8,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"shadowPrice","label":"Shadow Price","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"fromStation","label":"From Station","cardinality":10,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"toStation","label":"To Station","cardinality":11,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"fromStationkV","label":"From Station kV","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"toStationkV","label":"To Station kV","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryTime","label":"Delivery Time","cardinality":14,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":15,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-12-13","24:00",1007," ESTES_PECAN_1_1"," DBYRBOW5",84,84,0,0.149," PECAN_BY"," ESTES",138.0,138.0,"2023-12-14T00:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-191-cd"}}} diff --git a/tests/fixtures/public/batch/np4-192-cd--dam_total_energy_purchased--current.json b/tests/fixtures/public/batch/np4-192-cd--dam_total_energy_purchased--current.json new file mode 100644 index 00000000..939eb976 --- /dev/null +++ b/tests/fixtures/public/batch/np4-192-cd--dam_total_energy_purchased--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":4780118,"pageSize":1,"totalPages":4780118,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_total_energy_purchased","reportDisplayName":"DAM Total Energy Purchased","reportId":"12333","reportEMIL":"NP4-192-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"totalDamEnergyBought","label":"Total DAM Energy Bought","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","01:00","BORDAS_345",15.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-192-cd"}}} diff --git a/tests/fixtures/public/batch/np4-192-cd--dam_total_energy_purchased--historical.json b/tests/fixtures/public/batch/np4-192-cd--dam_total_energy_purchased--historical.json new file mode 100644 index 00000000..1744bf98 --- /dev/null +++ b/tests/fixtures/public/batch/np4-192-cd--dam_total_energy_purchased--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":4780118,"pageSize":1,"totalPages":4780118,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_total_energy_purchased","reportDisplayName":"DAM Total Energy Purchased","reportId":"12333","reportEMIL":"NP4-192-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"totalDamEnergyBought","label":"Total DAM Energy Bought","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2025-12-06","24:00","AZ_ALL",0.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-192-cd"}}} diff --git a/tests/fixtures/public/batch/np4-193-cd--total_dam_energy_sold--current.json b/tests/fixtures/public/batch/np4-193-cd--total_dam_energy_sold--current.json new file mode 100644 index 00000000..8c943547 --- /dev/null +++ b/tests/fixtures/public/batch/np4-193-cd--total_dam_energy_sold--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":4295649,"pageSize":1,"totalPages":4295649,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"total_dam_energy_sold","reportDisplayName":"DAM Total Energy Sold","reportId":"12334","reportEMIL":"NP4-193-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"totalDAMEnergySold","label":"Total DAM Energy Sold","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","01:00","A4_DGR2_RN",1.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-193-cd"}}} diff --git a/tests/fixtures/public/batch/np4-193-cd--total_dam_energy_sold--historical.json b/tests/fixtures/public/batch/np4-193-cd--total_dam_energy_sold--historical.json new file mode 100644 index 00000000..74e12ad5 --- /dev/null +++ b/tests/fixtures/public/batch/np4-193-cd--total_dam_energy_sold--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":4295649,"pageSize":1,"totalPages":4295649,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"total_dam_energy_sold","reportDisplayName":"DAM Total Energy Sold","reportId":"12334","reportEMIL":"NP4-193-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"totalDAMEnergySold","label":"Total DAM Energy Sold","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2025-12-06","24:00","ZIER_SLR_ALL",0.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-193-cd"}}} diff --git a/tests/fixtures/public/batch/np4-194-cd--dam_ptp_obligation_sp_results--current.json b/tests/fixtures/public/batch/np4-194-cd--dam_ptp_obligation_sp_results--current.json new file mode 100644 index 00000000..44eecdb5 --- /dev/null +++ b/tests/fixtures/public/batch/np4-194-cd--dam_ptp_obligation_sp_results--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":1510521,"pageSize":1,"totalPages":1510521,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_ptp_obligation_sp_results","reportDisplayName":"DAM PTP Obligation Results by Settlement Point","reportId":"13042","reportEMIL":"NP4-194-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"DELIVERY DATE","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"HOUR ENDING","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"stlPnt","label":"STL_PNT","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"totalPtpOblAwardedSource","label":"TOTAL_PTP_OBL_AWARDED_SOURCE","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"totalPtpOblAwardedSink","label":"TOTAL_PTP_OBL_AWARDED_SINK","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":6,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","22:00","FOARDCTY_ALL",27.4,33.1,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-194-cd"}}} diff --git a/tests/fixtures/public/batch/np4-194-cd--dam_ptp_obligation_sp_results--historical.json b/tests/fixtures/public/batch/np4-194-cd--dam_ptp_obligation_sp_results--historical.json new file mode 100644 index 00000000..22453004 --- /dev/null +++ b/tests/fixtures/public/batch/np4-194-cd--dam_ptp_obligation_sp_results--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":1510521,"pageSize":1,"totalPages":1510521,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_ptp_obligation_sp_results","reportDisplayName":"DAM PTP Obligation Results by Settlement Point","reportId":"13042","reportEMIL":"NP4-194-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"DELIVERY DATE","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"HOUR ENDING","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"stlPnt","label":"STL_PNT","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"totalPtpOblAwardedSource","label":"TOTAL_PTP_OBL_AWARDED_SOURCE","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"totalPtpOblAwardedSink","label":"TOTAL_PTP_OBL_AWARDED_SINK","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":6,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-06-26","20:00","ARY_BESS_RN",3.0,0.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-194-cd"}}} diff --git a/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_eblmp--current.json b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_eblmp--current.json new file mode 100644 index 00000000..6408ad5c --- /dev/null +++ b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_eblmp--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":3691529,"pageSize":1,"totalPages":3691529,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_price_corrections_eblmp","reportDisplayName":"DAM Price Corrections for EBLMP","reportId":"13044","reportEMIL":"NP4-196-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"electricalBus","label":"Electric Bus Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMPOriginal","label":"LMP Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"LMPCorrected","label":"LMP Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":6,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":7,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2025-12-06",1,"0022",45.3,45.31,"2025-12-09T10:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-196-m"}}} diff --git a/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_eblmp--historical.json b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_eblmp--historical.json new file mode 100644 index 00000000..5d89dbd4 --- /dev/null +++ b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_eblmp--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":3691529,"pageSize":1,"totalPages":3691529,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_price_corrections_eblmp","reportDisplayName":"DAM Price Corrections for EBLMP","reportId":"13044","reportEMIL":"NP4-196-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"electricalBus","label":"Electric Bus Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMPOriginal","label":"LMP Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"LMPCorrected","label":"LMP Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":6,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":7,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2024-01-10",24,"ZPT4671",20.8,21.03,"2024-04-24T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-196-m"}}} diff --git a/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_mcpc--current.json b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_mcpc--current.json new file mode 100644 index 00000000..67bd3153 --- /dev/null +++ b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_mcpc--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":261,"pageSize":1,"totalPages":261,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_price_corrections_mcpc","reportDisplayName":"DAM Price Corrections for MCPC","reportId":"13044","reportEMIL":"NP4-196-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"MCPCOriginal","label":"MCPC Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"MCPCCorrected","label":"MCPC Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":6,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":7,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2025-06-27",2,"REGUP",1.21,1.3,"2025-09-26T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-196-m"}}} diff --git a/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_mcpc--historical.json b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_mcpc--historical.json new file mode 100644 index 00000000..9dabebfd --- /dev/null +++ b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_mcpc--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":261,"pageSize":1,"totalPages":261,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_price_corrections_mcpc","reportDisplayName":"DAM Price Corrections for MCPC","reportId":"13044","reportEMIL":"NP4-196-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"MCPCOriginal","label":"MCPC Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"MCPCCorrected","label":"MCPC Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":6,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":7,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2024-01-10",24,"ECRS",0.99,1.0,"2024-04-24T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-196-m"}}} diff --git a/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_spp--current.json b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_spp--current.json new file mode 100644 index 00000000..a447f524 --- /dev/null +++ b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_spp--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":193315,"pageSize":1,"totalPages":193315,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"priceCorrectionTime: DESC"}},"report":{"reportName":"dam_price_corrections_spp","reportDisplayName":"DAM Price Corrections for SPP","reportId":"13044","reportEMIL":"NP4-196-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"SPPOriginal","label":"Settlement Point Price Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"SPPCorrected","label":"Settlement Point Price Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":6,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":7,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2025-12-06",14,"POTSVIL_RN",2.84,2.85,"2025-12-09T10:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-196-m"}}} diff --git a/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_spp--historical.json b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_spp--historical.json new file mode 100644 index 00000000..c36918ea --- /dev/null +++ b/tests/fixtures/public/batch/np4-196-m--dam_price_corrections_spp--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":193315,"pageSize":1,"totalPages":193315,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"priceCorrectionTime: ASC"}},"report":{"reportName":"dam_price_corrections_spp","reportDisplayName":"DAM Price Corrections for SPP","reportId":"13044","reportEMIL":"NP4-196-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"SPPOriginal","label":"Settlement Point Price Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"SPPCorrected","label":"Settlement Point Price Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":6,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":7,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2024-01-20",1,"7RNCHSLR_ALL",29.2,29.13,"2024-01-23T10:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-196-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_eblmp--current.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_eblmp--current.json new file mode 100644 index 00000000..934d885f --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_eblmp--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":29778368,"pageSize":1,"totalPages":29778368,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"priceCorrectionTime: DESC"}},"report":{"reportName":"rtm_price_corrections_eblmp","reportDisplayName":"RTM Price Corrections for EB LMP","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"electricalBus","label":"Electrical Bus","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedLMPOriginal","label":"Capped LMP Original","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedLMPOriginal","label":"Uncapped LMP Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"cappedLMPCorrected","label":"Capped LMP Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedLMPCorrected","label":"Uncapped LMP Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":7,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-30T09:10:19","WSHK1",15.74,15.74,15.81,16.0,"2026-09-01T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_eblmp--historical.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_eblmp--historical.json new file mode 100644 index 00000000..6bed1cb8 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_eblmp--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":29778368,"pageSize":1,"totalPages":29778368,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"priceCorrectionTime: ASC"}},"report":{"reportName":"rtm_price_corrections_eblmp","reportDisplayName":"RTM Price Corrections for EB LMP","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"electricalBus","label":"Electrical Bus","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedLMPOriginal","label":"Capped LMP Original","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedLMPOriginal","label":"Uncapped LMP Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"cappedLMPCorrected","label":"Capped LMP Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedLMPCorrected","label":"Uncapped LMP Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":7,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-10-22T12:25:15","BROCK04",4999.99,null,23.57,null,"2023-12-19T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_sced--current.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_sced--current.json new file mode 100644 index 00000000..7e364160 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_sced--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":752,"pageSize":1,"totalPages":752,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"rtm_price_corrections_mcpc_sced","reportDisplayName":"RTM Price Corrections for MCPCs by SCED Interval","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedMCPCOriginal","label":"Capped MCPC Original","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedMCPCOriginal","label":"Uncapped MCPC Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"cappedMCPCCorrected","label":"Capped MCPC Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedMCPCCorrected","label":"Uncapped MCPC Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":7,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-30T09:15:19","REGDN",0.05,0.05,0.03,0.03,"2026-09-01T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_sced--historical.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_sced--historical.json new file mode 100644 index 00000000..99aa64ed --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_sced--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":752,"pageSize":1,"totalPages":752,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"rtm_price_corrections_mcpc_sced","reportDisplayName":"RTM Price Corrections for MCPCs by SCED Interval","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedMCPCOriginal","label":"Capped MCPC Original","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedMCPCOriginal","label":"Uncapped MCPC Original","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"cappedMCPCCorrected","label":"Capped MCPC Corrected","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedMCPCCorrected","label":"Uncapped MCPC Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":7,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-01-10T00:45:16","REGDN",0.06,null,0.07,null,"2026-07-13T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_spp--current.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_spp--current.json new file mode 100644 index 00000000..2cbed8be --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_spp--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":279,"pageSize":1,"totalPages":279,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"priceCorrectionTime: DESC"}},"report":{"reportName":"rtm_price_corrections_mcpc_spp","reportDisplayName":"RTM Price Corrections for MCPC by 15-Min Settlement Interval","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"MCPCOriginal","label":"MCPC Original","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"MCPCCorrected","label":"MCPC Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":7,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-30",10,2,"REGDN",0.05,0.04,"2026-09-01T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_spp--historical.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_spp--historical.json new file mode 100644 index 00000000..701e8895 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_mcpc_spp--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":279,"pageSize":1,"totalPages":279,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"priceCorrectionTime: ASC"}},"report":{"reportName":"rtm_price_corrections_mcpc_spp","reportDisplayName":"RTM Price Corrections for MCPC by 15-Min Settlement Interval","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"MCPCOriginal","label":"MCPC Original","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"MCPCCorrected","label":"MCPC Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":7,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-01-10",3,2,"REGDN",0.15,0.16,"2026-07-10T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_shadow--current.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_shadow--current.json new file mode 100644 index 00000000..9878590c --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_shadow--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":22398,"pageSize":1,"totalPages":22398,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"rtm_price_corrections_shadow","reportDisplayName":"RTM Price Corrections for Shadow Prices","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintId","label":"Constraint Id","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintName","label":"Constraint Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"contingencyName","label":"Contingency Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"shadowPriceOriginal","label":"Shadow Price Original","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"shadowPriceCorrected","label":"Shadow Price Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"limitOriginal","label":"Limit Original","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"limitCorrected","label":"Limit Corrected","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"valueOriginal","label":"Value Original","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"valueCorrected","label":"Value Corrected","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":11,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":12,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-30T09:25:00",1,"138_ALV_NAL_1","SMDOPHR5",0.0,2.62,392.9,392.3,373.3,392.3,"2026-09-01T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_shadow--historical.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_shadow--historical.json new file mode 100644 index 00000000..6b4333a2 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_shadow--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":22398,"pageSize":1,"totalPages":22398,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"rtm_price_corrections_shadow","reportDisplayName":"RTM Price Corrections for Shadow Prices","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintId","label":"Constraint Id","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintName","label":"Constraint Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"contingencyName","label":"Contingency Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"shadowPriceOriginal","label":"Shadow Price Original","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"shadowPriceCorrected","label":"Shadow Price Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"limitOriginal","label":"Limit Original","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"limitCorrected","label":"Limit Corrected","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"valueOriginal","label":"Value Original","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"valueCorrected","label":"Value Corrected","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":11,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":12,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-10-22T12:15:16",3,"NE_LOB","BASE CASE",0.0,0.0,704.0,704.0,687.3,691.5,"2023-12-19T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_soglmp--current.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_soglmp--current.json new file mode 100644 index 00000000..18ef5b78 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_soglmp--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":738937,"pageSize":1,"totalPages":738937,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"rtm_price_corrections_soglmp","reportDisplayName":"RTM Price Corrections for SOG LMP","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"resourceType","label":"Resource Type","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceName","label":"Resource Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterName","label":"Meter Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterLMPOriginal","label":"Meter LMP Original","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"meterLMPCorrected","label":"Meter LMP Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPAOriginal","label":"RTRDPA Original","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPACorrected","label":"RTRDPA Corrected","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"finalLMPOriginal","label":"Final LMP Original","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"finalLMPCorrected","label":"Final LMP Corrected","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":11,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":" Repeat Hour Flag","cardinality":12,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"RTORPAOriginal","label":"RTORPA Original","cardinality":13,"dataType":"DOUBLE","searchable":false,"sortable":false,"hasRange":true},{"name":"RTORPACorrected","label":"RTORPA Corrected","cardinality":14,"dataType":"DOUBLE","searchable":false,"sortable":false,"hasRange":true}],"data":[["2026-08-30T09:25:18","SODG","19599_1_PV_A1","10443720004133031",15.29,15.67,0.0,0.0,15.29,15.67,"2026-09-01T16:00:00",false,null,null]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_soglmp--historical.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_soglmp--historical.json new file mode 100644 index 00000000..d4a725ad --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_soglmp--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":738937,"pageSize":1,"totalPages":738937,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"rtm_price_corrections_soglmp","reportDisplayName":"RTM Price Corrections for SOG LMP","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"resourceType","label":"Resource Type","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceName","label":"Resource Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterName","label":"Meter Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterLMPOriginal","label":"Meter LMP Original","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"meterLMPCorrected","label":"Meter LMP Corrected","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPAOriginal","label":"RTRDPA Original","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPACorrected","label":"RTRDPA Corrected","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"finalLMPOriginal","label":"Final LMP Original","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"finalLMPCorrected","label":"Final LMP Corrected","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":11,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":" Repeat Hour Flag","cardinality":12,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"RTORPAOriginal","label":"RTORPA Original","cardinality":13,"dataType":"DOUBLE","searchable":false,"sortable":false,"hasRange":true},{"name":"RTORPACorrected","label":"RTORPA Corrected","cardinality":14,"dataType":"DOUBLE","searchable":false,"sortable":false,"hasRange":true}],"data":[["2023-10-22T12:15:16","SOTG","CANYHY_CANYHYG2","LCGCANYOPSU00",5000.0,23.58,0.0,0.0,5000.0,23.58,"2023-12-19T16:00:00",false,0.0,0.0]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_sogprice--current.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_sogprice--current.json new file mode 100644 index 00000000..2de11583 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_sogprice--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":940346,"pageSize":1,"totalPages":940346,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"rtm_price_corrections_sogprice","reportDisplayName":"RTM Price Corrections for SOG Price","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"resourceType","label":"Resource Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceName","label":"Resource Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterName","label":"Meter Name","cardinality":6,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"priceOriginal","label":"Price Original","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrected","label":"Price Corrected","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":9,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":10,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-30",10,1,"SODG","HEB441_UVALD441","10032789468957340",15.64,15.68,"2026-09-01T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_sogprice--historical.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_sogprice--historical.json new file mode 100644 index 00000000..26863f61 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_sogprice--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":940346,"pageSize":1,"totalPages":940346,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"rtm_price_corrections_sogprice","reportDisplayName":"RTM Price Corrections for SOG Price","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"resourceType","label":"Resource Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceName","label":"Resource Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterName","label":"Meter Name","cardinality":6,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"priceOriginal","label":"Price Original","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrected","label":"Price Corrected","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":9,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":10,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-10-22",14,2,"SODG","X443PV1_SWRI_PV1","TDSP_CMCE_PV1",21.91,23.5,"2023-12-19T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_splmp--current.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_splmp--current.json new file mode 100644 index 00000000..452b9fd8 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_splmp--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":5065206,"pageSize":1,"totalPages":5065206,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"priceCorrectionTime: DESC"}},"report":{"reportName":"rtm_price_corrections_splmp","reportDisplayName":"RTM Price Corrections SP LMP","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"settlementPointName","label":"Settlement Point","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMPOriginal","label":"LMP Original","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"LMPCorrected","label":"LMP Corrected","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":5,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":6,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-30T09:15:19","SKY1",15.59,16.08,"2026-09-01T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_splmp--historical.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_splmp--historical.json new file mode 100644 index 00000000..429a8e4f --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_splmp--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":5065206,"pageSize":1,"totalPages":5065206,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"priceCorrectionTime: ASC"}},"report":{"reportName":"rtm_price_corrections_splmp","reportDisplayName":"RTM Price Corrections SP LMP","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"settlementPointName","label":"Settlement Point","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMPOriginal","label":"LMP Original","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"LMPCorrected","label":"LMP Corrected","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":5,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":6,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-10-22T13:20:16","AEEC",21.35,23.57,"2023-12-19T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_spp--current.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_spp--current.json new file mode 100644 index 00000000..882c8eb5 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_spp--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":2172791,"pageSize":1,"totalPages":2172791,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"rtm_price_corrections_spp","reportDisplayName":"RTM Price Corrections for SPP","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"settlementPointName","label":"Settlement Point Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPointType","label":"Settlement Point Type","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"SPPOriginal","label":"SPP Original","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"SPPCorrected","label":"SPP Corrected","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":8,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":9,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-30",10,1,"7RNCHSLR_ALL","RN",15.64,15.68,"2026-09-01T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_spp--historical.json b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_spp--historical.json new file mode 100644 index 00000000..dc831320 --- /dev/null +++ b/tests/fixtures/public/batch/np4-197-m--rtm_price_corrections_spp--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":2172791,"pageSize":1,"totalPages":2172791,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"rtm_price_corrections_spp","reportDisplayName":"RTM Price Corrections for SPP","reportId":"13045","reportEMIL":"NP4-197-M","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"settlementPointName","label":"Settlement Point Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPointType","label":"Settlement Point Type","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"SPPOriginal","label":"SPP Original","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"SPPCorrected","label":"SPP Corrected","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"priceCorrectionTime","label":"Price Correction Time","cardinality":8,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":9,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-10-22",14,2,"ZIER_SLR_ALL","RN",21.91,23.5,"2023-12-19T16:00:00",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"}}} diff --git a/tests/fixtures/public/batch/np4-200-cd--dam_de_energized_spbc--current.json b/tests/fixtures/public/batch/np4-200-cd--dam_de_energized_spbc--current.json new file mode 100644 index 00000000..c20b5e6f --- /dev/null +++ b/tests/fixtures/public/batch/np4-200-cd--dam_de_energized_spbc--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":26708,"pageSize":1,"totalPages":26708,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_de_energized_spbc","reportDisplayName":"DAM De-Energized Settlement Points in Base Case","reportId":"13063","reportEMIL":"NP4-200-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":4,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","01:00","APCH_BES_RN",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-200-cd"}}} diff --git a/tests/fixtures/public/batch/np4-200-cd--dam_de_energized_spbc--historical.json b/tests/fixtures/public/batch/np4-200-cd--dam_de_energized_spbc--historical.json new file mode 100644 index 00000000..55d0f879 --- /dev/null +++ b/tests/fixtures/public/batch/np4-200-cd--dam_de_energized_spbc--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":26708,"pageSize":1,"totalPages":26708,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_de_energized_spbc","reportDisplayName":"DAM De-Energized Settlement Points in Base Case","reportId":"13063","reportEMIL":"NP4-200-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":4,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-08-01","24:00","ULYS_SLR_RN",false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-200-cd"}}} diff --git a/tests/fixtures/public/batch/np4-212-cd--dam_sced_as_demand_curves--current.json b/tests/fixtures/public/batch/np4-212-cd--dam_sced_as_demand_curves--current.json new file mode 100644 index 00000000..f64e63c2 --- /dev/null +++ b/tests/fixtures/public/batch/np4-212-cd--dam_sced_as_demand_curves--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":200350703,"pageSize":1,"totalPages":200350703,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"dam_sced_as_demand_curves","reportDisplayName":"DAM and SCED Ancillary Service Demand Curves","reportId":"24893","reportEMIL":"NP4-212-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"ASType","label":"AS Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"demandCurvePoint","label":"Demand Curve Point","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"price","label":"Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T04:55:40","2026-09-05","02:00","NSPIN",6537.0,6784.0,0.02,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-212-cd"}}} diff --git a/tests/fixtures/public/batch/np4-212-cd--dam_sced_as_demand_curves--historical.json b/tests/fixtures/public/batch/np4-212-cd--dam_sced_as_demand_curves--historical.json new file mode 100644 index 00000000..161ae06b --- /dev/null +++ b/tests/fixtures/public/batch/np4-212-cd--dam_sced_as_demand_curves--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":200350703,"pageSize":1,"totalPages":200350703,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"dam_sced_as_demand_curves","reportDisplayName":"DAM and SCED Ancillary Service Demand Curves","reportId":"24893","reportEMIL":"NP4-212-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"ASType","label":"AS Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"demandCurvePoint","label":"Demand Curve Point","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"price","label":"Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2025-12-05T04:56:03","2025-12-06","18:00","NSPIN",1189.0,1197.0,504.09,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-212-cd"}}} diff --git a/tests/fixtures/public/batch/np4-213-cd--hruc_as_demand_curves--current.json b/tests/fixtures/public/batch/np4-213-cd--hruc_as_demand_curves--current.json new file mode 100644 index 00000000..288e06d5 --- /dev/null +++ b/tests/fixtures/public/batch/np4-213-cd--hruc_as_demand_curves--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":325338955,"pageSize":1,"totalPages":325338955,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"hruc_as_demand_curves","reportDisplayName":"Hourly RUC Ancillary Service Demand Curves","reportId":"26382","reportEMIL":"NP4-213-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"RUCTimestamp","label":"RUC Timestamp","cardinality":3,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"demandCurvePoint","label":"Demand Curve Point","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"price","label":"Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","12:00","2026-09-05T16:03:03","ECRS",1884.0,2431.0,43.37,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-213-cd"}}} diff --git a/tests/fixtures/public/batch/np4-213-cd--hruc_as_demand_curves--historical.json b/tests/fixtures/public/batch/np4-213-cd--hruc_as_demand_curves--historical.json new file mode 100644 index 00000000..651c64ba --- /dev/null +++ b/tests/fixtures/public/batch/np4-213-cd--hruc_as_demand_curves--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":325338955,"pageSize":1,"totalPages":325338955,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"hruc_as_demand_curves","reportDisplayName":"Hourly RUC Ancillary Service Demand Curves","reportId":"26382","reportEMIL":"NP4-213-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"RUCTimestamp","label":"RUC Timestamp","cardinality":3,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"demandCurvePoint","label":"Demand Curve Point","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"price","label":"Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-02-26","21:00","2026-02-26T17:03:04","ECRS",381.0,419.0,2297.48,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-213-cd"}}} diff --git a/tests/fixtures/public/batch/np4-214-cd--druc_as_demand_curves--current.json b/tests/fixtures/public/batch/np4-214-cd--druc_as_demand_curves--current.json new file mode 100644 index 00000000..6fd99227 --- /dev/null +++ b/tests/fixtures/public/batch/np4-214-cd--druc_as_demand_curves--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":16435231,"pageSize":1,"totalPages":16435231,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"druc_as_demand_curves","reportDisplayName":"Daily RUC Ancillary Service Demand Curves","reportId":"26383","reportEMIL":"NP4-214-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"RUCTimestamp","label":"RUC Timestamp","cardinality":3,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"demandCurvePoint","label":"Demand Curve Point","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"price","label":"Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","14:00","2026-09-05T14:33:08","RRS",74.0,2143.0,2481.68,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-214-cd"}}} diff --git a/tests/fixtures/public/batch/np4-214-cd--druc_as_demand_curves--historical.json b/tests/fixtures/public/batch/np4-214-cd--druc_as_demand_curves--historical.json new file mode 100644 index 00000000..eb634e55 --- /dev/null +++ b/tests/fixtures/public/batch/np4-214-cd--druc_as_demand_curves--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":16435231,"pageSize":1,"totalPages":16435231,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"druc_as_demand_curves","reportDisplayName":"Daily RUC Ancillary Service Demand Curves","reportId":"26383","reportEMIL":"NP4-214-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"RUCTimestamp","label":"RUC Timestamp","cardinality":3,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"demandCurvePoint","label":"Demand Curve Point","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"price","label":"Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-02-28","05:00","2026-02-27T14:33:01","NSPIN",2206.0,2214.0,126.73,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-214-cd"}}} diff --git a/tests/fixtures/public/batch/np4-215-cd--wruc_as_demand_curves--current.json b/tests/fixtures/public/batch/np4-215-cd--wruc_as_demand_curves--current.json new file mode 100644 index 00000000..93cdee2a --- /dev/null +++ b/tests/fixtures/public/batch/np4-215-cd--wruc_as_demand_curves--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":91223237,"pageSize":1,"totalPages":91223237,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"wruc_as_demand_curves","reportDisplayName":"Weekly RUC Ancillary Service Demand Curves","reportId":"26384","reportEMIL":"NP4-215-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"RUCTimestamp","label":"RUC Timestamp","cardinality":4,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"demandCurvePoint","label":"Demand Curve Point","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"price","label":"Price","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":9,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T02:54:35","2026-09-11","22:00","2026-09-05T01:05:17","RRS",124.0,2232.0,981.4,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-215-cd"}}} diff --git a/tests/fixtures/public/batch/np4-215-cd--wruc_as_demand_curves--historical.json b/tests/fixtures/public/batch/np4-215-cd--wruc_as_demand_curves--historical.json new file mode 100644 index 00000000..8758ba1e --- /dev/null +++ b/tests/fixtures/public/batch/np4-215-cd--wruc_as_demand_curves--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":91223237,"pageSize":1,"totalPages":91223237,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"wruc_as_demand_curves","reportDisplayName":"Weekly RUC Ancillary Service Demand Curves","reportId":"26384","reportEMIL":"NP4-215-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"RUCTimestamp","label":"RUC Timestamp","cardinality":4,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"ASType","label":"AS Type","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"demandCurvePoint","label":"Demand Curve Point","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"quantity","label":"Quantity","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"price","label":"Price","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":9,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-02-27T02:46:04","2026-03-04","15:00","2026-02-27T01:10:53","NSPIN",2730.0,2738.0,15.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-215-cd"}}} diff --git a/tests/fixtures/public/batch/np4-231-cd--electrical_bus_map_heur_price--current.json b/tests/fixtures/public/batch/np4-231-cd--electrical_bus_map_heur_price--current.json new file mode 100644 index 00000000..279cf371 --- /dev/null +++ b/tests/fixtures/public/batch/np4-231-cd--electrical_bus_map_heur_price--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":294998,"pageSize":1,"totalPages":294998,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: DESC"}},"report":{"reportName":"electrical_bus_map_heur_price","reportDisplayName":"Electrical Bus Mapping for Heuristic Pricing","reportId":"13098","reportEMIL":"NP4-231-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"marketType","label":"Market Type","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"fromEBName","label":"From EB Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"toEBName","label":"To EB Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"type","label":"Type","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"priority","label":"Prioirty","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T05:50:00","SCED","YARSW_CN11","EB_BB_CN3","Equal",7.0]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-231-cd"}}} diff --git a/tests/fixtures/public/batch/np4-231-cd--electrical_bus_map_heur_price--historical.json b/tests/fixtures/public/batch/np4-231-cd--electrical_bus_map_heur_price--historical.json new file mode 100644 index 00000000..422fefe3 --- /dev/null +++ b/tests/fixtures/public/batch/np4-231-cd--electrical_bus_map_heur_price--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":294998,"pageSize":1,"totalPages":294998,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"postedDatetime: ASC"}},"report":{"reportName":"electrical_bus_map_heur_price","reportDisplayName":"Electrical Bus Mapping for Heuristic Pricing","reportId":"13098","reportEMIL":"NP4-231-CD","downloadLimit":1000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"marketType","label":"Market Type","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"fromEBName","label":"From EB Name","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"toEBName","label":"To EB Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"type","label":"Type","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"priority","label":"Prioirty","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-07-31T05:50:00","DAM","0014_EB","DOWGEN_040","Equal",1.0]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-231-cd"}}} diff --git a/tests/fixtures/public/batch/np4-33-cd--dam_as_plan--current.json b/tests/fixtures/public/batch/np4-33-cd--dam_as_plan--current.json new file mode 100644 index 00000000..80bd170c --- /dev/null +++ b/tests/fixtures/public/batch/np4-33-cd--dam_as_plan--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":839125,"pageSize":1,"totalPages":839125,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_as_plan","reportDisplayName":"DAM Ancillary Service Plan","reportId":"12316","reportEMIL":"NP4-33-CD","downloadLimit":2000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"ancillaryType","label":"Ancillary Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"quantity","label":"Quantity","cardinality":5,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":6,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T05:00:00","2026-09-11","01:00","ECRS",1150,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-33-cd"}}} diff --git a/tests/fixtures/public/batch/np4-33-cd--dam_as_plan--historical.json b/tests/fixtures/public/batch/np4-33-cd--dam_as_plan--historical.json new file mode 100644 index 00000000..77534518 --- /dev/null +++ b/tests/fixtures/public/batch/np4-33-cd--dam_as_plan--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":839125,"pageSize":1,"totalPages":839125,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_as_plan","reportDisplayName":"DAM Ancillary Service Plan","reportId":"12316","reportEMIL":"NP4-33-CD","downloadLimit":2000000},"fields":[{"name":"postedDatetime","label":"Posted","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryDate","label":"Delivery Date","cardinality":2,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"ancillaryType","label":"Ancillary Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"quantity","label":"Quantity","cardinality":5,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":6,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-12-13T05:00:00","2023-12-13","01:00","ECRS",1333,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-33-cd"}}} diff --git a/tests/fixtures/public/batch/np4-523-cd--dam_system_lambda--current.json b/tests/fixtures/public/batch/np4-523-cd--dam_system_lambda--current.json new file mode 100644 index 00000000..4c3019f6 --- /dev/null +++ b/tests/fixtures/public/batch/np4-523-cd--dam_system_lambda--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":23975,"pageSize":1,"totalPages":23975,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"dam_system_lambda","reportDisplayName":"DAM System Lambda","reportId":"13113","reportEMIL":"NP4-523-CD","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"systemLambda","label":"System Lambda","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":4,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-06","1:00",31.4544,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-523-cd"}}} diff --git a/tests/fixtures/public/batch/np4-523-cd--dam_system_lambda--historical.json b/tests/fixtures/public/batch/np4-523-cd--dam_system_lambda--historical.json new file mode 100644 index 00000000..bedb7243 --- /dev/null +++ b/tests/fixtures/public/batch/np4-523-cd--dam_system_lambda--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":23975,"pageSize":1,"totalPages":23975,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"dam_system_lambda","reportDisplayName":"DAM System Lambda","reportId":"13113","reportEMIL":"NP4-523-CD","downloadLimit":2000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"systemLambda","label":"System Lambda","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":4,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-12-13","9:00",29.348,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda"},"parent":{"href":"https://api.ercot.com/api/public-reports/np4-523-cd"}}} diff --git a/tests/fixtures/public/batch/np6-322-cd--sced_system_lambda--current.json b/tests/fixtures/public/batch/np6-322-cd--sced_system_lambda--current.json new file mode 100644 index 00000000..96bc335e --- /dev/null +++ b/tests/fixtures/public/batch/np6-322-cd--sced_system_lambda--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":292262,"pageSize":1,"totalPages":292262,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"sced_system_lambda","reportDisplayName":"SCED System Lambda","reportId":"13114","reportEMIL":"NP6-322-CD","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedSystemLambda","label":"Capped System Lambda","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedSystemLambda","label":"Uncapped System Lambda","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:23",false,51.85357,51.85357]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-322-cd"}}} diff --git a/tests/fixtures/public/batch/np6-322-cd--sced_system_lambda--historical.json b/tests/fixtures/public/batch/np6-322-cd--sced_system_lambda--historical.json new file mode 100644 index 00000000..daef2981 --- /dev/null +++ b/tests/fixtures/public/batch/np6-322-cd--sced_system_lambda--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":292262,"pageSize":1,"totalPages":292262,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"sced_system_lambda","reportDisplayName":"SCED System Lambda","reportId":"13114","reportEMIL":"NP6-322-CD","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedSystemLambda","label":"Capped System Lambda","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedSystemLambda","label":"Uncapped System Lambda","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2023-12-11T14:30:18",false,13.7515916824341,null]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-322-cd"}}} diff --git a/tests/fixtures/public/batch/np6-323-cd--rt_price_adder_sced--current.json b/tests/fixtures/public/batch/np6-323-cd--rt_price_adder_sced--current.json new file mode 100644 index 00000000..adea5010 --- /dev/null +++ b/tests/fixtures/public/batch/np6-323-cd--rt_price_adder_sced--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":80007,"pageSize":1,"totalPages":80007,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"rt_price_adder_sced","reportDisplayName":"Real-Time Price Adders by SCED Interval","reportId":"13221","reportEMIL":"NP6-323-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"systemLambda","label":"System Lambda","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPA","label":"RTRDPA","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARUS","label":"RTRDPARUS","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARDS","label":"RTRDPARDS","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARRS","label":"RTRDPARRS","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPAECRS","label":"RTRDPAECRS","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPANSS","label":"RTRDPANSS","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRRUC","label":"RTRRUC","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRRMR","label":"RTRRMR","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDNCLR","label":"RTDNCLR","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDERS","label":"RTDERS","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDCTIEIMPORT","label":"RTDCTIEIMPORT","cardinality":14,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDCTIEEXPORT","label":"RTDCTIEEXPORT","cardinality":15,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTBLTIMPORT","label":"RTBLTIMPORT","cardinality":16,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTBLTEXPORT","label":"RTBLTEXPORT","cardinality":17,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTOLLSL","label":"RTOLLSL","cardinality":18,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTOLHSL","label":"RTOLHSL","cardinality":19,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDLL","label":"RTDLL","cardinality":20,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:23",false,51.8536,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,12547.23,94736.56,0.0]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-323-cd"}}} diff --git a/tests/fixtures/public/batch/np6-323-cd--rt_price_adder_sced--historical.json b/tests/fixtures/public/batch/np6-323-cd--rt_price_adder_sced--historical.json new file mode 100644 index 00000000..05cc3583 --- /dev/null +++ b/tests/fixtures/public/batch/np6-323-cd--rt_price_adder_sced--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":80007,"pageSize":1,"totalPages":80007,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"rt_price_adder_sced","reportDisplayName":"Real-Time Price Adders by SCED Interval","reportId":"13221","reportEMIL":"NP6-323-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"systemLambda","label":"System Lambda","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPA","label":"RTRDPA","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARUS","label":"RTRDPARUS","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARDS","label":"RTRDPARDS","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARRS","label":"RTRDPARRS","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPAECRS","label":"RTRDPAECRS","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPANSS","label":"RTRDPANSS","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRRUC","label":"RTRRUC","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRRMR","label":"RTRRMR","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDNCLR","label":"RTDNCLR","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDERS","label":"RTDERS","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDCTIEIMPORT","label":"RTDCTIEIMPORT","cardinality":14,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDCTIEEXPORT","label":"RTDCTIEEXPORT","cardinality":15,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTBLTIMPORT","label":"RTBLTIMPORT","cardinality":16,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTBLTEXPORT","label":"RTBLTEXPORT","cardinality":17,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTOLLSL","label":"RTOLLSL","cardinality":18,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTOLHSL","label":"RTOLHSL","cardinality":19,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDLL","label":"RTDLL","cardinality":20,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2025-12-05T00:10:17",false,38.9473,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,12254.45,73375.55,null]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-323-cd"}}} diff --git a/tests/fixtures/public/batch/np6-324-cd--rt_15min_price_adders--current.json b/tests/fixtures/public/batch/np6-324-cd--rt_15min_price_adders--current.json new file mode 100644 index 00000000..0f05a9c5 --- /dev/null +++ b/tests/fixtures/public/batch/np6-324-cd--rt_15min_price_adders--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":26370,"pageSize":1,"totalPages":26370,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"rt_15min_price_adders","reportDisplayName":"Real-Time Price Adders for 15-Minute Settlement Interval","reportId":"13220","reportEMIL":"NP6-324-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPA","label":"RTRDPA","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPRU","label":"RTRDPRU","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPRD","label":"RTRDPRD","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPRRS","label":"RTRDPRRS","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPECRS","label":"RTRDPECRS","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPNS","label":"RTRDPNS","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":10,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05",2,1,0.0,0.0,0.0,0.0,0.0,0.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-324-cd"}}} diff --git a/tests/fixtures/public/batch/np6-324-cd--rt_15min_price_adders--historical.json b/tests/fixtures/public/batch/np6-324-cd--rt_15min_price_adders--historical.json new file mode 100644 index 00000000..106a9895 --- /dev/null +++ b/tests/fixtures/public/batch/np6-324-cd--rt_15min_price_adders--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":26370,"pageSize":1,"totalPages":26370,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"rt_15min_price_adders","reportDisplayName":"Real-Time Price Adders for 15-Minute Settlement Interval","reportId":"13220","reportEMIL":"NP6-324-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPA","label":"RTRDPA","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPRU","label":"RTRDPRU","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPRD","label":"RTRDPRD","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPRRS","label":"RTRDPRRS","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPECRS","label":"RTRDPECRS","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPNS","label":"RTRDPNS","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":10,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2025-12-05",2,4,0.0,0.0,0.0,0.0,0.0,0.0,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-324-cd"}}} diff --git a/tests/fixtures/public/batch/np6-325-cd--rtd_price_adders--current.json b/tests/fixtures/public/batch/np6-325-cd--rtd_price_adders--current.json new file mode 100644 index 00000000..fe8f392a --- /dev/null +++ b/tests/fixtures/public/batch/np6-325-cd--rtd_price_adders--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":903647,"pageSize":1,"totalPages":903647,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"RTDTimestamp: DESC"}},"report":{"reportName":"rtd_price_adders","reportDisplayName":"RTD Indicative Price Adders","reportId":"13222","reportEMIL":"NP6-325-CD","downloadLimit":1000000},"fields":[{"name":"RTDTimestamp","label":"RTD Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"intervalID","label":"Interval ID","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalEnding","label":"Interval Ending","cardinality":4,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"IERepeatHourFlag","label":"IE Repeated Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"systemLambda","label":"System Lambda","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPA","label":"RTRDPA","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARUS","label":"RTRDPARUS","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARDS","label":"RTRDPARDS","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARRS","label":"RTRDPARRS","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPAECRS","label":"RTRDPAECRS","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPANSS","label":"RTRDPANSS","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRRUC","label":"RTRRUC","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRRMR","label":"RTRRMR","cardinality":14,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDNCLR","label":"RTDNCLR","cardinality":15,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDERS","label":"RTDERS","cardinality":16,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDCTIEImport","label":"RTDCTIEIMPORT","cardinality":17,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDCTIEExport","label":"RTDCTIEEXPORT","cardinality":18,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTBLTImport","label":"RTBLTIMPORT","cardinality":19,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTBLTExport","label":"RTBLTEXPORT","cardinality":20,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTOLLSL","label":"RTOLLSL","cardinality":21,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTOLHSL","label":"RTOLHSL","cardinality":22,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDLL","label":"RTDLL","cardinality":23,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:03",false,1,"2026-09-05T19:30:00",false,52.0455,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,12970.83,94308.65,0.0]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-325-cd"}}} diff --git a/tests/fixtures/public/batch/np6-325-cd--rtd_price_adders--historical.json b/tests/fixtures/public/batch/np6-325-cd--rtd_price_adders--historical.json new file mode 100644 index 00000000..671da2d5 --- /dev/null +++ b/tests/fixtures/public/batch/np6-325-cd--rtd_price_adders--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":903647,"pageSize":1,"totalPages":903647,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"RTDTimestamp: ASC"}},"report":{"reportName":"rtd_price_adders","reportDisplayName":"RTD Indicative Price Adders","reportId":"13222","reportEMIL":"NP6-325-CD","downloadLimit":1000000},"fields":[{"name":"RTDTimestamp","label":"RTD Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"intervalID","label":"Interval ID","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalEnding","label":"Interval Ending","cardinality":4,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"IERepeatHourFlag","label":"IE Repeated Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"systemLambda","label":"System Lambda","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPA","label":"RTRDPA","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARUS","label":"RTRDPARUS","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARDS","label":"RTRDPARDS","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPARRS","label":"RTRDPARRS","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPAECRS","label":"RTRDPAECRS","cardinality":11,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPANSS","label":"RTRDPANSS","cardinality":12,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRRUC","label":"RTRRUC","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRRMR","label":"RTRRMR","cardinality":14,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDNCLR","label":"RTDNCLR","cardinality":15,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDERS","label":"RTDERS","cardinality":16,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDCTIEImport","label":"RTDCTIEIMPORT","cardinality":17,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDCTIEExport","label":"RTDCTIEEXPORT","cardinality":18,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTBLTImport","label":"RTBLTIMPORT","cardinality":19,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTBLTExport","label":"RTBLTEXPORT","cardinality":20,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTOLLSL","label":"RTOLLSL","cardinality":21,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTOLHSL","label":"RTOLHSL","cardinality":22,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTDLL","label":"RTDLL","cardinality":23,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2025-12-05T00:00:03",false,11,"2025-12-05T00:55:00",false,39.2966,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,null]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-325-cd"}}} diff --git a/tests/fixtures/public/batch/np6-326-cd--rt_price_sog--current.json b/tests/fixtures/public/batch/np6-326-cd--rt_price_sog--current.json new file mode 100644 index 00000000..6e587618 --- /dev/null +++ b/tests/fixtures/public/batch/np6-326-cd--rt_price_sog--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":5577846,"pageSize":1,"totalPages":5577846,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"rt_price_sog","reportDisplayName":"Real-Time Price for SOG","reportId":"21115","reportEMIL":"NP6-326-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"resourceType","label":"Resource Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceName","label":"Resource Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterName","label":"Meter Name","cardinality":6,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterPrice","label":"Meter Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05",15,2,"SODG","DG_FREIH_2UNITS","1013418001WMRENB1",44.35,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-326-cd"}}} diff --git a/tests/fixtures/public/batch/np6-326-cd--rt_price_sog--historical.json b/tests/fixtures/public/batch/np6-326-cd--rt_price_sog--historical.json new file mode 100644 index 00000000..69770d45 --- /dev/null +++ b/tests/fixtures/public/batch/np6-326-cd--rt_price_sog--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":5577846,"pageSize":1,"totalPages":5577846,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"rt_price_sog","reportDisplayName":"Real-Time Price for SOG","reportId":"21115","reportEMIL":"NP6-326-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInterval","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"resourceType","label":"Resource Type","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceName","label":"Resource Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterName","label":"Meter Name","cardinality":6,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterPrice","label":"Meter Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-04-30",15,1,"SODG","HEBTEMPL_MMILL","10443720008934617",54.27,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-326-cd"}}} diff --git a/tests/fixtures/public/batch/np6-327-cd--lmp_sog_price_adders--current.json b/tests/fixtures/public/batch/np6-327-cd--lmp_sog_price_adders--current.json new file mode 100644 index 00000000..e326863e --- /dev/null +++ b/tests/fixtures/public/batch/np6-327-cd--lmp_sog_price_adders--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":35961486,"pageSize":1,"totalPages":35961486,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"lmp_sog_price_adders","reportDisplayName":"LMP By SOG Including Price Adders","reportId":"21114","reportEMIL":"NP6-327-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceType","label":"Resource Type","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceName","label":"Resource Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"stationName","label":"Station Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"voltageLevel","label":"Voltage Level","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"meterName","label":"Meter Name","cardinality":7,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterLMP","label":"Meter LMP","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPA","label":"RTRDPA","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"finalLMP","label":"Final LMP","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:23",false,"SOTG","CANYHY_CANYHYG2","CANYHY",138.0,"LCRCANYGP0100",54.06,0.0,54.06]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-327-cd"}}} diff --git a/tests/fixtures/public/batch/np6-327-cd--lmp_sog_price_adders--historical.json b/tests/fixtures/public/batch/np6-327-cd--lmp_sog_price_adders--historical.json new file mode 100644 index 00000000..f8c6796a --- /dev/null +++ b/tests/fixtures/public/batch/np6-327-cd--lmp_sog_price_adders--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":35961486,"pageSize":1,"totalPages":35961486,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"lmp_sog_price_adders","reportDisplayName":"LMP By SOG Including Price Adders","reportId":"21114","reportEMIL":"NP6-327-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceType","label":"Resource Type","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"resourceName","label":"Resource Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"stationName","label":"Station Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"voltageLevel","label":"Voltage Level","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"meterName","label":"Meter Name","cardinality":7,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"meterLMP","label":"Meter LMP","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RTRDPA","label":"RTRDPA","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"finalLMP","label":"Final LMP","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2025-12-05T00:10:17",false,"SODG","19599_1_PV_A1","BLMND",138.0,"10443720004133031",28.89,0.0,28.89]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-327-cd"}}} diff --git a/tests/fixtures/public/batch/np6-328-cd--tot_as_res_cap--current.json b/tests/fixtures/public/batch/np6-328-cd--tot_as_res_cap--current.json new file mode 100644 index 00000000..26087189 --- /dev/null +++ b/tests/fixtures/public/batch/np6-328-cd--tot_as_res_cap--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":145031,"pageSize":1,"totalPages":145031,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"tot_as_res_cap","reportDisplayName":"Total Capability of Resources Available to Provide Ancillary Service","reportId":"24887","reportEMIL":"NP6-328-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Time Stamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"capREGUP","label":"CapREGUPTotal","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capREGDN","label":"CapREGDNTotal","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capRRS","label":"CapRRSTotal","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capECRS","label":"CapECRSTotal","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capNSPIN","label":"CapNSPINTotal","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capREGUPRRS","label":"CapREGUP_RRSTotal","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capREGUPRRSECRS","label":"CapREGUP_RRS_ECRSTotal","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capREGUPRRSECRSNSPIN","label":"CapREGUP_RRS_ECRS_NSPINTotal","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:23",false,31244.5,20397.7,24360.9,27024.6,17477.8,38997.5,43918.7,49573.1]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-328-cd"}}} diff --git a/tests/fixtures/public/batch/np6-328-cd--tot_as_res_cap--historical.json b/tests/fixtures/public/batch/np6-328-cd--tot_as_res_cap--historical.json new file mode 100644 index 00000000..39e27fe5 --- /dev/null +++ b/tests/fixtures/public/batch/np6-328-cd--tot_as_res_cap--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":145031,"pageSize":1,"totalPages":145031,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"tot_as_res_cap","reportDisplayName":"Total Capability of Resources Available to Provide Ancillary Service","reportId":"24887","reportEMIL":"NP6-328-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Time Stamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"capREGUP","label":"CapREGUPTotal","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capREGDN","label":"CapREGDNTotal","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capRRS","label":"CapRRSTotal","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capECRS","label":"CapECRSTotal","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capNSPIN","label":"CapNSPINTotal","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capREGUPRRS","label":"CapREGUP_RRSTotal","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capREGUPRRSECRS","label":"CapREGUP_RRS_ECRSTotal","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"capREGUPRRSECRSNSPIN","label":"CapREGUP_RRS_ECRS_NSPINTotal","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2025-12-04T23:45:16",false,17467.1,12833.7,15920.6,16069.9,17461.9,25063.6,30106.1,39599.4]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-328-cd"}}} diff --git a/tests/fixtures/public/batch/np6-329-cd--rtd_ind_mcpc--current.json b/tests/fixtures/public/batch/np6-329-cd--rtd_ind_mcpc--current.json new file mode 100644 index 00000000..02941ae1 --- /dev/null +++ b/tests/fixtures/public/batch/np6-329-cd--rtd_ind_mcpc--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":903867,"pageSize":1,"totalPages":903867,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"RTDTimestamp: DESC"}},"report":{"reportName":"rtd_ind_mcpc","reportDisplayName":"RTD Indicative Real-Time MCPC","reportId":"24889","reportEMIL":"NP6-329-CD","downloadLimit":1000000},"fields":[{"name":"RTDTimestamp","label":"RTD Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"intervalId","label":"Interval ID","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalEnding","label":"Interval Ending","cardinality":4,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalRepeatHourFlag","label":"Interval Ending Repeat Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"REGUP","label":"REGUP","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"REGDN","label":"REGDN","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RRS","label":"RRS","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ECRS","label":"ECRS","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"NSPIN","label":"NSPIN","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:03",false,1,"2026-09-05T19:30:00",false,0.9,0.0,0.51,1.0,3.96]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-329-cd"}}} diff --git a/tests/fixtures/public/batch/np6-329-cd--rtd_ind_mcpc--historical.json b/tests/fixtures/public/batch/np6-329-cd--rtd_ind_mcpc--historical.json new file mode 100644 index 00000000..9eb12d8b --- /dev/null +++ b/tests/fixtures/public/batch/np6-329-cd--rtd_ind_mcpc--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":903867,"pageSize":1,"totalPages":903867,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"RTDTimestamp: ASC"}},"report":{"reportName":"rtd_ind_mcpc","reportDisplayName":"RTD Indicative Real-Time MCPC","reportId":"24889","reportEMIL":"NP6-329-CD","downloadLimit":1000000},"fields":[{"name":"RTDTimestamp","label":"RTD Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"intervalId","label":"Interval ID","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalEnding","label":"Interval Ending","cardinality":4,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalRepeatHourFlag","label":"Interval Ending Repeat Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"REGUP","label":"REGUP","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"REGDN","label":"REGDN","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"RRS","label":"RRS","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"ECRS","label":"ECRS","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"NSPIN","label":"NSPIN","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2025-12-05T00:00:03",false,11,"2025-12-05T00:55:00",false,2.9,8.96,0.59,0.59,2.31]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-329-cd"}}} diff --git a/tests/fixtures/public/batch/np6-331-cd--rt_clear_price_cap--current.json b/tests/fixtures/public/batch/np6-331-cd--rt_clear_price_cap--current.json new file mode 100644 index 00000000..d457e082 --- /dev/null +++ b/tests/fixtures/public/batch/np6-331-cd--rt_clear_price_cap--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":118465,"pageSize":1,"totalPages":118465,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: DESC"}},"report":{"reportName":"rt_clear_price_cap","reportDisplayName":"Real-Time Clearing Prices for Capacity for 15-Minute Settlement Interval","reportId":"24898","reportEMIL":"NP6-331-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInt","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":4,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"ASType","label":"AS Type","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"MCPC","label":"MCPC","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05",9,4,false,"ECRS",0.01]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-331-cd"}}} diff --git a/tests/fixtures/public/batch/np6-331-cd--rt_clear_price_cap--historical.json b/tests/fixtures/public/batch/np6-331-cd--rt_clear_price_cap--historical.json new file mode 100644 index 00000000..2fb91e69 --- /dev/null +++ b/tests/fixtures/public/batch/np6-331-cd--rt_clear_price_cap--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":118465,"pageSize":1,"totalPages":118465,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"deliveryDate: ASC"}},"report":{"reportName":"rt_clear_price_cap","reportDisplayName":"Real-Time Clearing Prices for Capacity for 15-Minute Settlement Interval","reportId":"24898","reportEMIL":"NP6-331-CD","downloadLimit":1000000},"fields":[{"name":"deliveryDate","label":"Delivery Date","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryHour","label":"Delivery Hour","cardinality":2,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"deliveryInt","label":"Delivery Interval","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":4,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"ASType","label":"AS Type","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"MCPC","label":"MCPC","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2025-12-04",24,4,false,"RRS",9.37]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-331-cd"}}} diff --git a/tests/fixtures/public/batch/np6-332-cd--rt_clear_price_cap_sced--current.json b/tests/fixtures/public/batch/np6-332-cd--rt_clear_price_cap_sced--current.json new file mode 100644 index 00000000..66d4da26 --- /dev/null +++ b/tests/fixtures/public/batch/np6-332-cd--rt_clear_price_cap_sced--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":400155,"pageSize":1,"totalPages":400155,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"rt_clear_price_cap_sced","reportDisplayName":"Real-Time Clearing Prices for Capacity by SCED Interval","reportId":"24891","reportEMIL":"NP6-332-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"ASType","label":"AS Type","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedMCPC","label":"Capped MCPC","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedMCPC","label":"Uncapped MCPC","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:23",false,"ECRS",0.37,0.37]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-332-cd"}}} diff --git a/tests/fixtures/public/batch/np6-332-cd--rt_clear_price_cap_sced--historical.json b/tests/fixtures/public/batch/np6-332-cd--rt_clear_price_cap_sced--historical.json new file mode 100644 index 00000000..6ea39b0f --- /dev/null +++ b/tests/fixtures/public/batch/np6-332-cd--rt_clear_price_cap_sced--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":400155,"pageSize":1,"totalPages":400155,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"rt_clear_price_cap_sced","reportDisplayName":"Real-Time Clearing Prices for Capacity by SCED Interval","reportId":"24891","reportEMIL":"NP6-332-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"ASType","label":"AS Type","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedMCPC","label":"Capped MCPC","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedMCPC","label":"Uncapped MCPC","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2025-12-05T00:05:17",false,"RRS",0.24,null]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-332-cd"}}} diff --git a/tests/fixtures/public/batch/np6-346-cd--act_sys_load_by_fzn--current.json b/tests/fixtures/public/batch/np6-346-cd--act_sys_load_by_fzn--current.json new file mode 100644 index 00000000..7fb8bab6 --- /dev/null +++ b/tests/fixtures/public/batch/np6-346-cd--act_sys_load_by_fzn--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":23951,"pageSize":1,"totalPages":23951,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"operatingDay: DESC"}},"report":{"reportName":"act_sys_load_by_fzn","reportDisplayName":"Actual System Load by Forecast Zone","reportId":"14836","reportEMIL":"NP6-346-CD","downloadLimit":2000000},"fields":[{"name":"operatingDay","label":"Operating Day","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"north","label":"North","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"south","label":"South","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"houston","label":"Houston","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"total","label":"Total","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-04","01:00",20729.36,17998.59,10322.72,15048.82,64099.49,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-346-cd"}}} diff --git a/tests/fixtures/public/batch/np6-346-cd--act_sys_load_by_fzn--historical.json b/tests/fixtures/public/batch/np6-346-cd--act_sys_load_by_fzn--historical.json new file mode 100644 index 00000000..69904ca2 --- /dev/null +++ b/tests/fixtures/public/batch/np6-346-cd--act_sys_load_by_fzn--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":23951,"pageSize":1,"totalPages":23951,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"operatingDay: ASC"}},"report":{"reportName":"act_sys_load_by_fzn","reportDisplayName":"Actual System Load by Forecast Zone","reportId":"14836","reportEMIL":"NP6-346-CD","downloadLimit":2000000},"fields":[{"name":"operatingDay","label":"Operating Day","cardinality":1,"dataType":"DATE","searchable":true,"sortable":true,"hasRange":true},{"name":"hourEnding","label":"Hour Ending","cardinality":2,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"north","label":"North","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"south","label":"South","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"west","label":"West","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"houston","label":"Houston","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"total","label":"Total","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"DSTFlag","label":"DST Flag","cardinality":8,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-12-11","24:00",14556.71,11238.94,7819.59,10975.92,44591.16,false]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-346-cd"}}} diff --git a/tests/fixtures/public/batch/np6-787-cd--lmp_electrical_bus--current.json b/tests/fixtures/public/batch/np6-787-cd--lmp_electrical_bus--current.json new file mode 100644 index 00000000..3c8cd21a --- /dev/null +++ b/tests/fixtures/public/batch/np6-787-cd--lmp_electrical_bus--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":4592823,"pageSize":1,"totalPages":4592823,"currentPage":1,"query":{"parameterCount":2,"parameters":{"SCEDTimestampFrom":"2026-09-05T00:00:00","SCEDTimestampTo":"2026-09-05T23:59:59"},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"lmp_electrical_bus","reportDisplayName":"LMP by Electrical Bus","reportId":"11485","reportEMIL":"NP6-787-CD","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"electricalBus","label":"Electrical Bus","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedLMP","label":"Capped LMP","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedLMP","label":"Uncapped LMP","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:23",false,"LD_PUN",46.86,46.86]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-787-cd"}}} diff --git a/tests/fixtures/public/batch/np6-787-cd--lmp_electrical_bus--historical.json b/tests/fixtures/public/batch/np6-787-cd--lmp_electrical_bus--historical.json new file mode 100644 index 00000000..44f98135 --- /dev/null +++ b/tests/fixtures/public/batch/np6-787-cd--lmp_electrical_bus--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":4592823,"pageSize":1,"totalPages":4592823,"currentPage":1,"query":{"parameterCount":2,"parameters":{"SCEDTimestampFrom":"2026-09-05T00:00:00","SCEDTimestampTo":"2026-09-05T23:59:59"},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"lmp_electrical_bus","reportDisplayName":"LMP by Electrical Bus","reportId":"11485","reportEMIL":"NP6-787-CD","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"electricalBus","label":"Electrical Bus","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"cappedLMP","label":"Capped LMP","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"uncappedLMP","label":"Uncapped LMP","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T00:00:20",false,"FERGCC_GT2",36.14,36.14]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-787-cd"}}} diff --git a/tests/fixtures/public/batch/np6-788-cd--lmp_node_zone_hub--current.json b/tests/fixtures/public/batch/np6-788-cd--lmp_node_zone_hub--current.json new file mode 100644 index 00000000..76f7f771 --- /dev/null +++ b/tests/fixtures/public/batch/np6-788-cd--lmp_node_zone_hub--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":266151,"pageSize":1,"totalPages":266151,"currentPage":1,"query":{"parameterCount":2,"parameters":{"SCEDTimestampFrom":"2026-09-05T00:00:00","SCEDTimestampTo":"2026-09-05T23:59:59"},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"lmp_node_zone_hub","reportDisplayName":"LMPs by Resource Nodes, Load Zones and Trading Hubs","reportId":"12300","reportEMIL":"NP6-788-CD","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Time Stamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMP","label":"LMP","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:23",false,"7RNCHSLR_ALL",49.88]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-788-cd"}}} diff --git a/tests/fixtures/public/batch/np6-788-cd--lmp_node_zone_hub--historical.json b/tests/fixtures/public/batch/np6-788-cd--lmp_node_zone_hub--historical.json new file mode 100644 index 00000000..23569ac6 --- /dev/null +++ b/tests/fixtures/public/batch/np6-788-cd--lmp_node_zone_hub--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":266151,"pageSize":1,"totalPages":266151,"currentPage":1,"query":{"parameterCount":2,"parameters":{"SCEDTimestampFrom":"2026-09-05T00:00:00","SCEDTimestampTo":"2026-09-05T23:59:59"},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"lmp_node_zone_hub","reportDisplayName":"LMPs by Resource Nodes, Load Zones and Trading Hubs","reportId":"12300","reportEMIL":"NP6-788-CD","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Time Stamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":3,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMP","label":"LMP","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T00:00:20",false,"ZIER_SLR_ALL",36.14]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-788-cd"}}} diff --git a/tests/fixtures/public/batch/np6-86-cd--shdw_prices_bnd_trns_const--current.json b/tests/fixtures/public/batch/np6-86-cd--shdw_prices_bnd_trns_const--current.json new file mode 100644 index 00000000..588756e4 --- /dev/null +++ b/tests/fixtures/public/batch/np6-86-cd--shdw_prices_bnd_trns_const--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":3085690,"pageSize":1,"totalPages":3085690,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"shdw_prices_bnd_trns_const","reportDisplayName":"SCED Shadow Prices and Binding Transmission Constraints","reportId":"12302","reportEMIL":"NP6-86-CD","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"constraintID","label":"Constraint Id","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintName","label":"Constraint Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"contingencyName","label":"Contingency Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"shadowPrice","label":"Shadow Price","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"maxShadowPrice","label":"Max Shadow Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"limit","label":"Limit","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"value","label":"Value","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"violatedMW","label":"Violated MW","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"fromStation","label":"From Station","cardinality":11,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"toStation","label":"To Station","cardinality":12,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"fromStationkV","label":"From Station kV","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"toStationkV","label":"To Station kV","cardinality":14,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"CCTStatus","label":"CCT Status","cardinality":15,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false}],"data":[["2026-09-05T18:55:21",false,4,"HECKER_RESNIK1_1","DMCDUPS8",3.76556,3500.0,240.2,240.2,0.0,"HECKER","RESNIK",138.0,138.0,"NONCOMP"]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-86-cd"}}} diff --git a/tests/fixtures/public/batch/np6-86-cd--shdw_prices_bnd_trns_const--historical.json b/tests/fixtures/public/batch/np6-86-cd--shdw_prices_bnd_trns_const--historical.json new file mode 100644 index 00000000..9392f4ff --- /dev/null +++ b/tests/fixtures/public/batch/np6-86-cd--shdw_prices_bnd_trns_const--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":3085690,"pageSize":1,"totalPages":3085690,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"shdw_prices_bnd_trns_const","reportDisplayName":"SCED Shadow Prices and Binding Transmission Constraints","reportId":"12302","reportEMIL":"NP6-86-CD","downloadLimit":2000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatedHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"constraintID","label":"Constraint Id","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"constraintName","label":"Constraint Name","cardinality":4,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"contingencyName","label":"Contingency Name","cardinality":5,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"shadowPrice","label":"Shadow Price","cardinality":6,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"maxShadowPrice","label":"Max Shadow Price","cardinality":7,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"limit","label":"Limit","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"value","label":"Value","cardinality":9,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"violatedMW","label":"Violated MW","cardinality":10,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"fromStation","label":"From Station","cardinality":11,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"toStation","label":"To Station","cardinality":12,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"fromStationkV","label":"From Station kV","cardinality":13,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"toStationkV","label":"To Station kV","cardinality":14,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"CCTStatus","label":"CCT Status","cardinality":15,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false}],"data":[["2023-12-11T14:00:24",false,1,"CBY_AT3","DCHBJO25",0.0,4500.0,894.2,847.2,-47.0,"CBY","CBY",345.0,1.0,"COMP"]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-86-cd"}}} diff --git a/tests/fixtures/public/batch/np6-915-cd--sum_hdl_ldl--current.json b/tests/fixtures/public/batch/np6-915-cd--sum_hdl_ldl--current.json new file mode 100644 index 00000000..553428b0 --- /dev/null +++ b/tests/fixtures/public/batch/np6-915-cd--sum_hdl_ldl--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":37205,"pageSize":1,"totalPages":37205,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: DESC"}},"report":{"reportName":"sum_hdl_ldl","reportDisplayName":"Summary Report of HDL and LDL","reportId":"13081","reportEMIL":"NP6-915-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"GTBD","label":"Generation To Be Dispatched","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"sumHDL","label":"Sum Of High Dispatch Limit","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"sumLDL","label":"Sum Of Low Dispatch Limit","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:25:23",false,80624.9,91616.4,34840.1]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-915-cd"}}} diff --git a/tests/fixtures/public/batch/np6-915-cd--sum_hdl_ldl--historical.json b/tests/fixtures/public/batch/np6-915-cd--sum_hdl_ldl--historical.json new file mode 100644 index 00000000..0351a670 --- /dev/null +++ b/tests/fixtures/public/batch/np6-915-cd--sum_hdl_ldl--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":37205,"pageSize":1,"totalPages":37205,"currentPage":1,"query":{"parameterCount":0,"parameters":{},"sortedBy":"SCEDTimestamp: ASC"}},"report":{"reportName":"sum_hdl_ldl","reportDisplayName":"Summary Report of HDL and LDL","reportId":"13081","reportEMIL":"NP6-915-CD","downloadLimit":1000000},"fields":[{"name":"SCEDTimestamp","label":"SCED Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeated Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"GTBD","label":"Generation To Be Dispatched","cardinality":3,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"sumHDL","label":"Sum Of High Dispatch Limit","cardinality":4,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true},{"name":"sumLDL","label":"Sum Of Low Dispatch Limit","cardinality":5,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-04-30T11:10:19",false,53549.7,72718.9,23091.2]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-915-cd"}}} diff --git a/tests/fixtures/public/batch/np6-970-cd--rtd_lmp_node_zone_hub--current.json b/tests/fixtures/public/batch/np6-970-cd--rtd_lmp_node_zone_hub--current.json new file mode 100644 index 00000000..2e5ba29d --- /dev/null +++ b/tests/fixtures/public/batch/np6-970-cd--rtd_lmp_node_zone_hub--current.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":6279816,"pageSize":1,"totalPages":6279816,"currentPage":1,"query":{"parameterCount":2,"parameters":{"RTDTimestampFrom":"2026-09-05T00:00:00","RTDTimestampTo":"2026-09-05T23:59:59"},"sortedBy":"RTDTimestamp: DESC"}},"report":{"reportName":"rtd_lmp_node_zone_hub","reportDisplayName":"RTD Indicative LMPs by Resource Nodes, Load Zones and Hubs","reportId":"13073","reportEMIL":"NP6-970-CD","downloadLimit":2000000},"fields":[{"name":"RTDTimestamp","label":"RTD Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"intervalId","label":"Interval Id","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalEnding","label":"Interval Ending","cardinality":4,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalRepeatHourFlag","label":"Interval Repeat Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":6,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPointType","label":"Settlement Point Type","cardinality":7,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMP","label":"LMP","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T19:20:03",false,10,"2026-09-05T20:10:00",false,"HOPKNSLR_ALL","RN",1861.68]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-970-cd"}}} diff --git a/tests/fixtures/public/batch/np6-970-cd--rtd_lmp_node_zone_hub--historical.json b/tests/fixtures/public/batch/np6-970-cd--rtd_lmp_node_zone_hub--historical.json new file mode 100644 index 00000000..d2fdf4f9 --- /dev/null +++ b/tests/fixtures/public/batch/np6-970-cd--rtd_lmp_node_zone_hub--historical.json @@ -0,0 +1 @@ +{"_meta":{"totalRecords":6279816,"pageSize":1,"totalPages":6279816,"currentPage":1,"query":{"parameterCount":2,"parameters":{"RTDTimestampFrom":"2026-09-05T00:00:00","RTDTimestampTo":"2026-09-05T23:59:59"},"sortedBy":"RTDTimestamp: ASC"}},"report":{"reportName":"rtd_lmp_node_zone_hub","reportDisplayName":"RTD Indicative LMPs by Resource Nodes, Load Zones and Hubs","reportId":"13073","reportEMIL":"NP6-970-CD","downloadLimit":2000000},"fields":[{"name":"RTDTimestamp","label":"RTD Timestamp","cardinality":1,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"repeatHourFlag","label":"Repeat Hour Flag","cardinality":2,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"intervalId","label":"Interval Id","cardinality":3,"dataType":"INTEGER","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalEnding","label":"Interval Ending","cardinality":4,"dataType":"DATETIME","searchable":true,"sortable":true,"hasRange":true},{"name":"intervalRepeatHourFlag","label":"Interval Repeat Hour Flag","cardinality":5,"dataType":"BOOLEAN","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPoint","label":"Settlement Point","cardinality":6,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"settlementPointType","label":"Settlement Point Type","cardinality":7,"dataType":"VARCHAR","searchable":true,"sortable":true,"hasRange":false},{"name":"LMP","label":"LMP","cardinality":8,"dataType":"DOUBLE","searchable":true,"sortable":true,"hasRange":true}],"data":[["2026-09-05T00:00:03",false,20,"2026-09-05T01:40:00",false,"COYOTSPR_RN","RN",29.42]],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub"},"parent":{"href":"https://api.ercot.com/api/public-reports/np6-970-cd"}}} diff --git a/tests/fixtures/public/batch/root.json b/tests/fixtures/public/batch/root.json new file mode 100644 index 00000000..6cf87ede --- /dev/null +++ b/tests/fixtures/public/batch/root.json @@ -0,0 +1 @@ +{"_embedded":{"products":[{"emilId":"COPG-316","name":"Load Estimation Counts - Public","description":"Counts of ESIIDs and percentages of counts by MRE settled with actual meter data, estimated using historical meter data, and estimated using default load.","status":"Active","reportTypeId":11130,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2010-12-08","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"csv","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2026-09-05T09:34:36","bundle":0,"protocolRules":{"NP8":"https://www.ercot.com/mp/data-products?protocolRules=NP8","NP8.2(2)(c)(v)":"https://www.ercot.com/mp/data-products?protocolRules=NP8.2(2)(c)(v)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/copg-316"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/copg-316"}}},{"emilId":"EIA-930-CD","name":"Hourly Balancing Authority Operations Report","description":"Hourly Balancing Authority Operations Report","status":"Active","reportTypeId":13457,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2015-02-05","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"csv","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:05:00","bundle":0,"protocolRules":{"EIA-930":"https://www.ercot.com/mp/data-products?protocolRules=EIA-930"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/eia-930-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/eia-930-cd"}}},{"emilId":"EIA-930-ER","name":"Daily Balancing Authority Operations Report","description":"Daily Balancing Authority Operations Report","status":"Active","reportTypeId":13458,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2024-10-29","firstRun":"2015-02-08","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"csv","ddlName":"","misDisplayDuration":365,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2026-09-05T02:28:41","bundle":1,"protocolRules":{"EIA-930":"https://www.ercot.com/mp/data-products?protocolRules=EIA-930"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/eia-930-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/eia-930-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/eia-930-er"}}},{"emilId":"GEN-55-CD","name":"Hourly Real-Time Load vs. Actual Report","description":"Load Forecast vs. Actual. Day-ahead values update once a day approx 1:30.","status":"Active","reportTypeId":13499,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-09-30","firstRun":"2015-12-09","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:20:00","bundle":1,"protocolRules":{"NP6.3.2(3)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(3)(b)"},"artifacts":[{"reportTypeId":13499,"displayName":"Hourly Real-Time Load vs. Actual Report","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/gen-55-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/gen-55-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/gen-55-cd"}}},{"emilId":"NP1-300","name":"Confidentiality Expired Adjusted Meter Load Report","description":"AML for each QSE by LSE, by Load Zone and by Settlement Interval, both from the initial settlement and all subsequent settlements, 180 days after the Operating Day.","status":"Active","reportTypeId":12360,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2011-05-28","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"csv","ddlName":null,"misDisplayDuration":184,"archiveDuration":2555,"notificationType":null,"contentType":"BINARY","downloadLimit":365,"lastPostDatetime":"2026-09-05T09:34:19","bundle":1,"protocolRules":{"NP1.3.1.1(h)":"https://www.ercot.com/mp/data-products?protocolRules=NP1.3.1.1(h)","NP1.3.1.4(3)":"https://www.ercot.com/mp/data-products?protocolRules=NP1.3.1.4(3)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np1-300"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np1-300"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np1-300"}}},{"emilId":"NP1-301","name":"60-Day COP Adjustment Period Snapshot","description":"Complete Current Operating Plan (COP) data for each QSE snapshot on each hour; confidentiality expired 60 day data. Previously named Complete Current Operating Plan Data.","status":"Active","reportTypeId":10038,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2024-09-17","firstRun":"2011-01-29","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":1462,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":500,"lastPostDatetime":"2026-09-05T04:17:56","bundle":1,"protocolRules":{"NP8.1(3)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP8.1(3)(i)","NP1.3.1.4(2)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP1.3.1.4(2)(b)"},"artifacts":[{"reportTypeId":10038,"displayName":"60-Day COP Adjustment Period Snapshot","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np1-301/60_cop_adj_period_snapshot"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np1-301"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np1-301"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np1-301"}}},{"emilId":"NP1-302","name":"Ancillary Service Obligations Report","description":"Ancillary Service Obligation Report for each QSE, 180 days after the Operating Day","status":"Active","reportTypeId":10039,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2011-05-29","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T05:02:42","bundle":1,"protocolRules":{"NP1.3.1.4(2)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP1.3.1.4(2)(a)"},"artifacts":[{"reportTypeId":10039,"displayName":"Ancillary Service Obligations Report","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np1-302/as_obligation"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np1-302"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np1-302"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np1-302"}}},{"emilId":"NP1-346-ER","name":"Unplanned Resource Outages Report","description":"This report contains a snapshot of all unplanned Resource outages (i.e., Forced Outages and Maintenance Outages) and derates that were active in the Outage Scheduler at any time on the third day before the posting date of this report. The data for these outages is submitted by operators of generation assets and is used by ERCOT staff in the operation of the Texas power grid. This report does not contain Resource outages for generators that are no longer operational on the Texas power grid or have not begun operating on the Texas power grid. This report contains all outages for Resources that are required to enter outages in the ERCOT Outage Scheduler including Generation Resources in Private Use Networks, and Energy Storage Resources. Some smaller operational derates are not required to be reported.","status":"Active","reportTypeId":22912,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2022-12-08","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,xlsx","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":365,"lastPostDatetime":"2026-09-05T05:01:18","bundle":1,"protocolRules":{"NP3.1.4.8(1)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.1.4.8(1)","NP1.3.1.1(1)(c)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP1.3.1.1(1)(c)(i)","NP12.3(1)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP12.3(1)(b)","NP1.3.1.2(1)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP1.3.1.2(1)(i)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np1-346-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np1-346-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np1-346-er"}}},{"emilId":"NP3-108","name":"Monthly ERCOT Demand Response from Load Resources","description":"The MW of Demand Response that is participating in the past month in Emergency Response Service (ERS), Ancillary Service as a Load Resource, or pilot project permitted by subsection (k) of P.U.C. Subst. R. 25.361, Electric Reliability Council of Texas (ERCOT), by Load Zone.","status":"Active","reportTypeId":13242,"audience":"Public","generationFrequency":"Chron - Monthly","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2014-10-28","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"xlsx","ddlName":"","misDisplayDuration":365,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":365,"lastPostDatetime":"2026-09-04T08:00:58","bundle":0,"protocolRules":{"NP3.10.7.2.1(1)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.10.7.2.1(1)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-108"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-108"}}},{"emilId":"NP3-161-CD","name":"Available Resource Planned Outage Capacity Margin_7 Day Plus","description":"Daily Maximum Resource Capacity Available for Planned Outages for 7 days to 60 months of the Operating Day","status":"Active","reportTypeId":22470,"audience":"Public","generationFrequency":"Chron - Twice each business day","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2022-07-28","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T18:00:08","bundle":1,"protocolRules":{"NP3.1.6.13(1)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.1.6.13(1)(c)"},"artifacts":[{"reportTypeId":22470,"displayName":"Available Resource Planned Outage Capacity Margin_7 Day Plus","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-161-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-161-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-161-cd"}}},{"emilId":"NP3-162-CD","name":"Available Resource Planned Outage Capacity Margin_7 Day","description":"Hourly Maximum Resource Capacity Available for Planned Outages within 7 days of the Operating Day","status":"Active","reportTypeId":22469,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2022-07-28","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:05:03","bundle":1,"protocolRules":{"NP3.1.6.13(1)(d)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.1.6.13(1)(d)"},"artifacts":[{"reportTypeId":22469,"displayName":"Available Resource Planned Outage Capacity Margin_7 Day","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-162-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-162-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-162-cd"}}},{"emilId":"NP3-233-CD","name":"Hourly Resource Outage Capacity","description":"This report includes all approved and accepted Planned, Forced and Maintenance Resource outages EXCEPT Resource outages for retirement of old equipment, seasonal mothballed (during the outaged season), and mothballed. The outage capacity in this report reflects aggregated ACTIVE resource outaged capacity by Load Zone sourced from the Outage Scheduler (OS) for the next 168 hours and is published every hour. Columns ‘C’ - ‘F’ consists of the aggregated outaged capacity of ALL the ACTIVE resource outages by Load Zone in the OS for each hour excluding the outages stated above, IRR resource outages, and new equipment outages. Columns ‘G’ - ‘J’ consists of the aggregated outaged capacity of ALL the ACTIVE IRR resource outages by Load Zone in the OS for each hour excluding the outages stated above, outages in columns ‘C’ - ‘F’ and new equipment outages. Columns ‘K’ - ‘N’ consists of the aggregated outaged capacity of ALL the ACTIVE New Equipment Energization resource outages by Load Zone. Note that this report contains OS data only and does not look at telemetry. It includes both entire resource outage and de-rates.","status":"Active","reportTypeId":13103,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2013-10-20","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:00:47","bundle":1,"protocolRules":{"NP3.2.3(1)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(b)"},"artifacts":[{"reportTypeId":13103,"displayName":"Hourly Resource Outage Capacity","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-233-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-233-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-233-cd"}}},{"emilId":"NP3-257-EX","name":"3-Day Highest Price Bids Selected or Dispatched in SCED","description":"The bid price and the name of the Entity submitting the bid for the highest-priced bid selected or Dispatched by SCED three days after the applicable Operating Day. If multiple Entities submitted the highest-priced bids selected, all Entities shall be identified on the MIS Public Area.","status":"Active","reportTypeId":13230,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2014-06-03","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv","ddlName":null,"misDisplayDuration":180,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T03:13:41","bundle":0,"protocolRules":{"NP3.2.5(8)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(8)"},"artifacts":[{"reportTypeId":13230,"displayName":"3-Day Highest Price Bids Selected or Dispatched in SCED","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-257-ex/3d_high_price_bids_sel_disp_sced"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-257-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-257-ex"}}},{"emilId":"NP3-560-CD","name":"Seven-Day Load Forecast by Forecast Zone","description":"Forecasted hourly demands by Forecast Zone and system total, for the current day and six days forward.","status":"Active","reportTypeId":12311,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-02-21","firstRun":"2010-11-30","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T18:30:00","bundle":1,"protocolRules":{"NP3.12(1)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.12(1)(a)","NP3.2.2(3)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.2(3)","NP4.2.4.1(1)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.4.1(1)(b)","NP3.2.3(1)(d)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(d)","NP6.3.2(3)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(3)(b)"},"artifacts":[{"reportTypeId":12311,"displayName":"Seven-Day Load Forecast by Forecast Zone","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-560-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-560-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-560-cd"}}},{"emilId":"NP3-561-CD","name":"Seven-Day Load Forecast by Weather Zone","description":"Forecasted hourly demands by Weather Zone and system total, for the current day and six days forward.","status":"Active","reportTypeId":12312,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-03-14","firstRun":"2010-11-30","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T18:30:00","bundle":1,"protocolRules":{"NP3.12(1)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.12(1)(a)","NP3.2.2(3)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.2(3)","NP4.2.4.1(1)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.4.1(1)(b)","NP3.2.3(1)(d)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(d)","NP6.3.2(3)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(3)(b)"},"artifacts":[{"reportTypeId":12312,"displayName":"Seven-Day Load Forecast by Weather Zone","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-561-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-561-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-561-cd"}}},{"emilId":"NP3-562-CD","name":"Intra-Hour Load Forecast by Weather Zone","description":"Intra-Hour Load Forecast (IHLF) that provides a rolling two hour, five minute forecast of ERCOT-wide Load by weather zone.","status":"Active","reportTypeId":16553,"audience":"Public","generationFrequency":"Chron - 5 Minutes","securityClassification":"Public","lastUpdated":"2024-02-21","firstRun":"2020-02-06","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:22:00","bundle":1,"protocolRules":{"NP3.12(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.12(2)"},"artifacts":[{"reportTypeId":16553,"displayName":"Intra-Hour Load Forecast by Weather Zone","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-562-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-562-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-562-cd"}}},{"emilId":"NP3-565-CD","name":"Seven-Day Load Forecast by Model and Weather Zone","description":"Hourly system-wide Mid-Term Load Forecasts (MTLFs) for all forecast models with an indicator for which forecast was in use by ERCOT at the time of publication for current day plus the next 7.","status":"Active","reportTypeId":14837,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2017-06-28","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T18:30:00","bundle":1,"protocolRules":{"NP6.3.2(3)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(3)(b)"},"artifacts":[{"reportTypeId":14837,"displayName":"Seven-Day Load Forecast by Model and Weather Zone","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-565-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-565-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-565-cd"}}},{"emilId":"NP3-566-CD","name":"Seven-Day Load Forecast by Model and Study Area","description":"Forecasted hourly demands by Study Area, for the current day plus the next seven days.","status":"Active","reportTypeId":15953,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2019-02-06","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T18:30:00","bundle":1,"protocolRules":{"NP3.12.2":"https://www.ercot.com/mp/data-products?protocolRules=NP3.12.2","NP3.12.3":"https://www.ercot.com/mp/data-products?protocolRules=NP3.12.3","NP4.2.4.1(1)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.4.1(1)(b)"},"artifacts":[{"reportTypeId":15953,"displayName":"Seven-Day Load Forecast by Model and Study Area","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-566-cd/lf_by_model_study_area"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-566-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-566-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-566-cd"}}},{"emilId":"NP3-763-CD","name":"Short-Term System Adequacy Report","description":"The available On-Line Resource capacity for Generation Resources and the available capacity for Load Resources, for each hour of the current day and six days forward.","status":"Active","reportTypeId":12315,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2010-11-23","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:00:55","bundle":1,"protocolRules":{"NP3.2.3(1)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(a)","NP3.2.3(1)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(c)","PUC Substantive Rule §25.506":"https://www.ercot.com/mp/data-products?protocolRules=PUC Substantive Rule §25.506","NP3.2.3(1)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(i)","NP3.2.3(1)(j)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(j)","NP3.2.3(1)(e)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(e)"},"artifacts":[{"reportTypeId":12315,"displayName":"Short-Term System Adequacy","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-763-cd/st_sys_adequacy"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-763-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-763-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-763-cd"}}},{"emilId":"NP3-764-CD","name":"Hourly RUC Online In SCED Offline In COP Report","description":"An hourly RUC report containing the sum of the HSLs of Generation Resources that are online in the most recent SCED execution and indicated as offline in its COP, for each hour of the RUC study period. Online SCED statuses are ONRUC, ON, ONOS, ONTEST, ONEMR, ONOPTOUT, STARTUP, ONSC, ONHOLD, ONL, and OFFQS. Offline COP statuses are OFF, OUT, and EMR.","status":"Active","reportTypeId":15753,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2018-10-24","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T18:27:06","bundle":1,"protocolRules":{"NP3.2.3(1)(g)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(g)"},"artifacts":[{"reportTypeId":15753,"displayName":"Hourly RUC Online in SCED Offline in COP Report","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-764-cd/hrly_ruc_online_sced_offline_cop"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-764-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-764-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-764-cd"}}},{"emilId":"NP3-765-CD","name":"Approved DC Tie Schedules","description":"For each Direct Current Tie (DC Tie), the sum of any ERCOT-approved DC Tie Schedules for each 15-minute interval for the first seven days. The sum shall be displayed as an absolute value and classified as a net import or net export.","status":"Active","reportTypeId":24347,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-08-15","firstRun":"2024-06-27","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"csv,xml,zip","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":500,"lastPostDatetime":"2026-09-05T19:05:00","bundle":1,"protocolRules":{"NP3.2.3(1)(h)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.3(1)(h)"},"artifacts":[{"reportTypeId":24347,"displayName":"Approved DC Tie Schedules","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-765-cd/approved_dctie_schedules"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-765-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-765-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-765-cd"}}},{"emilId":"NP3-906-EX","name":"2-Day SCED Ancillary Service Disclosure","description":"This report will contain all 2-day disclosure data related to Ancillary Services Offers for the Real-Time Market (RTM).","status":"Active","reportTypeId":25814,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T03:32:43","bundle":1,"protocolRules":{"NP3.2.5(1)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(i)"},"artifacts":[{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves NSPIN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_nspin"}}},{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves RRSPFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_rrspfr"}}},{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves REGUP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_regup"}}},{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves REGDN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_regdn"}}},{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves ECRSS","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_ecrss"}}},{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves NSPNM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_nspnm"}}},{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves RRSUFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_rrsufr"}}},{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves ECRSM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_ecrsm"}}},{"reportTypeId":25814,"displayName":"2-Day Aggregate SCED Ancillary Offer Curves RRSFFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex/2day_agg_sced_as_offers_rrsffr"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-906-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-906-ex"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-906-ex"}}},{"emilId":"NP3-907-EX","name":"2-Day DAM Energy Curves","description":"This report contains 2-Day aggregate energy demand and supply curve disclosure data for the Day-Ahead Market (DAM). The following file types are included in this report: Energy Demand Curves, Energy Supply Curves, and Minimum Energy Supply Curves, including by Disclosure Area.","status":"Active","reportTypeId":25813,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T03:47:58","bundle":1,"protocolRules":{"PUCT Substantive Rule §25.506":"https://www.ercot.com/mp/data-products?protocolRules=PUCT Substantive Rule §25.506","NP3.2.5(3)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(3)(a)","NP3.2.5(3)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(3)(b)","NP3.2.5(3)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(3)(c)"},"artifacts":[{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Supply Curves Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_esc_houston"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Demand Curves Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_edc_houston"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Demand Curves South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_edc_south"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Demand Curves West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_edc_west"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Minimum Energy Supply Curves Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_min_esc_houston"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Demand Curves North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_edc_north"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Supply Curves","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_esc"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Supply Curves North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_esc_north"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Minimum Energy Supply Curves North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_min_esc_north"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Minimum Energy Supply Curves","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_min_esc"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Supply Curves West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_esc_west"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Demand Curves","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_edc"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Energy Supply Curves South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_esc_south"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Minimum Energy Supply Curves West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_min_esc_west"}}},{"reportTypeId":25813,"displayName":"2-Day Aggregate Minimum Energy Supply Curves South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex/2d_agg_min_esc_south"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-907-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-907-ex"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-907-ex"}}},{"emilId":"NP3-908-ER","name":"2-Day SCED Energy Curves","description":"This report contains 2-Day aggregate energy demand and supply curve disclosure data for SCED. The following file types are included in this report: Energy Demand Curves for CLRs including by Disclosure Area, Supply Curve for ESR, Photovoltaic, Wind, and Non-Intermittent Renewable Resources, including by Disclosure Area.","status":"Active","reportTypeId":13054,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2011-08-28","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-08-28T03:52:46","bundle":1,"protocolRules":{"NP3.2.5(1)(h)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(h)","PUCT Substantive Rule §25.506":"https://www.ercot.com/mp/data-products?protocolRules=PUCT Substantive Rule §25.506","NP3.2.5(1)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(a)","NP3.2.5(1)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(b)","NP3.2.5(1)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(c)","NP3.2.5(1)(d)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(d)"},"artifacts":[{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Photovoltaic Resources Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_pvgr_houston"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for ESR Resources West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_esr_west"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for ESR Resources Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_esr_houston"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregated Energy Demand Curves CLR North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_edc_clr_north"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Wind Resources","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_wind"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Non-Intermittent Renewable Resources North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_nonirr_north"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curves for Non-Intermittent Renewable Resources","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_nonirr"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregated Energy Demand Curves CLR Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_edc_clr_houston"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregated Energy Demand Curves CLR West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_edc_clr_west"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Non-Intermittent Renewable Resources South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_nonirr_south"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Wind Resources North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_wind_north"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Non-Intermittent Renewable Resources West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_nonirr_west"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Wind Resources West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_wind_west"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Photovoltaic Resources","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_pvgr"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Wind Resources Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_wind_houston"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Wind Resources South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_wind_south"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for ESR Resources","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_esr"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Photovoltaic Resources North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_pvgr_north"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregated Energy Demand Curves CLR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_edc_clr"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Photovoltaic Resources West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_pvgr_west"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Non-Intermittent Renewable Resources Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_nonirr_houston"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for ESR Resources South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_esr_south"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for ESR Resources North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_esr_north"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregated Energy Demand Curves CLR South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_edc_clr_south"}}},{"reportTypeId":13054,"displayName":"2-Day Aggregate Supply Curve for Photovoltaic Resources South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-908-er/2d_agg_esc_pvgr_south"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-908-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-908-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-908-er"}}},{"emilId":"NP3-909-ER","name":"2-Day DAM Bids and Offers Reports","description":"This report will contain all 48 Hour disclosure data related to DAM. The following individual files are included in the report: 2-Day Total Cleared Energy Bids and Energy-Only Offers, 2-Day Total Cleared Energy Bids and Energy-Only Offers by Disclosure Areas, 2-Day Point-to-Point Obligation Bids, 2-Day Point-to-Point Obligation Bids by Disclosure Areas.","status":"Active","reportTypeId":13055,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2011-08-28","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":365,"lastPostDatetime":"2026-09-05T03:32:42","bundle":1,"protocolRules":{"NP3.2.5(3)(h)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(3)(h)","NP3.2.5(3)(d)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(3)(d)"},"artifacts":[{"reportTypeId":13055,"displayName":"2-Day Point-to-Point Obligation Bids Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_ptp_obl_bids_houston"}}},{"reportTypeId":13055,"displayName":"2-Day Total Cleared Energy Bids and Energy-Only Offers South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_total_cleared_energy_bids_offers_south"}}},{"reportTypeId":13055,"displayName":"2-Day Point-to-Point Obligation Bids West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_ptp_obl_bids_west"}}},{"reportTypeId":13055,"displayName":"2-Day Point-to-Point Obligation Bids North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_ptp_obl_bids_north"}}},{"reportTypeId":13055,"displayName":"2-Day Total Cleared Energy Bids and Energy-Only Offers West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_total_cleared_energy_bids_offers_west"}}},{"reportTypeId":13055,"displayName":"2-Day Point-to-Point Obligation Bids South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_ptp_obl_bids_south"}}},{"reportTypeId":13055,"displayName":"2-Day Point-to-Point Obligation Bids","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_ptp_obl_bids"}}},{"reportTypeId":13055,"displayName":"2-Day Total Cleared Energy Bids and Energy-Only Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_total_cleared_energy_bids_offers"}}},{"reportTypeId":13055,"displayName":"2-Day Total Cleared Energy Bids and Energy-Only Offers North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_total_cleared_energy_bids_offers_north"}}},{"reportTypeId":13055,"displayName":"2-Day Total Cleared Energy Bids and Energy-Only Offers Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-909-er/2d_total_cleared_energy_bids_offers_houston"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-909-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-909-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-909-er"}}},{"emilId":"NP3-910-ER","name":"2-Day Real Time Gen and Load Data Reports","description":"This report contains 2-Day aggregate disclosure data related to Real Time. The following file types are included in this report: Aggregate Generation Summary, Aggregate Load Summary, and Aggregate Output Schedules, including by Disclosure Area.","status":"Active","reportTypeId":13056,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2011-01-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T03:32:42","bundle":1,"protocolRules":{"NP3.2.5(1)(f)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(f)","PUCT Substantive Rule §25.506":"https://www.ercot.com/mp/data-products?protocolRules=PUCT Substantive Rule §25.506","NP3.2.5(1)(j)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(j)","NP3.2.5(1)(k)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(k)","NP3.2.5(2)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(2)(b)","NP3.2.5(1)(e)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(1)(e)"},"artifacts":[{"reportTypeId":13056,"displayName":"2-Day Aggregated Generation Summary South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_gen_summary_south"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Generation Summary North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_gen_summary_north"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Output Schedule","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_out_sched"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Generation Summary Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_gen_summary_houston"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Output Schedule Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_out_sched_houston"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated DSR Loads","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_dsr_loads"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Load Summary West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_load_summary_west"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Generation Summary West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_gen_summary_west"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Output Schedule West","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_out_sched_west"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Load Summary","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_load_summary"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Output Schedule North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_out_sched_north"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Output Schedule South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_out_sched_south"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Load Summary South","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_load_summary_south"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Generation Summary","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_gen_summary"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Load Summary North","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_load_summary_north"}}},{"reportTypeId":13056,"displayName":"2-Day Aggregated Load Summary Houston","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-910-er/2d_agg_load_summary_houston"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-910-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-910-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-910-er"}}},{"emilId":"NP3-911-ER","name":"2-Day DAM Ancillary Services Reports","description":"This report will contain all 48 Hour disclosure data related to DAM. The following individual files are included in the report: 2-Day Aggregate DAM AS Offers, 2-Day Cleared DAM AS, and 2-Day Self-Arranged AS.","status":"Active","reportTypeId":13057,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2011-01-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T03:32:42","bundle":1,"protocolRules":{"NP3.2.5(3)(e)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(3)(e)","NP3.2.5(3)(f)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(3)(f)","NP3.2.5(3)(g)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(3)(g)"},"artifacts":[{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service REGDN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_regdn"}}},{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service RRSFFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_rrsffr"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers NSPNM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_nspnm"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers RRSUFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_rrsufr"}}},{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service ECRSM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_ecrsm"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers ECRSS","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_ecrss"}}},{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service RRSPFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_rrspfr"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers RRSPFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_rrspfr"}}},{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service RRSUFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_rrsufr"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers ECRSM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_ecrsm"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers ONNS","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_onns"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers ECRSS","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_ecrss"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers REGUP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_regup"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers RRSFFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_rrsffr"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service REGDN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_regdn"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service NSPNM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_nspnm"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers RRSUFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_rrsufr"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers NSPIN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_nspin"}}},{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service NSPNM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_nspnm"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service ECRSM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_ecrsm"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers ECRSM","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_ecrsm"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers RRSPFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_rrspfr"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service REGUP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_regup"}}},{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service REGUP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_regup"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers REGDN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_regdn"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers REGUP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_regup"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers RRSFFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_rrsffr"}}},{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service ECRSS","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_ecrss"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service RRSUFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_rrsufr"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service RRSPFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_rrspfr"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service NSPIN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_nspin"}}},{"reportTypeId":13057,"displayName":"2-Day Self Arranged Ancillary Service NSPIN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_self_arranged_as_nspin"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated DAM Ancillary Service Offers REGDN","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_dam_as_offers_regdn"}}},{"reportTypeId":13057,"displayName":"2-Day Aggregated Ancillary Service Offers OFFNS","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_agg_as_offers_offns"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service ECRSS","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_ecrss"}}},{"reportTypeId":13057,"displayName":"2-Day Cleared DAM Ancillary Service RRSFFR","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-911-er/2d_cleared_dam_as_rrsffr"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-911-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-911-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-911-er"}}},{"emilId":"NP3-914-EX","name":"3-Day SCED Highest Price AS Offer Selected","description":"This report provides the offer price and the name of the Entity submitting the offer for the highest-priced Ancillary Service (AS) Offer selected in the Real-Time Market (RTM) for each AS three days after the end of the applicable Operating Day. If multiple Entities submitted the highest-priced offers selected, all Entities shall be identified.","status":"Active","reportTypeId":25812,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T03:13:41","bundle":1,"protocolRules":{"NP3.2.5(10)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(10)","PUC Substantive Rule §25.506":"https://www.ercot.com/mp/data-products?protocolRules=PUC Substantive Rule §25.506"},"artifacts":[{"reportTypeId":25812,"displayName":"3-Day SCED Highest Price AS Offer Selected","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-914-ex/3d_sced_high_as_offers"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-914-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-914-ex"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-914-ex"}}},{"emilId":"NP3-915-EX","name":"3-Day DAM Highest Price AS Offer Selected","description":"This report provides the offer price and the name of the Entity submitting the offer for the highest-priced Ancillary Service (AS) Offer selected in the Day-Ahead Market (DAM) for each AS three days after the end of the applicable Operating Day. If multiple Entities submitted the highest-priced offers selected, all Entities shall be identified.","status":"Active","reportTypeId":13018,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2011-01-29","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T03:13:41","bundle":1,"protocolRules":{"NP3.2.5(10)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(10)","PUC Substantive Rule §25.506":"https://www.ercot.com/mp/data-products?protocolRules=PUC Substantive Rule §25.506"},"artifacts":[{"reportTypeId":13018,"displayName":"3-Day DAM Highest Price AS Offer Selected","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-915-ex/3d_dam_high_as_offers"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-915-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-915-ex"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-915-ex"}}},{"emilId":"NP3-916-EX","name":"3-Day Highest Price Offered in SCED","description":"ERCOT shall post the offer price and the name of the Entity submitting the offer for the highest-priced offer selected or Dispatched by SCED three days after the applicable Operating Day. If multiple Entities submitted the highest-priced offers selected, all Entities shall be identified on the MIS Public Area.","status":"Active","reportTypeId":13029,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2011-07-07","eceii":null,"channel":"Public, EWS","userGuide":"Disclosure Reports Column Definitions Guide","postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T03:32:41","bundle":0,"protocolRules":{"PUC Substantive Rule §25.505":"https://www.ercot.com/mp/data-products?protocolRules=PUC%20Substantive%20Rule%20%C2%A725.505","NP3.2.5(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(7)"},"artifacts":[{"reportTypeId":13029,"displayName":"3-Day Highest Price Offered in SCED","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-916-ex/3d_highest_price_offer_sced"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-916-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-916-ex"}}},{"emilId":"NP3-965-ER","name":"60-Day SCED Disclosure Reports","description":"This report contains all 60-day disclosure data related to Security Constrained Economic Dispatch (SCED). The following file types are included in the report: AS Capability Manual Override, ESR Data in SCED, Generation Resource Data in SCED, HDL and LDL Manual Override Summary, Load Resource Data in SCED, QSE Self Arranged AS in SCED, SCED AS Offer Updates in Operating Period, SCED Energy Offer Curve Updates in Operating Hour, SCED Resource AS Offers, and Settlement Metered Net Energy for Generation Resources.","status":"Active","reportTypeId":13052,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2011-01-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":1462,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":25,"lastPostDatetime":"2026-09-05T05:17:41","bundle":1,"protocolRules":{"NP3.2.5(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(5)","NP3.2.5(4)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(4)","PUCT Substantive Rule §25.506":"https://www.ercot.com/mp/data-products?protocolRules=PUCT Substantive Rule §25.506","NP6.4.9.1.1(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.4.9.1.1(7)","NP6.5.7.1.13(8)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.1.13(8)"},"artifacts":[{"reportTypeId":13052,"displayName":"60-Day SCED AS Offer Updates in Operating Period","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60d_sced_as_offer_updates"}}},{"reportTypeId":13052,"displayName":"60-Day Load Resource Data in SCED","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60_load_res_data_in_sced"}}},{"reportTypeId":13052,"displayName":"60-Day QSE-specific Self-Arranged AS in SCED","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60_sced_qse_self_arranged_as"}}},{"reportTypeId":13052,"displayName":"60-Day HDL and LDL Manual Override Summary","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60_hdl_ldl_man_override"}}},{"reportTypeId":13052,"displayName":"60-Day SCED Gen Resource Data","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60_sced_gen_res_data"}}},{"reportTypeId":13052,"displayName":"60-Day AS Capability Manual Override","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60d_sced_as_cap_man_override"}}},{"reportTypeId":13052,"displayName":"60-Day ESR Data in SCED","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60d_sced_esr_data"}}},{"reportTypeId":13052,"displayName":"60-Day SCED Settlement Metered Net Energy for Generation Resources","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60_sced_smne_gen_res"}}},{"reportTypeId":13052,"displayName":"60 Day SCED Resource AS Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60d_sced_resource_as_offers"}}},{"reportTypeId":13052,"displayName":"60-Day SCED DSR Load Data","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60_sced_dsr_load_data"}}},{"reportTypeId":13052,"displayName":"60-Day SCED Energy Offer Curve Updates in Operating Hour","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-965-er/60_sced_eoc_updates_in_ophour"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-965-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-965-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-965-er"}}},{"emilId":"NP3-966-ER","name":"60-Day DAM Disclosure Reports","description":"This report will contain all 60 day disclosure data related to DAM. The following individual files are included in the report: 60d_DAM_EnergyBidAwards; 60d_DAM_EnergyBids; 60d_DAM_EnergyOnlyOfferAwards; 60d_DAM_EnergyOnlyOffers; 60d_DAM_Generation_Resource_ASOffers; 60d_DAM_Gen_Resource_Data; 60d_DAM_Load_Resource_ASOffers; 60d_DAM_Load_Resource_Data; 60d_DAM_PTPObligationBidAwards; 60d_DAM_PTPObligationBids; 60d_DAM_PTP_Obligation_Option; 60d_DAM_PTP_Obligation_OptionAwards; and 60d_DAM_QSE_Self_Arranged_AS.","status":"Active","reportTypeId":13051,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2024-11-11","firstRun":"2011-01-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":1462,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":25,"lastPostDatetime":"2026-09-05T05:32:43","bundle":1,"protocolRules":{"NP3.2.5(11)(d)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(d)","NP3.2.5(11)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(c)","NP3.2.5(11)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(b)","NP3.2.5(11)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(a)","NP3.2.5(11)(k)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(k)","NP3.2.5(11)(j)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(j)","NP3.2.5(4)(e)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(4)(e)","NP3.2.5(11)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(i)","NP3.2.5(11)(h)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(h)","NP3.2.5(11)(g)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(g)","NP3.2.5(11)(f)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(f)","NP3.2.5(11)(e)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(11)(e)"},"artifacts":[{"reportTypeId":13051,"displayName":"60-Day DAM Energy Offer Only Awards","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_energy_only_offer_awards"}}},{"reportTypeId":13051,"displayName":"60-Day DAM Energy Bids","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_energy_bids"}}},{"reportTypeId":13051,"displayName":"60-Day DAM Energy Bid Awards","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_energy_bid_awards"}}},{"reportTypeId":13051,"displayName":"60-Day DAM PTP Obligation Option","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_ptp_obl_opt"}}},{"reportTypeId":13051,"displayName":"60-Day DAM AS Only Awards","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60d_dam_as_only_awards"}}},{"reportTypeId":13051,"displayName":"60-Day DAM QSE Self Arranged AS","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_qse_self_as"}}},{"reportTypeId":13051,"displayName":"60-Day DAM PTP Obligation Bid Awards","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_ptp_obl_bid_awards"}}},{"reportTypeId":13051,"displayName":"60-Day DAM Load Resources AS Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_load_res_as_offers"}}},{"reportTypeId":13051,"displayName":"60-Day DAM Generation Resource Data","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_gen_res_data"}}},{"reportTypeId":13051,"displayName":"60-Day DAM ESR Data","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60d_dam_esr_data"}}},{"reportTypeId":13051,"displayName":"60-Day DAM Load Resource Data","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_load_res_data"}}},{"reportTypeId":13051,"displayName":"60-Day DAM PTP Obligation Option Awards","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_ptp_obl_opt_awards"}}},{"reportTypeId":13051,"displayName":"60-Day DAM ESR AS Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60d_dam_esr_as_offers"}}},{"reportTypeId":13051,"displayName":"60-Day DAM PTP Obligation Bids","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_ptp_obl_bids"}}},{"reportTypeId":13051,"displayName":"60-Day DAM AS Only Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60d_dam_as_only_offers"}}},{"reportTypeId":13051,"displayName":"60-Day DAM Energy Only Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_energy_only_offers"}}},{"reportTypeId":13051,"displayName":"60-Day DAM Generation Resources AS Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-966-er/60_dam_gen_res_as_offers"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-966-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-966-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-966-er"}}},{"emilId":"NP3-987-EX","name":"7-Day Event Trigger Posting","description":"Seven days after the applicable Operating Day, ERCOT shall post the portion of any Resource's Energy Offer Curve or Energy Bid/Offer Curve that is at or above 50 times the Fuel Index Price (50xFIP) for any Security-Constrained Economic Dispatch (SCED) interval in the Real-Time Market (RTM) where any Real-Time Locational Marginal Price (LMP) exceeds 50xFIP, or the portion of any Resource’s Ancillary Service Offer that is at or above 50xFIP for any operating Hour in Day-Ahead Market (DAM) or any SCED intervals in Real-Time Market (RTM) where any Ancillary Service Market Clearing Price for Capacity (MCPC) exceeds 50xFIP.","status":"Active","reportTypeId":10047,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2011-01-29","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-08-31T23:59:59","bundle":1,"protocolRules":{"PUC Substantive Rule §25.506":"https://www.ercot.com/mp/data-products?protocolRules=PUC Substantive Rule §25.506","NP3.2.5(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(7)","NP3.2.5(6)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(6)"},"artifacts":[{"reportTypeId":10047,"displayName":"7-Day Event Trigger Posting when LMP exceeds 50xFIP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-987-ex/7d_trig_lmp_50xfip"}}},{"reportTypeId":10047,"displayName":"7-Day Event Trigger Posting When DAM MCPC Exceeds 50xFIP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-987-ex/7d_trig_mcpc_50xfip"}}},{"reportTypeId":10047,"displayName":"7-Day Event Trigger Posting when RTM MCPC exceeds 50xFIP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-987-ex/7d_trig_rtm_mcpc_50xfip"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-987-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-987-ex"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-987-ex"}}},{"emilId":"NP3-988-ER","name":"Resource Decision-Making Entity List","description":"Daily Resource Decision-Making Entity List containing the decision-making entities for each Resource.","status":"Active","reportTypeId":10036,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2010-12-01","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"csv","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2026-09-05T05:02:43","bundle":1,"protocolRules":{"NP3.2.5(10)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(10)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-988-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-988-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-988-er"}}},{"emilId":"NP3-990-EX","name":"60-Day SASM Disclosure Reports","description":"This report will contain all 60 day disclosure data related to SASM for Generation and Load Resources. Report removed with PR447-03 RTC. Link to remain available until postings have expired.","status":"Active","reportTypeId":15833,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2018-12-11","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":1462,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-02-28T23:59:59","bundle":1,"protocolRules":{"NP3.2.5(12)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.2.5(12)"},"artifacts":[{"reportTypeId":15833,"displayName":"60-Day SASM Load Resource AS Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-990-ex/60_sasm_load_res_as_offers"}}},{"reportTypeId":15833,"displayName":"60-Day SASM Generation Resource AS Offer Awards","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-990-ex/60_sasm_gen_res_as_offer_awards"}}},{"reportTypeId":15833,"displayName":"60-Day SASM Generation Resource AS Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-990-ex/60_sasm_gen_res_as_offers"}}},{"reportTypeId":15833,"displayName":"60-Day SASM Load Resource AS Offer Awards","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-990-ex/60_sasm_load_res_as_offer_awards"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-990-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-990-ex"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-990-ex"}}},{"emilId":"NP3-991-EX","name":"60-Day COP All Updates","description":"This report will contain all iterative Current Operating Plan (COP) submissions where a change has occurred for the operating day. Previously named 60-Day Current Operating Plan.","status":"Active","reportTypeId":15943,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2024-09-17","firstRun":"2019-02-07","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,csv","ddlName":"","misDisplayDuration":1462,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":25,"lastPostDatetime":"2026-09-05T05:17:54","bundle":1,"protocolRules":{"NP1.3.1.4(2) (c)":"https://www.ercot.com/mp/data-products?protocolRules=NP1.3.1.4(2) (c)"},"artifacts":[{"reportTypeId":15943,"displayName":"60-Day COP All Updates","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np3-991-ex/60_cop_all_updates"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np3-991-ex"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np3-991-ex"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np3-991-ex"}}},{"emilId":"NP4-158-SG","name":"DAM Electrically Similar Settlement Points","description":"The current list of all DAM Electrically Similar Settlement Points (ESSPs) that are used for market processes and transactions. Per protocols, certain transaction are not allowed between ESSPs. In order to support this protocol requirement, a list of ESSPs are posted prior to 0600 as a study for DAM, and also after DAM completion to reflect the ESSP list that was enforced in the DAM solution (recognizing that the network topology and outage changes can add or remove settlement points from the ESSP list on an intra-day basis).","status":"Active","reportTypeId":13058,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2011-12-09","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"csv","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T12:34:27","bundle":1,"protocolRules":{"NP4.5.3(2)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(i)"},"artifacts":[{"reportTypeId":13058,"displayName":"DAM Electrically Similar Settlement Points","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-158-sg"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-158-sg"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-158-sg"}}},{"emilId":"NP4-159-CD","name":"Load Distribution Factors","description":"Load forecast distribution factors from which Market Participants can calculate Load at the Electrical Bus level by hour for the next seven days after a change in values. A seasonal or manual change in values triggers the posting of the report.","status":"Active","reportTypeId":12324,"audience":"Public","generationFrequency":"Event - As Needed","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2010-11-23","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":365,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":5,"lastPostDatetime":"2026-08-14T15:31:48","bundle":0,"protocolRules":{"NP6.3.2(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(5)"},"artifacts":[{"reportTypeId":12324,"displayName":"Load Distribution Factors","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-159-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-159-cd"}}},{"emilId":"NP4-179-CD","name":"Total Ancillary Service Offers","description":"The total quantity in MW of Offers per Ancillary Service per hour from the Day-Ahead Market for the last thirty days on a daily basis which includes the following AS types: REGDN, REGUP, RRSPFR, RRSFFR, RRSUFR, NSPIN, ECRSS & ECRSM. Report removed with PR447-03 RTC. Link to remain available until postings have expired.","status":"Active","reportTypeId":12327,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2025-12-31T23:59:59","bundle":1,"protocolRules":{"NP4.5.3(2)(e)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(e)"},"artifacts":[{"reportTypeId":12327,"displayName":"Total Ancillary Service Offers","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-179-cd/total_as_service_offers"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-179-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-179-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-179-cd"}}},{"emilId":"NP4-183-CD","name":"DAM Hourly LMPs","description":"The Hourly Locational Marginal Prices per electrical bus from the Day-Ahead Market for the last thirty days on a daily basis.","status":"Active","reportTypeId":12328,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":200,"lastPostDatetime":"2026-09-05T12:32:43","bundle":1,"protocolRules":{"NP4.5.3(2)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(c)"},"artifacts":[{"reportTypeId":12328,"displayName":"DAM Hourly LMPs","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-183-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-183-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-183-cd"}}},{"emilId":"NP4-188-CD","name":"DAM Clearing Prices for Capacity","description":"The Market Clearing Prices for Capacity for all Ancillary Services from the Day-Ahead Market.","status":"Active","reportTypeId":12329,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T12:32:38","bundle":1,"protocolRules":{"NP4.5.3(2)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(a)"},"artifacts":[{"reportTypeId":12329,"displayName":"DAM Clearing Prices for Capacity","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-188-cd/dam_clear_price_for_cap"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-188-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-188-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-188-cd"}}},{"emilId":"NP4-190-CD","name":"DAM Settlement Point Prices","description":"The Settlement Point Prices for all Resource Nodes, Load Zones, and Trading Hubs from the Day-Ahead Market.","status":"Active","reportTypeId":12331,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":500,"lastPostDatetime":"2026-09-05T12:32:38","bundle":1,"protocolRules":{"NP4.5.3(2)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(b)"},"artifacts":[{"reportTypeId":12331,"displayName":"DAM Settlement Point Prices","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-190-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-190-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-190-cd"}}},{"emilId":"NP4-191-CD","name":"DAM Shadow Prices","description":"The active and binding constraints as well as the associated shadow prices from the Day-Ahead Market for the last thirty days on a daily basis.","status":"Active","reportTypeId":12332,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T12:34:27","bundle":1,"protocolRules":{"NP4.5.3(2)(d)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(d)"},"artifacts":[{"reportTypeId":12332,"displayName":"DAM Shadow Prices","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-191-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-191-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-191-cd"}}},{"emilId":"NP4-192-CD","name":"DAM Total Energy Purchased","description":"The total amount of energy purchased via energy bid/offer curves and energy-only bids per Settlement Point from the Day-Ahead Market (DAM) on a daily basis.","status":"Active","reportTypeId":12333,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T12:32:39","bundle":1,"protocolRules":{"NP4.5.3(2)(e)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(e)(i)"},"artifacts":[{"reportTypeId":12333,"displayName":"DAM Total Energy Purchased","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-192-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-192-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-192-cd"}}},{"emilId":"NP4-193-CD","name":"DAM Total Energy Sold","description":"The total amount of energy sold via three-part supply offers, energy offer curves, and energy-only offers per Settlement Point from the Day-Ahead Market (DAM) on a daily basis.","status":"Active","reportTypeId":12334,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T12:32:38","bundle":1,"protocolRules":{"NP4.5.3(2)(f)(i)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(f)(i)","NP4.5.3(2)(f)(iii)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(f)(iii)"},"artifacts":[{"reportTypeId":12334,"displayName":"DAM Total Energy Sold","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-193-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-193-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-193-cd"}}},{"emilId":"NP4-194-CD","name":"DAM PTP Obligation Results by Settlement Point","description":"The total amount of PTP Obligation Bids awarded and CRR Offers not awarded in the Day-Ahead Market per Settlement Point where the Settlement Point of the bid or offer is either the Source or the Sink for the last thirty days on a daily basis.","status":"Active","reportTypeId":13042,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2010-12-14","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T12:32:42","bundle":1,"protocolRules":{"NP4.5.3(2)(f)(ii)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(f)(ii)","NP4.5.3(2)(g)(ii)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(g)(ii)"},"artifacts":[{"reportTypeId":13042,"displayName":"DAM PTP Obligation Results by Settlement Point","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-194-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-194-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-194-cd"}}},{"emilId":"NP4-196-M","name":"DAM Price Corrections","description":"Day-Ahead Market price corrections.","status":"Active","reportTypeId":13044,"audience":"Public","generationFrequency":"Event - As Needed","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2011-04-20","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Exists - Modify","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":180,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":200,"lastPostDatetime":"2025-12-08T22:41:52","bundle":0,"protocolRules":{"NP4.5.3(2)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(b)","NP4.5.3(3)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(3)"},"artifacts":[{"reportTypeId":13044,"displayName":"DAM Price Corrections for SPP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp"}}},{"reportTypeId":13044,"displayName":"DAM Price Corrections for MCPC","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc"}}},{"reportTypeId":13044,"displayName":"DAM Price Corrections for EBLMP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-196-m"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-196-m"}}},{"emilId":"NP4-197-M","name":"RTM Price Corrections","description":"Real-Time Market price corrections","status":"Active","reportTypeId":13045,"audience":"Public","generationFrequency":"Event - As Needed","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2012-04-05","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Exists - Modify","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":180,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":200,"lastPostDatetime":"2026-09-01T15:25:55","bundle":0,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)","NP6.3(3)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3(3)"},"artifacts":[{"reportTypeId":13045,"displayName":"RTM Price Corrections for Shadow Prices","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow"}}},{"reportTypeId":13045,"displayName":"RTM Price Corrections for SOG LMP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp"}}},{"reportTypeId":13045,"displayName":"RTM Price Corrections for SOG Price","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice"}}},{"reportTypeId":13045,"displayName":"RTM Price Corrections for MCPCs by SCED Interval","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced"}}},{"reportTypeId":13045,"displayName":"RTM Price Corrections for EB LMP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp"}}},{"reportTypeId":13045,"displayName":"RTM Price Corrections for SPP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp"}}},{"reportTypeId":13045,"displayName":"RTM Price Corrections SP LMP","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp"}}},{"reportTypeId":13045,"displayName":"RTM Price Corrections for MCPC by 15-Min Settlement Interval","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-197-m"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-197-m"}}},{"emilId":"NP4-19-CD","name":"DAM Aggregated Ancillary Service Offer Curve","description":"The Day-Ahead Market (DAM) Aggregated Ancillary Service Offer Curve for the last 30 days which includes the following AS types: REGDN, REGUP, RRSPF, RRSFF, RRSUF, ECRSS, & ECRSM. Previously named Aggregated Ancillary Service Offer Curve.","status":"Active","reportTypeId":12330,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T12:34:28","bundle":1,"protocolRules":{"NP4.5.3(2)(g)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(g)"},"artifacts":[{"reportTypeId":12330,"displayName":"DAM Aggregated Ancillary Service Offer Curve","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-19-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-19-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-19-cd"}}},{"emilId":"NP4-200-CD","name":"DAM De-Energized Settlement Points in Base Case","description":"The list of settlement points that were de-energized in the base case of the Day Ahead Market.","status":"Active","reportTypeId":13063,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2011-10-26","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T12:34:27","bundle":0,"protocolRules":{"NP4.5.3(2)(j)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(j)"},"artifacts":[{"reportTypeId":13063,"displayName":"DAM De-Energized Settlement Points in Base Case","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-200-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-200-cd"}}},{"emilId":"NP4-212-CD","name":"DAM and SCED Ancillary Service Demand Curves","description":"Ancillary Service Demand Curve (ASDC) data for all AS Types by hour that will be used by DAM and SCED to procure Ancillary Services. If the AS Plan is altered, a new ASDC will be posted to reflect this change for applicable hours.","status":"Active","reportTypeId":24893,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T04:55:40","bundle":1,"protocolRules":{"NP4.2.1.1(6)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.1.1(6)","NP4.4.12":"https://www.ercot.com/mp/data-products?protocolRules=NP4.4.12"},"artifacts":[{"reportTypeId":24893,"displayName":"DAM and SCED Ancillary Service Demand Curves","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-212-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-212-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-212-cd"}}},{"emilId":"NP4-213-CD","name":"Hourly RUC Ancillary Service Demand Curves","description":"Ancillary Service Demand Curve (ASDC) data for all AS Types by hour that will be used by HRUC to procure Ancillary Services. If the AS Plan is altered, a new ASDC will be posted to reflect this change for applicable hours.","status":"Active","reportTypeId":26382,"audience":"Public","generationFrequency":"Event - Per HRUC Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T18:24:56","bundle":1,"protocolRules":{"NP5.5.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP5.5.2(2)"},"artifacts":[{"reportTypeId":26382,"displayName":"Hourly RUC Ancillary Service Demand Curves","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-213-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-213-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-213-cd"}}},{"emilId":"NP4-214-CD","name":"Daily RUC Ancillary Service Demand Curves","description":"Ancillary Service Demand Curve (ASDC) data for all AS Types by hour that will be used by DRUC to procure Ancillary Services. If the AS Plan is altered, a new ASDC will be posted to reflect this change for applicable hours.","status":"Active","reportTypeId":26383,"audience":"Public","generationFrequency":"Event - Per DRUC Run","securityClassification":"Public","lastUpdated":"2025-12-04","firstRun":"2025-12-05","eceii":null,"channel":"Public, EWS, Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T14:49:53","bundle":1,"protocolRules":{"NP5.5.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP5.5.2(2)"},"artifacts":[{"reportTypeId":26383,"displayName":"Daily RUC Ancillary Service Demand Curves","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-214-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-214-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-214-cd"}}},{"emilId":"NP4-215-CD","name":"Weekly RUC Ancillary Service Demand Curves","description":"Ancillary Service Demand Curve (ASDC) data for all AS Types by hour that will be used by WRUC to procure Ancillary Services. If the AS Plan is altered, a new ASDC will be posted to reflect this change for applicable hours.","status":"Active","reportTypeId":26384,"audience":"Public","generationFrequency":"Event - Per WRUC Run","securityClassification":"Public","lastUpdated":"2025-12-04","firstRun":"2025-12-05","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T02:54:35","bundle":1,"protocolRules":{"NP5.5.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP5.5.2(2)"},"artifacts":[{"reportTypeId":26384,"displayName":"Weekly RUC Ancillary Service Demand Curves","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-215-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-215-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-215-cd"}}},{"emilId":"NP4-231-CD","name":"Electrical Bus Mapping for Heuristic Pricing","description":"This report shows the heuristic pricing associations on a daily basis that are used in the market solutions for Day-Ahead Market (DAM) and Real-Time Market (RTM). This posting helps the market's understanding of the methodology and values of the published prices.","status":"Active","reportTypeId":13098,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2013-04-24","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":30,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T05:50:00","bundle":0,"protocolRules":{"NP4.2.4.1(1)(f)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.4.1(1)(f)"},"artifacts":[{"reportTypeId":13098,"displayName":"Electrical Bus Mapping for Heuristic Pricing","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-231-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-231-cd"}}},{"emilId":"NP4-33-CD","name":"DAM Ancillary Service Plan","description":"Ancillary Service requirements by type and quantity for each hour of the current day plus the next 6 days","status":"Active","reportTypeId":12316,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2024-09-17","firstRun":"2010-11-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T05:00:00","bundle":1,"protocolRules":{"NP4.2.1.1(1)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.1.1(1)"},"artifacts":[{"reportTypeId":12316,"displayName":"DAM Ancillary Service Plan","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-33-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-33-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-33-cd"}}},{"emilId":"NP4-412-CD","name":"Emergency Pricing Program Cumulative Hours Tracking","description":"This report updates every 15 minutes and shows the sum of the Real-Time Market (RTM) System Lambda and Real-Time Reliability Deployment Price Adder for Energy, time-weight averaged to a 15-minute Settlement Interval. If this sum is greater than or equal to the High System-Wide Offer Cap for the Day-Ahead Market (DAM) for 12 hours within a rolling 24-hour period, an Emergency Offer Cap Effective Period initiates at the beginning of the next Operating Hour.","status":"Active","reportTypeId":24885,"audience":"Public","generationFrequency":"Chron - 15 Minutes","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:17:00","bundle":1,"protocolRules":{"NP4.4.11(1)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.4.11(1)(c)"},"artifacts":[{"reportTypeId":24885,"displayName":"Emergency Pricing Program Cumulative Hours Tracking","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-412-cd/epp_cumulative_hours"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-412-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-412-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-412-cd"}}},{"emilId":"NP4-442-CD","name":"Hourly System-wide and Regional Wind Forecasts by Model","description":"This report is posted every hour and includes system-wide and regional STWPF and WGRPP values produced by each forecast model for On-Line WGRs and the wind generation components of DC-Coupled Resources for the rolling historical 48-hour period and the rolling future 168-hour period and also indicates which forecast model is used for each region to populate COPs. Previously named: Hourly System-wide and Regional STWPF and WGRPP by Forecast Model. Name change with implementation of PR373-01 FPP.","status":"Active","reportTypeId":19385,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2025-03-10","firstRun":"2020-08-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"csv,xml,zip","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":250,"lastPostDatetime":"2026-09-05T18:55:00","bundle":1,"protocolRules":{"NP4.2.2(6)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(6)"},"artifacts":[{"reportTypeId":19385,"displayName":"Hourly System-wide and Regional Wind Forecasts by Model","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-442-cd/hrly_sys_reg_wind_fcast_model"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-442-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-442-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-442-cd"}}},{"emilId":"NP4-443-CD","name":"Hourly System-Wide and Regional Solar Forecasts by Model","description":"This report is posted every hour and includes system-wide and regional STPPF and PVGRPP values produced by each forecast model for On-Line PVGRs for the rolling future 168-hour period and also indicates which forecast model is used for each region to populate COPs.","status":"Active","reportTypeId":21811,"audience":"Public","generationFrequency":"Event","securityClassification":"Public","lastUpdated":"2023-12-11","firstRun":"2023-12-11","eceii":null,"channel":"Public, EWS, Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":365,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T18:55:00","bundle":1,"protocolRules":{"":"https://www.ercot.com/mp/data-products?protocolRules="},"artifacts":[{"reportTypeId":21811,"displayName":"Hourly System-Wide and Regional Solar Forecasts by Model","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-443-cd/hrly_sys_reg_solar_fcast_model"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-443-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-443-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-443-cd"}}},{"emilId":"NP4-494-ER","name":"Exceptional Fuel Cost Submission Report","description":"The day following an Operating Day for which an Exceptional Fuel Cost is submitted, ERCOT shall post a report on the ERCOT website indicating the affected Operating Hours and the number of Resources for which a QSE submitted Exceptional Fuel Cost for a particular Operating Day.","status":"Active","reportTypeId":24276,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-15","firstRun":"2024-06-27","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"xlsx","ddlName":"","misDisplayDuration":365,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":365,"lastPostDatetime":"2026-09-05T09:00:39","bundle":0,"protocolRules":{"NP4.4.9.4.1(1)(g)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.4.9.4.1(1)(g)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-494-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-494-er"}}},{"emilId":"NP4-523-CD","name":"DAM System Lambda","description":"System lambda of each successful DAM","status":"Active","reportTypeId":13113,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2024-10-29","firstRun":"2013-12-11","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T12:32:38","bundle":1,"protocolRules":{"NP4.5.3 (2) (k)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3 (2) (k)"},"artifacts":[{"reportTypeId":13113,"displayName":"DAM System Lambda","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-523-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-523-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-523-cd"}}},{"emilId":"NP4-532-CD","name":"DAM Total Ancillary Services Sold","description":"Ancillary Services sold in the DAM consisting of the total quantity of awarded Resource-Specific Ancillary Service Offers and Ancillary Service Only Offers, for each Ancillary Service for each hour of the Operating Day.","status":"Active","reportTypeId":24888,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":365,"lastPostDatetime":"2026-09-05T12:32:38","bundle":1,"protocolRules":{"NP4.5.3(2)(k)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.5.3(2)(k)"},"artifacts":[{"reportTypeId":24888,"displayName":"DAM Total Ancillary Services Sold","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-532-cd/dam_as_sold"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-532-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-532-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-532-cd"}}},{"emilId":"NP4-722-CD","name":"Weather Assumptions","description":"Forecasted hourly temperature values for the next day for each weather zone.","status":"Active","reportTypeId":12325,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2010-11-30","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T05:00:00","bundle":1,"protocolRules":{"NP4.2.4.1(1)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.4.1(1)(a)"},"artifacts":[{"reportTypeId":12325,"displayName":"Weather Assumptions","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-722-cd/weather_assumptions"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-722-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-722-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-722-cd"}}},{"emilId":"NP4-732-CD","name":"Wind Power Production - Hourly Averaged Actual and Forecasted Values","description":"This report is posted every hour and includes System-wide and regional actual hourly averaged wind power production (GEN), STWPF, WGRPP and COP HSLs for On-Line WGRs for a rolling historical 48-hour period as well as the System-wide and regional STWPF, WGRPP and COP HSLs for On-Line WGRs for the rolling future 168-hour period. System-wide actual hourly averaged wind power potential (HSL) for a rolling historical 48-hour period is also included. Our forecasts attempt to predict HSL, which is uncurtailed power generation potential.","status":"Active","reportTypeId":13028,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-10-29","firstRun":"2010-11-28","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T18:55:13","bundle":1,"protocolRules":{"NP4.2.2(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(7)","NP4.2.2(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(5)","NP4.2.2(3)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(3)"},"artifacts":[{"reportTypeId":13028,"displayName":"Wind Power Production - Hourly Averaged Actual and Forecasted Values","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-732-cd/wpp_hrly_avrg_actl_fcast"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-732-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-732-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-732-cd"}}},{"emilId":"NP4-733-CD","name":"Wind Power Production - Actual 5-Minute Averaged Values","description":"This report is posted every 5 minutes and includes System-wide actual 5-min averaged wind power production (GEN) and wind power potential (HSL) for a rolling historical 60-minute period. Actual 5-min averaged wind power production (GEN) is also included at region level.","status":"Active","reportTypeId":13071,"audience":"Public","generationFrequency":"Chron - 5 Minutes","securityClassification":"Public","lastUpdated":"2024-10-29","firstRun":"2012-04-26","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:20:29","bundle":1,"protocolRules":{"NP4.2.2(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(7)"},"artifacts":[{"reportTypeId":13071,"displayName":"Wind Power Production - Actual 5-Minute Averaged Values","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-733-cd/wpp_actual_5min_avg_values"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-733-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-733-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-733-cd"}}},{"emilId":"NP4-737-CD","name":"Solar Power Production - Hourly Averaged Actual and Forecasted Values","description":"This report includes System-wide actual hourly averaged solar power production (GEN), actual hourly averaged solar power potential (HSL), STPPF, PVGRPP, and COP HSLs for On-Line PVGRs for a rolling historical 48-hour period as well as the System-wide STPPF, PVGRPP and COP HSLs for On-Line PVGRs for the rolling future 168-hour period. Our forecasts attempt to predict HSL, which is uncurtailed power generation potential.","status":"Active","reportTypeId":13483,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2025-03-10","firstRun":"2016-02-09","eceii":"","channel":"Public,Data Portal,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T18:55:13","bundle":1,"protocolRules":{"NP4.2.3(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(5)"},"artifacts":[{"reportTypeId":13483,"displayName":"Solar Power Production - Hourly Averaged Actual and Forecasted Values","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-737-cd/spp_hrly_avrg_actl_fcast"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-737-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-737-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-737-cd"}}},{"emilId":"NP4-738-CD","name":"Solar Power Production - Actual 5-Minute Averaged Values","description":"This report is posted every 5 minutes and includes System-wide actual 5-minute averaged solar power production (GEN) and solar power potential (HSL) for On-Line PVGRs for a rolling historical 60-minute period.","status":"Active","reportTypeId":13484,"audience":"Public","generationFrequency":"Chron - 5 Minutes","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2016-02-09","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:25:07","bundle":1,"protocolRules":{"NP4.2.3(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(7)"},"artifacts":[{"reportTypeId":13484,"displayName":"Solar Power Production - Actual 5-Minute Averaged Values","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-738-cd/spp_actual_5min_avg_values"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-738-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-738-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-738-cd"}}},{"emilId":"NP4-742-CD","name":"Wind Power Production - Hourly Averaged Actual and Forecasted Values by Geographical Region","description":"This report is posted every hour and includes System-wide and geographic regional actual hourly averaged wind power production (GEN), STWPF, WGRPP and COP HSLs for On-Line WGRs for a rolling historical 48-hour period as well as the System-wide and regional STWPF, WGRPP and COP HSLs for On-Line WGRs for the rolling future 168-hour period. System-wide actual hourly averaged wind power potential (HSL) for a rolling historical 48-hour period is also included. Our forecasts attempt to predict HSL, which is uncurtailed power generation potential.","status":"Active","reportTypeId":14787,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-10-29","firstRun":"2017-05-10","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T18:55:13","bundle":1,"protocolRules":{"NP4.2.2(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(7)","NP4.2.2(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(5)","NP4.2.2(3)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(3)"},"artifacts":[{"reportTypeId":14787,"displayName":"Wind Power Production - Hourly Averaged Actual and Forecasted Values by Geographical Region","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-742-cd/wpp_hrly_actual_fcast_geo"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-742-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-742-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-742-cd"}}},{"emilId":"NP4-743-CD","name":"Wind Power Production - Actual 5-Minute Averaged Values by Geographical Region","description":"This report is posted every 5 minutes and includes System-wide actual 5-minute averaged wind power production (GEN) and wind power potential (HSL) for a rolling historical 60-minute period. Actual 5-min averaged wind power production (GEN) is also included at the geographic regional level.","status":"Active","reportTypeId":14788,"audience":"Public","generationFrequency":"Chron - 5 Minutes","securityClassification":"Public","lastUpdated":"2024-10-29","firstRun":"2017-05-10","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:20:30","bundle":1,"protocolRules":{"NP4.2.2(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(7)"},"artifacts":[{"reportTypeId":14788,"displayName":"Wind Power Production - Actual 5-Minute Averaged Values by Geographical Region","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-743-cd/wpp_actual_5min_avg_values_geo"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-743-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-743-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-743-cd"}}},{"emilId":"NP4-745-CD","name":"Solar Power Production - Hourly Averaged Actual and Forecasted Values by Geographical Region","description":"This report is posted every hour and includes System-wide and geographic regional hourly averaged solar power production (GEN), STPPF, PVGRPP, and COP HSL for On-Line PVGRs for a rolling historical 48-hour period as well as the system-wide and regional STPPF, PVGRPP, and COP HSL for On-Line PVGRs for the rolling future 168-hour period. System-wide actual hourly averaged solar power potential (HSL) for a rolling historical 48-hour period is also included. ERCOT's forecasts attempt to predict HSL, which is uncurtailed power generation potential.","status":"Active","reportTypeId":21809,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2025-03-10","firstRun":"2022-06-30","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T18:55:12","bundle":1,"protocolRules":{"NP4.2.3(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(5)","NP4.2.3(6)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(6)","NP4.2.3(1)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(1)"},"artifacts":[{"reportTypeId":21809,"displayName":"Solar Power Production - Hourly Averaged Actual and Forecasted Values by Geographical Region","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-745-cd/spp_hrly_actual_fcast_geo"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-745-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-745-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-745-cd"}}},{"emilId":"NP4-746-CD","name":"Solar Power Production - Actual 5-Minute Averaged Values by Geographical Region","description":"This report is posted every 5 minutes and includes System-wide actual 5-minute averaged solar power production (GEN) and solar power potential (HSL) for a rolling historical 60-minute period. Actual 5-min averaged solar power production (GEN) is also included at the geographic regional level.","status":"Active","reportTypeId":21810,"audience":"Public","generationFrequency":"Chron - 5 Minutes","securityClassification":"Public","lastUpdated":"2025-03-10","firstRun":"2022-06-30","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:25:11","bundle":1,"protocolRules":{"NP4.2.3(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(5)","NP4.2.3(6)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(6)","NP4.2.3(1)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(1)"},"artifacts":[{"reportTypeId":21810,"displayName":"Solar Power Production - Actual 5-Minute Averaged Values by Geographical Region","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-746-cd/spp_actual_5min_avg_values_geo"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-746-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-746-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-746-cd"}}},{"emilId":"NP4-751-CD","name":"Intra-Hour Wind Power Forecast By Geographical Region","description":"Intra-Hour Wind Power Forecast (IHWPF) by wind region that provides a rolling two hour, five minute forecast of ERCOT-wide wind production potential.","status":"Active","reportTypeId":16554,"audience":"Public","generationFrequency":"Chron - 5 Minutes","securityClassification":"Public","lastUpdated":"2024-02-21","firstRun":"2020-02-05","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:22:00","bundle":1,"protocolRules":{"NP4.2.2(1)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.2(1)"},"artifacts":[{"reportTypeId":16554,"displayName":"Intra-Hour Wind Power Forecast By Geographical Region","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-751-cd/ih_wind_fcast_geo"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-751-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-751-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-751-cd"}}},{"emilId":"NP4-752-CD","name":"Intra-Hour Solar Power Forecast by Geographical Region","description":"This report is posted every 5 minutes and includes system-wide and solar region aggregations of the Intra-Hour Photovoltaic Power Forecast (IHPPF) for the next two hours, with five minute resolution.","status":"Active","reportTypeId":21812,"audience":"Public","generationFrequency":"Chron - 5 Minutes","securityClassification":"Public","lastUpdated":"2025-03-07","firstRun":"2022-07-01","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:22:00","bundle":1,"protocolRules":{"NP4.2.3(1)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.3(1)"},"artifacts":[{"reportTypeId":21812,"displayName":"Intra-Hour Solar Power Forecast by Geographical Region","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-752-cd/ih_solar_fcast_geo"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-752-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-752-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-752-cd"}}},{"emilId":"NP4-765-ER","name":"ESR Integration Report","description":"A high level summary of daily Energy Storage Resource generation and penetration records.","status":"Active","reportTypeId":23794,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2023-12-06","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":".pdf","ddlName":"","misDisplayDuration":365,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":365,"lastPostDatetime":"2026-09-05T09:02:42","bundle":1,"protocolRules":{"SCR822":"https://www.ercot.com/mp/data-products?protocolRules=SCR822"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-765-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-765-er"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-765-er"}}},{"emilId":"NP4-790-CD","name":"Peaker Net Margin","description":"The cumulative Peaker Net Margin in dollars per MW since the start of the annual resource adequacy cycle, posted daily.","status":"Active","reportTypeId":12348,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2010-11-29","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T16:00:00","bundle":1,"protocolRules":{"NP4.4.11.1(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.4.11.1(2)"},"artifacts":[{"reportTypeId":12348,"displayName":"Peaker Net Margin","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-790-cd/peaker_net_margin"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-790-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-790-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-790-cd"}}},{"emilId":"NP4-791-CD","name":"Day-Ahead and Real-Time System Wide-Offer Caps","description":"The Day-Ahead and Real-Time Offer Caps in place for Ancillary Services and Energy for the last thirty days on a daily basis. Previously named System-Wide Offer Cap.","status":"Active","reportTypeId":12349,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2010-11-23","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T05:00:00","bundle":1,"protocolRules":{"NP4.4.11.1":"https://www.ercot.com/mp/data-products?protocolRules=NP4.4.11.1"},"artifacts":[{"reportTypeId":12349,"displayName":"Day-Ahead and Real-Time System Wide-Offer Caps","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np4-791-cd/da_sw_offer_caps"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np4-791-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np4-791-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np4-791-cd"}}},{"emilId":"NP5-108-CD","name":"Hourly RMR Services Deployed","description":"Reliability Must Run (RMR) Resources deployed for the prior hour, if any.","status":"Active","reportTypeId":10016,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2010-11-30","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:05:00","bundle":1,"protocolRules":{"NP6.3.2(3)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(3)(c)"},"artifacts":[{"reportTypeId":10016,"displayName":"Hourly RMR Services Deployed","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np5-108-cd/hrly_rmr_services_deployed"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np5-108-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np5-108-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np5-108-cd"}}},{"emilId":"NP5-520-ER","name":"Monthly Ancillary Service Deployment Factors","description":"The average, minimum, and maximum Ancillary Service Deployment Factors used in the Reliability Unit Commitment (RUC) process by type of Ancillary Service and hour of the day for the month.","status":"Active","reportTypeId":25822,"audience":"Public","generationFrequency":"Chron - Monthly","securityClassification":"Public","lastUpdated":"2025-12-06","firstRun":"2025-12-05","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"zip,xlsx","ddlName":null,"misDisplayDuration":365,"archiveDuration":2555,"notificationType":null,"contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2026-09-04T08:01:29","bundle":0,"protocolRules":{"NP 5.5.2(3)(c)":"https://www.ercot.com/mp/data-products?protocolRules=NP 5.5.2(3)(c)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np5-520-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np5-520-er"}}},{"emilId":"NP5-525-CD","name":"Weekly RUC Ancillary Service Deployment Factors","description":"Ancillary Service Deployment Factors used by the Weekly Reliability Unit Commitment (WRUC) process for each hour in the RUC Study Period.","status":"Active","reportTypeId":24897,"audience":"Public","generationFrequency":"Event - Per WRUC Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":365,"lastPostDatetime":"2026-09-05T02:53:12","bundle":0,"protocolRules":{"NP5.5.2(3)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP5.5.2(3)(a)"},"artifacts":[{"reportTypeId":24897,"displayName":"WRUC Ancillary Service Deployment Factors","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np5-525-cd/wruc_as_deploy_factors"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np5-525-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np5-525-cd"}}},{"emilId":"NP5-526-CD","name":"Projected Ancillary Service Deployments Factors","description":"Provides the Ancillary Service Deployments Factors that are projected to be used in the DRUC and HRUC process for the next Operating Day.","status":"Active","reportTypeId":24886,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T05:55:00","bundle":1,"protocolRules":{"NP5.5.2(3)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP5.5.2(3)(b)"},"artifacts":[{"reportTypeId":24886,"displayName":"Projected Ancillary Service Deployments Factors","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np5-526-cd/proj_as_deploy_factor"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np5-526-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np5-526-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np5-526-cd"}}},{"emilId":"NP5-527-CD","name":"Daily RUC Ancillary Service Deployment Factors","description":"Ancillary Service Deployment Factors used by the Daily Reliability Unit Commitment (DRUC) process for each hour in the RUC Study Period.","status":"Active","reportTypeId":24895,"audience":"Public","generationFrequency":"Event - Per DRUC Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":365,"lastPostDatetime":"2026-09-05T14:49:04","bundle":1,"protocolRules":{"NP5.5.2(3)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP5.5.2(3)(a)"},"artifacts":[{"reportTypeId":24895,"displayName":"DRUC Ancillary Service Deployment Factors","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np5-527-cd/druc_as_deploy_factors"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np5-527-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np5-527-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np5-527-cd"}}},{"emilId":"NP5-528-CD","name":"Hourly RUC Ancillary Service Deployment Factors","description":"Ancillary Service Deployment Factors used by the Hourly Reliability Unit Commitment (HRUC) process for each hour in the RUC Study Period.","status":"Active","reportTypeId":24896,"audience":"Public","generationFrequency":"Event - Per HRUC Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":365,"lastPostDatetime":"2026-09-05T18:24:06","bundle":1,"protocolRules":{"NP5.5.2(3)(a)":"https://www.ercot.com/mp/data-products?protocolRules=NP5.5.2(3)(a)"},"artifacts":[{"reportTypeId":24896,"displayName":"HRUC Ancillary Service Deployment Factors","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np5-528-cd/hruc_as_deploy_factors"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np5-528-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np5-528-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np5-528-cd"}}},{"emilId":"NP5-754-CD","name":"Daily RUC Active and Binding Transmission Constraints","description":"List of all active and binding constraints observed in the Day-Ahead Reliability Unit Commitment (RUC) process.","status":"Active","reportTypeId":12338,"audience":"Public","generationFrequency":"Event - Per DRUC Run","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2010-11-29","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T14:49:04","bundle":1,"protocolRules":{"NP5.3(3) ( c )":"https://www.ercot.com/mp/data-products?protocolRules=NP5.3(3)%20(%20c%20)","NP4.2.4.1(1)(e)":"https://www.ercot.com/mp/data-products?protocolRules=NP4.2.4.1(1)(e)"},"artifacts":[{"reportTypeId":12338,"displayName":"Daily RUC Active and Binding Transmission Constraints","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np5-754-cd/daily_ruc_act_and_bind_tran_const"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np5-754-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np5-754-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np5-754-cd"}}},{"emilId":"NP5-755-CD","name":"Hourly RUC Active and Binding Transmission Constraints","description":"All active and binding constraints observed in the Hourly Reliability Unit Commitment (RUC) process.","status":"Active","reportTypeId":12336,"audience":"Public","generationFrequency":"Event - Per HRUC Run","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2010-11-29","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T18:24:06","bundle":1,"protocolRules":{"NP5.3(3) ( c )":"https://www.ercot.com/mp/data-products?protocolRules=NP5.3(3)%20(%20c%20)"},"artifacts":[{"reportTypeId":12336,"displayName":"Hourly RUC Active and Binding Transmission Constraints","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np5-755-cd/hrly_ruc_act_and_bind_tran_const"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np5-755-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np5-755-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np5-755-cd"}}},{"emilId":"NP6-235-CD","name":"System-Wide Demand","description":"Aggregated ERCOT system actual demand by 15-minute interval, for the most recent hour.","status":"Active","reportTypeId":12340,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-02-21","firstRun":"2010-11-30","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:05:00","bundle":1,"protocolRules":{"NP6.3.2(3)(d)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(3)(d)"},"artifacts":[{"reportTypeId":12340,"displayName":"System-Wide Demand","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-235-cd/system_wide_demand"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-235-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-235-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-235-cd"}}},{"emilId":"NP6-322-CD","name":"SCED System Lambda","description":"System lambda of each successful SCED","status":"Active","reportTypeId":13114,"audience":"Public","generationFrequency":"Event - Per SCED Run","securityClassification":"Public","lastUpdated":"2024-10-29","firstRun":"2013-12-11","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":5,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:20:24","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":13114,"displayName":"SCED System Lambda","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-322-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-322-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-322-cd"}}},{"emilId":"NP6-323-CD","name":"Real-Time Price Adders by SCED Interval","description":"This report updates immediately following each SCED run and shows the Real-Time Reliability Deployment Price Adders for energy and for each ancillary service, the total RUC/RMR LDL relaxed, total Load Resource MW deployed that is added to the Demand, total ERS MW deployed that is added to the Demand, total LSL, and total HSL for each SCED interval. Name change from Real-Time ORDC and Reliability Deployment Price Adders and Reserves by SCED Interval.","status":"Active","reportTypeId":13221,"audience":"Public","generationFrequency":"Event - Per SCED Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2014-05-31","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":5,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:20:24","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)","NP6.5.7.3(8)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.3(8)"},"artifacts":[{"reportTypeId":13221,"displayName":"Real-Time Price Adders by SCED Interval","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-323-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-323-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-323-cd"}}},{"emilId":"NP6-324-CD","name":"Real-Time Price Adders for 15-Minute Settlement Interval","description":"This report updates immediately following the end of each 15-minute Settlement Interval and shows the Real-Time On-Line Reliability Deployment Price Adders for energy and each ancillary service type for each 15-minute Settlement Interval. Previously named Real-Time ORDC and Reliability Deployment Prices for 15-minute Settlement Interval.","status":"Active","reportTypeId":13220,"audience":"Public","generationFrequency":"Chron - 15 Minutes","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2014-05-31","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:17:00","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":13220,"displayName":"Real-Time Price Adders for 15-Minute Settlement Interval","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-324-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-324-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-324-cd"}}},{"emilId":"NP6-325-CD","name":"RTD Indicative Price Adders","description":"This report updates immediately following each RTD run and shows the projected the Real-Time Reliability Deployment Price Adders for Energy and Ancillary Services for all the future intervals of the RTD run. This report also shows the total RUC/RMR LSDL relaxed, total Load Resource MW deployed that is added to the Demand, total ERS MW deployed that is added to the Demand, total LSL, total HSL for all the future intervals of the RTD run. Name change from RTD Indicative ORDC and Reliability Deployment Price Adders and Reserves.","status":"Active","reportTypeId":13222,"audience":"Public","generationFrequency":"Event - Per RTD Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2014-05-31","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":5,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:21:40","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)","NP6.5.7.3(16)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.3(16)"},"artifacts":[{"reportTypeId":13222,"displayName":"RTD Indicative Price Adders","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-325-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-325-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-325-cd"}}},{"emilId":"NP6-326-CD","name":"Real-Time Price for SOG","description":"This report provides the Real-Time price for each Settlement Only Distribution Generators (SODGs) and Settlement Only Transmission Generators (SOTGs) for each 15-min Settlement Interval.","status":"Active","reportTypeId":21115,"audience":"Public","generationFrequency":"Chron - 15 Minutes","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2022-02-11","eceii":null,"channel":"EWS, Public","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"csv,xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:17:00","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":21115,"displayName":"Real-Time Price for SOG","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-326-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-326-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-326-cd"}}},{"emilId":"NP6-327-CD","name":"LMP By SOG Including Price Adders","description":"This report provides the nodal prices for Settlement Only Distribution Generators (SODGs) and Settlement Only Transmission Generators (SOTGs) for each SCED interval. The final prices also include the Real-Time Reliability Deployment Price Adders.","status":"Active","reportTypeId":21114,"audience":"Public","generationFrequency":"Event - Per SCED Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2022-02-03","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":5,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:20:36","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":21114,"displayName":"LMP By SOG Including Price Adders","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-327-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-327-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-327-cd"}}},{"emilId":"NP6-328-CD","name":"Total Capability of Resources Available to Provide Ancillary Service","description":"Total capability of Resources available to provide Ancillary Service combinations, based on the Resource telemetry from the QSE and capped by the limits of the Resource and, for ESRs, further capped by Ancillary Service SCED duration requirements and current available State of Charge (SOC), for the most recent SCED execution.","status":"Active","reportTypeId":24887,"audience":"Public","generationFrequency":"Event - Per SCED Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:20:26","bundle":1,"protocolRules":{"NP6.3.2(6)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(6)"},"artifacts":[{"reportTypeId":24887,"displayName":"Total Capability of Resources Available to Provide Ancillary Service","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-328-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-328-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-328-cd"}}},{"emilId":"NP6-329-CD","name":"RTD Indicative Real-Time MCPC","description":"This report updates immediately following each Real-Time Dispatch (RTD) run and shows the projected Market Clearing Prices for Capacity for all Ancillary Services from the Real-time Market for all the future intervals of the RTD run.","status":"Active","reportTypeId":24889,"audience":"Public","generationFrequency":"Event - Per RTD Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:21:40","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)","NP6.5.7.3(16)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.3(16)"},"artifacts":[{"reportTypeId":24889,"displayName":"RTD Indicative Real-Time MCPC","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-329-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-329-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-329-cd"}}},{"emilId":"NP6-331-CD","name":"Real-Time Clearing Prices for Capacity by 15-Minute Settlement Interval","description":"The 15-minute Real-Time Market Clearing Price for Capacity for each Ancillary Service calculated using the time-weighted average of the sum of the Real-Time MCPCs and Real-Time Reliability Deployment Price Adders.","status":"Active","reportTypeId":24898,"audience":"Public","generationFrequency":"Chron - 15 Minutes","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":365,"lastPostDatetime":"2026-09-05T19:17:00","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":24898,"displayName":"Real-Time Clearing Prices for Capacity for 15-Minute Settlement Interval","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-331-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-331-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-331-cd"}}},{"emilId":"NP6-332-CD","name":"Real-Time Clearing Prices for Capacity by SCED Interval","description":"Report contains the Real-Time Market Clearing Prices for Capacity for each Ancillary Service normally produced by SCED every five minutes.","status":"Active","reportTypeId":24891,"audience":"Public","generationFrequency":"Event - Per SCED Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2025-07-07","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":365,"lastPostDatetime":"2026-09-05T19:25:25","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":24891,"displayName":"Real-Time Clearing Prices for Capacity by SCED Interval","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-332-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-332-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-332-cd"}}},{"emilId":"NP6-344-CD","name":"Actual System Load by Study Area","description":"A daily report of actual hourly load data by Study Area for each hour of the previous operating day.","status":"Active","reportTypeId":15954,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2019-02-07","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T05:50:00","bundle":0,"protocolRules":{"NP6.3.2(4)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(4)"},"artifacts":[{"reportTypeId":15954,"displayName":"Actual System Load by Study Area","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-344-cd/act_sys_load_by_study_area"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-344-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-344-cd"}}},{"emilId":"NP6-345-CD","name":"Actual System Load by Weather Zone","description":"Report of Actual hourly load data by weather zone and ERCOT total.","status":"Active","reportTypeId":13101,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2013-06-13","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T05:50:00","bundle":1,"protocolRules":{"NP6.3.2(4)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(4)"},"artifacts":[{"reportTypeId":13101,"displayName":"Actual System Load by Weather Zone","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-345-cd/act_sys_load_by_wzn"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-345-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-345-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-345-cd"}}},{"emilId":"NP6-346-CD","name":"Actual System Load by Forecast Zone","description":"A daily report of Actual System Load by Forecast Zone for each hour of the previous operating day.","status":"Active","reportTypeId":14836,"audience":"Public","generationFrequency":"Chron - Daily","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2017-06-29","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":31,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T05:50:00","bundle":1,"protocolRules":{"NP6.3.2(4)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(4)"},"artifacts":[{"reportTypeId":14836,"displayName":"Actual System Load by Forecast Zone","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-346-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-346-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-346-cd"}}},{"emilId":"NP6-569-CD","name":"SASM MCPC by Ancillary Service Type","description":"Communication of SASM Results. Publish Ancillary Service quantities","status":"Active","reportTypeId":12341,"audience":"Public","generationFrequency":"Event - Per SASM Run","securityClassification":"Public","lastUpdated":"2025-04-12","firstRun":"2010-01-12","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"csv","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2023-12-11T00:00:00","bundle":0,"protocolRules":{"NP6.4.8.2.3":"https://www.ercot.com/mp/data-products?protocolRules=NP6.4.8.2.3"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-569-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-569-cd"}}},{"emilId":"NP6-625-CD","name":"State Estimator Load Report - Total ERCOT Generation","description":"The aggregate generation of real and reactive power (MW and MVAR) for the entire ERCOT system.","status":"Active","reportTypeId":12358,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-02-21","firstRun":"2010-11-29","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:10:00","bundle":1,"protocolRules":{"NP6.5.7.1.13(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.1.13(7)"},"artifacts":[{"reportTypeId":12358,"displayName":"State Estimator Load Report - Total ERCOT Generation","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-625-cd/se_ld_rpt_ercot_gen"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-625-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-625-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-625-cd"}}},{"emilId":"NP6-626-CD","name":"State Estimator Load Report - DC Ties Flows","description":"The export or import of real power for each of the DC Ties","status":"Active","reportTypeId":12359,"audience":"Public","generationFrequency":"Chron - Hourly","securityClassification":"Public","lastUpdated":"2024-02-21","firstRun":"2010-11-29","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip,csv,xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:10:00","bundle":1,"protocolRules":{"NP6.5.7.1.13(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.1.13(7)","PUCT25.505(f)(2)(E)":"https://www.ercot.com/mp/data-products?protocolRules=PUCT25.505(f)(2)(E)"},"artifacts":[{"reportTypeId":12359,"displayName":"State Estimator Load Report - DC Ties Flows","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-626-cd/se_load_dcties_flows"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-626-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-626-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-626-cd"}}},{"emilId":"NP6-655-CD","name":"Total Ancillary Service Procured in SASM","description":"Communication of SASM Results. Publish Ancillary Service quantities","status":"Active","reportTypeId":12343,"audience":"Public","generationFrequency":"Event - Per SASM Run","securityClassification":"Public","lastUpdated":"2025-04-12","firstRun":"2010-01-12","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"csv","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2023-12-11T00:00:00","bundle":0,"protocolRules":{"NP6.4.8.2.3":"https://www.ercot.com/mp/data-products?protocolRules=NP6.4.8.2.3"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-655-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-655-cd"}}},{"emilId":"NP6-787-CD","name":"LMPs by Electrical Bus","description":"The Locational Marginal Price for each Electrical Bus, normally produced by SCED every five minutes..","status":"Active","reportTypeId":11485,"audience":"Public","generationFrequency":"Event - Per SCED Run","securityClassification":"Public","lastUpdated":"2025-12-05","firstRun":"2010-11-30","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":5,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:20:24","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":11485,"displayName":"LMP by Electrical Bus","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-787-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-787-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-787-cd"}}},{"emilId":"NP6-788-CD","name":"LMPs by Resource Nodes, Load Zones and Trading Hubs","description":"The Locational Marginal Price for each Settlement Point, normally produced by SCED every five minutes.","status":"Active","reportTypeId":12300,"audience":"Public","generationFrequency":"Event - Per SCED Run","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2010-11-30","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":5,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:20:24","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":12300,"displayName":"LMPs by Resource Nodes, Load Zones and Trading Hubs","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-788-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-788-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-788-cd"}}},{"emilId":"NP6-792-ER","name":"Historical Real-Time Price Adders by SCED Interval","description":"This report updates every week for the previous week and shows the Real-Time On-Line Reliability Deployment Price Adders for energy and each ancillary service, the total RUC/RMR LDL relaxed, total Load Resource MW deployed that is added to the Demand, total ERS MW deployed that is added to the Demand, total LSL, and total HSL for each SCED interval in the previous week. Previously named: Historical Real Time ORDC and Reliability Deployment Price Adders and Reserves.","status":"Active","reportTypeId":13231,"audience":"Public","generationFrequency":"Chron - Weekly","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2014-06-07","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,xlsx","ddlName":"","misDisplayDuration":0,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":365,"lastPostDatetime":"2026-08-30T10:11:22","bundle":0,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-792-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-792-er"}}},{"emilId":"NP6-793-ER","name":"Historical Real-Time Price Adders for 15-Minute Settlement Interval","description":"This report updates every week for the previous week and shows historical Real-Time On-Line Reliability Deployment Price Adders for energy and each ancillary service type for each 15-minute Settlement Interval of the previous week. Previously named: Historical Real-Time ORDC and Reliability Deployment Prices for 15-minute Settlement Interval.","status":"Active","reportTypeId":13240,"audience":"Public","generationFrequency":"Chron - Weekly","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2014-08-02","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,xlsx","ddlName":"","misDisplayDuration":0,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":365,"lastPostDatetime":"2026-08-30T10:02:24","bundle":0,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-793-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-793-er"}}},{"emilId":"NP6-794-ER","name":"Historical Total Capability of Resources Available to Provide Ancillary Services by SCED Interval","description":"This report updates every week for the previous week and shows the total capability of Resources available to provide the following Ancillary Service combinations, based on the Resource telemetry from the QSE and capped by the limits of the Resource and, for ESRs, further capped by Ancillary Service SCED duration requirements and current available State of Charge (SOC), for all SCED intervals of the previous week.","status":"Active","reportTypeId":25568,"audience":"Public","generationFrequency":"Chron - Weekly","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,xlsx","ddlName":"","misDisplayDuration":0,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2026-08-30T08:03:34","bundle":0,"protocolRules":{"NP6.3.2(7)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(7)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-794-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-794-er"}}},{"emilId":"NP6-795-ER","name":"Historical RTM Clearing Prices for Capacity by SCED Interval","description":"This report updates every week for the previous week and shows the Real-Time Market Clearing Prices for Capacity for each Ancillary Service produced by each SCED interval of the previous week.","status":"Active","reportTypeId":25569,"audience":"Public","generationFrequency":"Chron - Weekly","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,xlsx","ddlName":"","misDisplayDuration":0,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2026-08-30T10:04:08","bundle":0,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-795-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-795-er"}}},{"emilId":"NP6-796-ER","name":"Historical RTM Clearing Prices for Capacity by 15-Minute Settlement Interval","description":"This report updates every week for the previous week and shows the 15-minute Real-Time Market Clearing Price for Capacity for each Ancillary Service for each 15-minute Settlement Interval of the previous week.","status":"Active","reportTypeId":25570,"audience":"Public","generationFrequency":"Chron - Weekly","securityClassification":"Public","lastUpdated":"2025-12-08","firstRun":"2025-12-05","eceii":"","channel":"Public,EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"","misPostingLocation":"","certificateRole":"","fileType":"zip,xlsx","ddlName":"","misDisplayDuration":0,"archiveDuration":2555,"notificationType":"","contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2026-08-30T10:02:18","bundle":0,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-796-er"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-796-er"}}},{"emilId":"NP6-86-CD","name":"SCED Shadow Prices and Binding Transmission Constraints","description":"The report for Shadow Prices of binding/violated constraints in SCED. The report shows the contingency name, overloaded element details (element name, from/to station name and kV level), Shadow Price ( price for resolving one MW of the constraint), Penalty for violating the constraint (MaxShadow Price), overloaded element limit and flow (value)pairs that caused such constraint.","status":"Active","reportTypeId":12302,"audience":"Public","generationFrequency":"Chron - Hourly,when needed","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2010-11-30","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:05:00","bundle":1,"protocolRules":{"NP3.19.4(6)":"https://www.ercot.com/mp/data-products?protocolRules=NP3.19.4(6)","PUC Substantive Rule §25.505":"https://www.ercot.com/mp/data-products?protocolRules=PUC Substantive Rule §25.505","NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)","NP6.5.7.1.13(4)(b)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.1.13(4)(b)"},"artifacts":[{"reportTypeId":12302,"displayName":"SCED Shadow Prices and Binding Transmission Constraints","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-86-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-86-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-86-cd"}}},{"emilId":"NP6-905-CD","name":"Settlement Point Prices at Resource Nodes, Hubs and Load Zones","description":"Settlement Point Price for each Settlement Point, produced from SCED LMPs every 15 minutes.","status":"Active","reportTypeId":12301,"audience":"Public","generationFrequency":"Chron - 15 Minutes","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2010-11-30","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":7,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:17:01","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)"},"artifacts":[{"reportTypeId":12301,"displayName":"Settlement Point Prices at Resource Nodes, Hubs and Load Zones","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-905-cd/spp_node_zone_hub"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-905-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-905-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-905-cd"}}},{"emilId":"NP6-913-CD","name":"SASM Aggregated Ancillary Service Offer Curve","description":"Aggregated AS Offer Curve for each AS for each hour.","status":"Active","reportTypeId":12350,"audience":"Public","generationFrequency":"Event - Per SASM Run","securityClassification":"Public","lastUpdated":"2025-04-12","firstRun":"2010-01-12","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"csv","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"BINARY","downloadLimit":1000,"lastPostDatetime":"2023-12-11T00:00:00","bundle":0,"protocolRules":{"NP6.4.8.2.3":"https://www.ercot.com/mp/data-products?protocolRules=NP6.4.8.2.3"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-913-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-913-cd"}}},{"emilId":"NP6-915-CD","name":"Summary Report of HDL and LDL","description":"Posted after every SCED runand includes the sum of the High Dispatch Limit (HDL) and the sum of the Low Dispatch Limit (LDL) for all Generation Resources On-Line and Dispatched by SCED.","status":"Active","reportTypeId":13081,"audience":"Public","generationFrequency":"Event - Per SCED Run","securityClassification":"Public","lastUpdated":"2024-02-21","firstRun":"2012-06-26","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":7,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T19:20:25","bundle":1,"protocolRules":{"NP6.5.7.1.13(8)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.1.13(8)"},"artifacts":[{"reportTypeId":13081,"displayName":"Summary Report of HDL and LDL","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-915-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-915-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-915-cd"}}},{"emilId":"NP6-970-CD","name":"RTD Indicative LMPs by Resource Nodes, Load Zones and Hubs","description":"This report is posted after every Look Ahead RTD run and includes indicative LMPs at Resource Nodes, Hub LMPs and Load Zone for each interval in the Look Ahead SCED-RTD Study Period.","status":"Active","reportTypeId":13073,"audience":"Public","generationFrequency":"Chron - 5 Minutes","securityClassification":"Public","lastUpdated":"2024-07-10","firstRun":"2012-06-27","eceii":"","channel":"Public,EWS,Data Portal","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":"","xsdName":"Current Day Reports XSD","misPostingLocation":"","certificateRole":"","fileType":"zip,csv,xml","ddlName":"","misDisplayDuration":5,"archiveDuration":2555,"notificationType":"","contentType":"DATA","downloadLimit":1000,"lastPostDatetime":"2026-09-05T19:21:40","bundle":1,"protocolRules":{"NP6.3.2(2)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.3.2(2)","NP6.5.7.3(11)":"https://www.ercot.com/mp/data-products?protocolRules=NP6.5.7.3(11)"},"artifacts":[{"reportTypeId":13073,"displayName":"RTD Indicative LMPs by Resource Nodes, Load Zones and Hubs","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np6-970-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np6-970-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np6-970-cd"}}},{"emilId":"NP7-464-CD","name":"Day Ahead Point-to-Point Option Price Report","description":"The Point-to-Point Option price in dollars identified by Source & Sink Settlement Point calculated by MMS from the Day-Ahead Market for the last thirty days on a daily basis.","status":"Active","reportTypeId":10042,"audience":"Public","generationFrequency":"Event - Per DAM Run","securityClassification":"Public","lastUpdated":"2026-02-09","firstRun":"2010-11-29","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":"Current Day Reports XSD","misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":31,"archiveDuration":2555,"notificationType":null,"contentType":"DATA","downloadLimit":50,"lastPostDatetime":"2026-09-05T12:39:19","bundle":1,"protocolRules":{"NP7.9.1.2(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP7.9.1.2(5)"},"artifacts":[{"reportTypeId":10042,"displayName":"Day Ahead Point-to-Point Option Price Report","_links":{"endpoint":{"href":"https://api.ercot.com/api/public-reports/np7-464-cd/dam_ptp_option_price_report"}}}],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np7-464-cd"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np7-464-cd"},"bundle":{"href":"https://api.ercot.com/api/public-reports/bundle/np7-464-cd"}}},{"emilId":"NP7-535-SG","name":"Monthly Path Specific Adders","description":"Displays the path specific adders used in the calculation of the Obligation bid credit requirements for the associated monthly CRR Auction.","status":"Active","reportTypeId":13110,"audience":"Public","generationFrequency":"Event - As Needed","securityClassification":"Public","lastUpdated":"2024-09-30","firstRun":"2013-09-25","eceii":null,"channel":"Public, EWS","userGuide":null,"postingType":"Report","market":"Nodal","extractSubscriber":null,"xsdName":null,"misPostingLocation":null,"certificateRole":null,"fileType":"zip, csv, xml","ddlName":null,"misDisplayDuration":365,"archiveDuration":2555,"notificationType":null,"contentType":"BINARY","downloadLimit":365,"lastPostDatetime":"2026-09-02T08:00:06","bundle":0,"protocolRules":{"NP7.5.3(5)":"https://www.ercot.com/mp/data-products?protocolRules=NP7.5.3(5)"},"artifacts":[],"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/np7-535-sg"},"parent":{"href":"https://api.ercot.com/api/public-reports"},"archive":{"href":"https://api.ercot.com/api/public-reports/archive/np7-535-sg"}}}]},"_links":{"self":{"href":"https://api.ercot.com/api/public-reports/"}}} diff --git a/tests/fixtures/public/daily-prc-live.json b/tests/fixtures/public/daily-prc-live.json new file mode 100644 index 00000000..e57a3bfe --- /dev/null +++ b/tests/fixtures/public/daily-prc-live.json @@ -0,0 +1 @@ +{"lastUpdated":"2026-09-05 19:26:54-0500","current_condition":{"condition_note":"There is enough power for current demand.","eea_level":0,"energy_level_value":20,"state":"normal","title":"Normal Conditions","prc_value":"11,013","index":7001,"datetime":1788654414},"data":[{"timestamp":"2026-09-05 00:00:06-0500","epoch":1788584406000,"interval":"00:00:06","dstFlag":"N","prc":11238},{"timestamp":"2026-09-05 00:00:14-0500","epoch":1788584414000,"interval":"00:00:14","dstFlag":"N","prc":11242},{"timestamp":"2026-09-05 19:26:46-0500","epoch":1788654406000,"interval":"19:26:46","dstFlag":"N","prc":11037},{"timestamp":"2026-09-05 19:26:54-0500","epoch":1788654414000,"interval":"19:26:54","dstFlag":"N","prc":11013}]} diff --git a/tests/fixtures/public/dc-tie-flows-live.json b/tests/fixtures/public/dc-tie-flows-live.json new file mode 100644 index 00000000..6348f14a --- /dev/null +++ b/tests/fixtures/public/dc-tie-flows-live.json @@ -0,0 +1 @@ +{"lastUpdated":"2026-09-05 19:32:10-0500","data":[{"currentFrequency":59.993,"currentSystemInertia":323984,"dcE":0,"dcN":-218,"dcL":70,"dcR":0,"timestamp":"2026-09-05 00:00:00-0500","epoch":1788584400000,"interval":"00:00:00","dstFlag":"N"},{"currentFrequency":59.993,"currentSystemInertia":323984,"dcE":0,"dcN":-218,"dcL":70,"dcR":0,"timestamp":"2026-09-05 00:00:10-0500","epoch":1788584410000,"interval":"00:00:10","dstFlag":"N"},{"currentFrequency":59.98,"currentSystemInertia":346834,"dcE":-74,"dcN":-76,"dcL":19,"dcR":0,"timestamp":"2026-09-05 19:32:00-0500","epoch":1788654720000,"interval":"19:32:00","dstFlag":"N"},{"currentFrequency":59.981,"currentSystemInertia":346834,"dcE":-74,"dcN":-76,"dcL":19,"dcR":0,"timestamp":"2026-09-05 19:32:10-0500","epoch":1788654730000,"interval":"19:32:10","dstFlag":"N"}]} diff --git a/tests/fixtures/public/fuel-mix-live.json b/tests/fixtures/public/fuel-mix-live.json new file mode 100644 index 00000000..0d6de586 --- /dev/null +++ b/tests/fixtures/public/fuel-mix-live.json @@ -0,0 +1 @@ +{"lastUpdated":"2026-09-05 19:21:00-0500","monthlyCapacity":{"Power Storage":20654,"Solar":39428,"Wind":40404,"Hydro":449,"Other":0,"Natural Gas":70002,"Coal and Lignite":13705,"Nuclear":5268},"data":{"2026-09-04":{"2026-09-04 00:00:00-0500":{"Coal and Lignite":{"gen":9738.0927734375},"Hydro":{"gen":7.0029296875},"Nuclear":{"gen":4958.525390625},"Other":{"gen":50.4000015258789},"Power Storage":{"gen":-1307.51257324219},"Solar":{"gen":0.83529132604599},"Wind":{"gen":21635.3671875},"Natural Gas":{"gen":30015.6174087524466}},"2026-09-04 00:05:00-0500":{"Coal and Lignite":{"gen":9587.6728515625},"Hydro":{"gen":0},"Nuclear":{"gen":4958.3603515625},"Other":{"gen":50.5},"Power Storage":{"gen":-1215.74792480469},"Solar":{"gen":0.863039016723633},"Wind":{"gen":21689.75390625},"Natural Gas":{"gen":29862.5668945312474}},"2026-09-04 23:50:00-0500":{"Coal and Lignite":{"gen":11499.5791015625},"Hydro":{"gen":10.2250003814697},"Nuclear":{"gen":4960.80712890625},"Other":{"gen":50},"Power Storage":{"gen":566.880310058594},"Solar":{"gen":0.337747246026993},"Wind":{"gen":16182.3349609375},"Natural Gas":{"gen":33134.4154052734428}},"2026-09-04 23:55:00-0500":{"Coal and Lignite":{"gen":11439.8994140625},"Hydro":{"gen":11.2840003967285},"Nuclear":{"gen":4962.82763671875},"Other":{"gen":50.0999984741211},"Power Storage":{"gen":599.481262207031},"Solar":{"gen":0.333452641963959},"Wind":{"gen":16230.7958984375},"Natural Gas":{"gen":32846.7348861694388}}},"2026-09-05":{"2026-09-05 00:00:00-0500":{"Coal and Lignite":{"gen":11367.8017578125},"Hydro":{"gen":11.2489995956421},"Nuclear":{"gen":4963.2216796875},"Other":{"gen":49.9000015258789},"Power Storage":{"gen":358.335510253906},"Solar":{"gen":0.338132262229919},"Wind":{"gen":16140.6650390625},"Natural Gas":{"gen":32740.5688018798848}},"2026-09-05 00:05:00-0500":{"Coal and Lignite":{"gen":11251.9697265625},"Hydro":{"gen":3.25799989700317},"Nuclear":{"gen":4960.45849609375},"Other":{"gen":49.9000015258789},"Power Storage":{"gen":506.161163330078},"Solar":{"gen":0.332228183746338},"Wind":{"gen":16099.3369140625},"Natural Gas":{"gen":32566.9384384155276}},"2026-09-05 19:15:00-0500":{"Coal and Lignite":{"gen":10652.2822265625},"Hydro":{"gen":155.14794921875},"Nuclear":{"gen":4956.251953125},"Other":{"gen":104.5},"Power Storage":{"gen":7607.85595703125},"Solar":{"gen":4190.796875},"Wind":{"gen":11624.857421875},"Natural Gas":{"gen":40742.577972412105}},"2026-09-05 19:20:00-0500":{"Coal and Lignite":{"gen":10677.6923828125},"Hydro":{"gen":158.285736083984},"Nuclear":{"gen":4957.22412109375},"Other":{"gen":104.5},"Power Storage":{"gen":8173.15478515625},"Solar":{"gen":3312.0673828125},"Wind":{"gen":11735.8779296875},"Natural Gas":{"gen":40753.427581787109}}}}} diff --git a/tests/fixtures/public/generation-outages-live.json b/tests/fixtures/public/generation-outages-live.json new file mode 100644 index 00000000..c730c824 --- /dev/null +++ b/tests/fixtures/public/generation-outages-live.json @@ -0,0 +1 @@ +{"lastUpdated":"2026-09-05 19:31:00-0500","currentOutages":15206,"days":{"previous":["2026-08-30","2026-08-31","2026-09-01","2026-09-02","2026-09-03","2026-09-04"],"current":["2026-09-05"]},"types":["Dispatchable","Renewable"],"current":{"1788584460000":{"deliveryTime":"2026-09-05 00:01:00-0500","dstFlag":"N","Combined":{"unplanned":14714,"planned":481,"total":15195},"Dispatchable":{"unplanned":9356,"planned":481,"total":9837},"Renewable":{"unplanned":5358,"planned":0,"total":5358}},"1788584760000":{"deliveryTime":"2026-09-05 00:06:00-0500","dstFlag":"N","Combined":{"unplanned":14704,"planned":481,"total":15185},"Dispatchable":{"unplanned":9356,"planned":481,"total":9837},"Renewable":{"unplanned":5348,"planned":0,"total":5348}},"1788654360000":{"deliveryTime":"2026-09-05 19:26:00-0500","dstFlag":"N","Combined":{"unplanned":14725,"planned":481,"total":15206},"Dispatchable":{"unplanned":9331,"planned":481,"total":9812},"Renewable":{"unplanned":5394,"planned":0,"total":5394}},"1788654660000":{"deliveryTime":"2026-09-05 19:31:00-0500","dstFlag":"N","Combined":{"unplanned":14725,"planned":481,"total":15206},"Dispatchable":{"unplanned":9331,"planned":481,"total":9812},"Renewable":{"unplanned":5394,"planned":0,"total":5394}}},"previous":{"1788066060000":{"deliveryTime":"2026-08-30 00:01:00-0500","dstFlag":"N","Combined":{"unplanned":19047,"planned":186,"total":19233},"Dispatchable":{"unplanned":13442,"planned":61,"total":13503},"Renewable":{"unplanned":5605,"planned":125,"total":5730}},"1788066360000":{"deliveryTime":"2026-08-30 00:06:00-0500","dstFlag":"N","Combined":{"unplanned":19047,"planned":186,"total":19233},"Dispatchable":{"unplanned":13442,"planned":61,"total":13503},"Renewable":{"unplanned":5605,"planned":125,"total":5730}},"1788583860000":{"deliveryTime":"2026-09-04 23:51:00-0500","dstFlag":"N","Combined":{"unplanned":14005,"planned":481,"total":14486},"Dispatchable":{"unplanned":8606,"planned":481,"total":9087},"Renewable":{"unplanned":5399,"planned":0,"total":5399}},"1788584160000":{"deliveryTime":"2026-09-04 23:56:00-0500","dstFlag":"N","Combined":{"unplanned":14029,"planned":481,"total":14510},"Dispatchable":{"unplanned":8630,"planned":481,"total":9111},"Renewable":{"unplanned":5399,"planned":0,"total":5399}}}} diff --git a/tests/fixtures/public/resource-dme-excerpt.json b/tests/fixtures/public/resource-dme-excerpt.json new file mode 100644 index 00000000..5c41cb23 --- /dev/null +++ b/tests/fixtures/public/resource-dme-excerpt.json @@ -0,0 +1,105 @@ +{ + "product_id": "NP3-988-ER", + "source_url": "https://www.ercot.com/mp/data-products/data-product-details?id=np3-988-er", + "transformation": "Exact CSV headers and first three data records of two selected public source documents. All cells remain strings; complete CSV/ZIP bytes remain ignored local evidence.", + "samples": [ + { + "document_id": 1270779234, + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er/download", + "retrieved_at": "2026-09-06 00:41:23.171960+00:00", + "sha256": "98d58b35701a712bab1ca82449063ac512a8b63851fae51cf5096388773cd455", + "byte_count": 22983, + "status": 200 + }, + "member": "1270779234.rpt.00010036.0000000000000000.20260905.050243.ResDMEList_05092026.csv", + "header": [ + "OWNER RE", + "RESOURCE NAME", + "TYPE", + "SPLIT GEN RESOURCE", + "DME", + "DME DUNS", + "RMR" + ], + "rows": [ + [ + "1370 SHANNON LLC (RE)", + "SHANNONW_UNIT_1", + "Generation", + "Not Applicable", + "1370 SHANNON LLC (DME)", + "1450336317000", + "N" + ], + [ + "224WB 8ME LLC (RE)", + "GALLOWAY_SOLAR2", + "Generation", + "Not Applicable", + "224WB 8ME LLC (DME)", + "0815527087000", + "N" + ], + [ + "225DD 8ME LLC (RE)", + "GALLOWAY_SOLAR1", + "Generation", + "Not Applicable", + "225DD 8ME LLC (DME)", + "0815490207000", + "N" + ] + ] + }, + { + "document_id": 1166614741, + "receipt": { + "source_url": "https://api.ercot.com/api/public-reports/archive/np3-988-er/download", + "retrieved_at": "2026-09-06 00:46:01.484878+00:00", + "sha256": "a9bba9ffbe187ba84ba64452378c229bf99e6b76e5a04f596d6952b89cf6408d", + "byte_count": 21892, + "status": 200 + }, + "member": "1166614741.rpt.00010036.0000000000000000.20251201.051353614.ResDMEList_01122025.csv", + "header": [ + "OWNER RE", + "RESOURCE NAME", + "TYPE", + "SPLIT GEN RESOURCE", + "DME", + "DME DUNS", + "RMR" + ], + "rows": [ + [ + "224WB 8ME LLC (RE)", + "GALLOWAY_SOLAR2", + "Generation", + "Not Applicable", + "224WB 8ME LLC (DME)", + "0815527087000", + "N" + ], + [ + "225DD 8ME LLC (RE)", + "GALLOWAY_SOLAR1", + "Generation", + "Not Applicable", + "225DD 8ME LLC (DME)", + "0815490207000", + "N" + ], + [ + "226HC 8ME LLC (RE)", + "HOLSTEIN_SOLAR1", + "Generation", + "Not Applicable", + "226HC 8ME LLC (DME)", + "1169540657000", + "N" + ] + ] + } + ] +} diff --git a/tests/fixtures/public/rt-archive-excerpt.json b/tests/fixtures/public/rt-archive-excerpt.json new file mode 100644 index 00000000..ac7e05aa --- /dev/null +++ b/tests/fixtures/public/rt-archive-excerpt.json @@ -0,0 +1,144 @@ +{ + "product_id": "NP6-785-ER", + "product_url": "https://www.ercot.com/mp/data-products/data-product-details?id=np6-785-er", + "listing_receipt": { + "source_url": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=13061", + "retrieved_at": "2026-09-06 00:26:33.636260+00:00", + "sha256": "0c7866f25ce81543e62538522df8d1c6eda20a60ef9bcf37558255ab7cdb5a11", + "byte_count": 7812, + "status": 200 + }, + "transformation": "First header and three data rows from Dec_1/2010 and Jan/2026; unmodified cell values. Workbook bytes remain outside the repository.", + "samples": [ + { + "listing_document": { + "ExpiredDate": "4712-12-31T00:00:00-06:00", + "ILMStatus": "EXT", + "SecurityStatus": "P", + "ContentSize": "1292145", + "Extension": "zip", + "ReportTypeID": "13061", + "Prefix": "rpt", + "FriendlyName": "RTMLZHBSPP_2010", + "ConstructedName": "rpt.00013061.0000000000000000.20130614.140718000.RTMLZHBSPP_2010.zip", + "DocID": "318479603", + "PublishDate": "2013-06-14T14:07:18-05:00", + "ReportName": "Historical RTM Load Zone and Hub Prices", + "DUNS": "0000000000000000", + "DocCount": "0" + }, + "receipt": { + "source_url": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=318479603&reportTypeId=13061", + "retrieved_at": "2026-09-06 00:26:46.768037+00:00", + "sha256": "c5bd52346cc6644abdf65dbf452060fef6dac40f4b79c151726f3d3c8c4c8fe0", + "byte_count": 1292145, + "status": 200 + }, + "member": "rpt.00013061.0000000000000000.RTMLZHBSPP_2010.xlsx", + "sheet": "Dec_1", + "header": [ + "Delivery Date", + "Delivery Hour", + "Delivery Interval", + "Repeated Hour Flag", + "Settlement Point Name", + "Settlement Point Type", + "Settlement Point Price" + ], + "rows": [ + [ + "12/01/2010", + 1, + 1, + "N", + "HB_BUSAVG", + "SH", + 25.08 + ], + [ + "12/01/2010", + 1, + 2, + "N", + "HB_BUSAVG", + "SH", + 23.19 + ], + [ + "12/01/2010", + 1, + 3, + "N", + "HB_BUSAVG", + "SH", + 23.59 + ] + ] + }, + { + "listing_document": { + "ExpiredDate": "4712-12-31T00:00:00-06:00", + "ILMStatus": "EXT", + "SecurityStatus": "P", + "ContentSize": "9091870", + "Extension": "zip", + "ReportTypeID": "13061", + "Prefix": "rpt", + "FriendlyName": "RTMLZHBSPP_2026", + "ConstructedName": "rpt.00013061.0000000000000000.20260830.080747312.RTMLZHBSPP_2026.zip", + "DocID": "1268443390", + "PublishDate": "2026-08-30T08:07:44-05:00", + "ReportName": "Historical RTM Load Zone and Hub Prices", + "DUNS": "0000000000000000", + "DocCount": "0" + }, + "receipt": { + "source_url": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=1268443390&reportTypeId=13061", + "retrieved_at": "2026-09-06 00:27:10.672048+00:00", + "sha256": "d2dd9f121dbcbdba370d4bc50f9652ff4e7d38987860b9e8fe454e65adc25238", + "byte_count": 9091870, + "status": 200 + }, + "member": "rpt.00013061.0000000000000000.RTMLZHBSPP_2026.xlsx", + "sheet": "Jan", + "header": [ + "Delivery Date", + "Delivery Hour", + "Delivery Interval", + "Repeated Hour Flag", + "Settlement Point Name", + "Settlement Point Type", + "Settlement Point Price" + ], + "rows": [ + [ + "01/01/2026", + 1, + 1, + "N", + "HB_BUSAVG", + "SH", + 18.06 + ], + [ + "01/01/2026", + 1, + 2, + "N", + "HB_BUSAVG", + "SH", + 17.96 + ], + [ + "01/01/2026", + 1, + 3, + "N", + "HB_BUSAVG", + "SH", + 18.62 + ] + ] + } + ] +} diff --git a/tests/test_api_archives.py b/tests/test_api_archives.py new file mode 100644 index 00000000..aab3a63a --- /dev/null +++ b/tests/test_api_archives.py @@ -0,0 +1,172 @@ +"""Mocked archive transport with source-derived public document metadata.""" + +import copy +import io +import json +import zipfile +from dataclasses import replace +from pathlib import Path + +import httpx +import pytest + +from tinyercot.public import Credentials, Limits +from tinyercot.public._http import ( + AccessDeniedError, + LimitError, + SchemaMismatchError, +) +from tinyercot.public.api_archives import APIArchive, APIArchiveClient + +EVIDENCE = json.loads( + (Path(__file__).parent / "fixtures/public/api-archive-excerpt.json").read_text() +) + + +def archive_client(*, product_change=None, archive_change=None, raw=None): + product = copy.deepcopy(EVIDENCE["product"]) + product.update(product_change or {}) + listing = copy.deepcopy(EVIDENCE["archive_excerpt"]) + listing["_meta"]["totalRecords"] = 2 + if archive_change: + archive_change(listing) + if raw is None: + stream = io.BytesIO() + with zipfile.ZipFile(stream, "w") as zipped: + zipped.writestr("unknown.csv", "UnverifiedColumn\nvalue\n") + raw = stream.getvalue() + calls = [] + + def handle(request): + calls.append(request) + if request.method == "POST" and "token" in request.url.path: + return httpx.Response( + 200, json={"id_token": "synthetic-token", "expires_in": 3600} + ) + if request.url.path.endswith("/public-reports/"): + return httpx.Response(200, json={"_embedded": {"products": [product]}}) + if request.method == "POST": + assert request.url.path.endswith("/archive/np3-988-er/download") + assert request.headers["content-type"].startswith("application/json") + assert json.loads(request.content) == {"docIds": [1270779234]} + return httpx.Response(200, content=raw) + return httpx.Response(200, json=listing) + + client = APIArchiveClient( + Credentials("synthetic@example.test", "synthetic-password", "synthetic-key"), + limits=Limits(min_interval=0), + transport=httpx.MockTransport(handle), + ) + return client, calls + + +def test_public_metadata_gate_and_single_selected_download(): + client, calls = archive_client() + with client: + with pytest.raises(ValueError, match="products"): + client.archives("np3-988-er") + assert not calls + client.products() + page = client.archives("NP3-988-ER") + assert page.total_records == 2 and page.current_page == page.total_pages == 1 + assert len(page.documents) == 2 + document = page.documents[0] + assert document.post_datetime == "2026-09-05T05:02:43.000" + downloaded = client.download(document) + assert downloaded.row_schema == "unknown" + assert downloaded.members == ("unknown.csv",) + assert "UnverifiedColumn" not in repr(downloaded) + assert downloaded.receipt.byte_count == len(downloaded.body) + assert len(calls) == 4 + + +@pytest.mark.parametrize("classification", ["Secure", "Certified", "Unknown", None]) +def test_nonpublic_gate_before_archive_request(classification): + client, calls = archive_client( + product_change={"securityClassification": classification} + ) + with client: + client.products() + with pytest.raises(AccessDeniedError): + client.archives("np3-988-er") + assert len(calls) == 2 + + +@pytest.mark.parametrize("status", ["Inactive", "Retired"]) +def test_public_inactive_history_remains_selectable(status): + client, calls = archive_client(product_change={"status": status}) + with client: + client.products() + page = client.archives("np3-988-er") + assert page.lifecycle == "retired-or-inactive" + assert client.download(page.documents[0]).row_schema == "unknown" + assert len(calls) == 4 + + +def test_audited_retirement_is_visible_without_blocking_public_listing(): + def retired_listing(body): + body["product"]["emilId"] = "NP6-569-CD" + body["_links"]["self"]["href"] = body["_links"]["self"]["href"].replace( + "np3-988-er", "np6-569-cd" + ) + for item in body["archives"]: + link = item["_links"]["endpoint"] + link["href"] = link["href"].replace("np3-988-er", "np6-569-cd") + + client, _ = archive_client( + product_change={"emilId": "NP6-569-CD"}, archive_change=retired_listing + ) + with client: + client.products() + page = client.archives("np6-569-cd") + assert page.lifecycle == "retired-or-inactive" + assert len(page.documents) == 2 + + +def test_unlisted_changed_and_refreshed_documents_fail_closed(): + client, calls = archive_client() + with client: + client.products() + page = client.archives("np3-988-er") + with pytest.raises(AccessDeniedError): + client.download(APIArchive("private", 123, "unknown", "unknown")) + with pytest.raises(AccessDeniedError): + client.download(replace(page.documents[0], document_id=123)) + assert len(calls) == 3 + client.products() + with pytest.raises(AccessDeniedError): + client.download(page.documents[0]) + assert len(calls) == 4 + + +@pytest.mark.parametrize( + "change", + [ + lambda body: body["product"].update(emilId="private"), + lambda body: body["_meta"].update(totalRecords=3), + lambda body: body["archives"][0].update(docId=True), + lambda body: body["archives"][0].update(postDatetime="yesterday"), + lambda body: body["archives"][0]["_links"]["endpoint"].update( + href="https://example.test/private" + ), + ], +) +def test_metadata_contract_drift(change): + client, _ = archive_client(archive_change=change) + with client: + client.products() + with pytest.raises(SchemaMismatchError): + client.archives("np3-988-er") + + +def test_html_download_and_zip_expansion_limits(): + for raw, error in [ + (b"No Document", SchemaMismatchError), + (None, LimitError), + ]: + client, _ = archive_client(raw=raw) + with client: + client.products() + document = client.archives("np3-988-er").documents[0] + with pytest.raises(error): + client.download(document, max_expanded_bytes=1) diff --git a/tests/test_api_bundles.py b/tests/test_api_bundles.py new file mode 100644 index 00000000..301e3fab --- /dev/null +++ b/tests/test_api_bundles.py @@ -0,0 +1,110 @@ +"""Explicit signed bundle IDs and route separation from source metadata.""" + +import copy +import io +import json +import zipfile +from dataclasses import replace +from pathlib import Path + +import httpx +import pytest + +from tinyercot.public import Credentials, Limits +from tinyercot.public._http import AccessDeniedError, SchemaMismatchError +from tinyercot.public.api_archives import ( + APIArchive, + APIArchiveClient, + APIBundle, + APIBundlePage, +) + +EVIDENCE = json.loads( + (Path(__file__).parent / "fixtures/public/api-bundle-excerpt.json").read_text() +) + + +def bundle_client(change=None): + body = copy.deepcopy(EVIDENCE["bundle_excerpt"]) + body["_meta"]["totalRecords"] = len(body["bundles"]) + if change: + change(body) + buffer = io.BytesIO() + with zipfile.ZipFile(buffer, "w") as zipped: + zipped.writestr("unknown.csv", "Unknown\n1\n") + calls = [] + + def handle(request): + calls.append(request) + if request.url.path.endswith("/token"): + return httpx.Response( + 200, json={"id_token": "synthetic", "expires_in": 3600} + ) + if request.url.path.endswith("/public-reports/"): + return httpx.Response( + 200, json={"_embedded": {"products": [EVIDENCE["product"]]}} + ) + if request.method == "POST": + assert request.url.path.endswith("/bundle/np4-190-cd/download") + assert json.loads(request.content) == {"docIds": [-1257192853]} + return httpx.Response(200, content=buffer.getvalue()) + assert request.url.path.endswith("/bundle/np4-190-cd") + return httpx.Response(200, json=body) + + return APIArchiveClient( + Credentials("synthetic", "synthetic", "synthetic"), + limits=Limits(min_interval=0), + transport=httpx.MockTransport(handle), + ), calls + + +def test_signed_bundle_contract_and_explicit_download(): + client, calls = bundle_client() + with client: + client.products() + page = client.bundles("NP4-190-CD") + assert isinstance(page, APIBundlePage) + assert isinstance(page.documents[0], APIBundle) + assert page.documents[0].document_id == -1257192853 + file = client.download_bundle(page.documents[0]) + assert file.row_schema == "unknown" + assert file.document == page.documents[0] + assert len(calls) == 4 + + +def test_bundle_and_archive_routes_never_fall_back(): + client, calls = bundle_client() + with client: + client.products() + document = client.bundles("NP4-190-CD").documents[0] + with pytest.raises(AccessDeniedError): + client.download(document) + with pytest.raises(AccessDeniedError): + client.download_bundle(replace(document, document_id=123)) + ordinary = APIArchive( + document.emil_id, + document.document_id, + document.friendly_name, + document.post_datetime, + ) + with pytest.raises(AccessDeniedError): + client.download_bundle(ordinary) + assert len(calls) == 3 + + +@pytest.mark.parametrize( + "change", + [ + lambda body: body["bundles"][0].update(docId=0), + lambda body: body["bundles"][0].update(docId=-(2**63) - 1), + lambda body: body["bundles"][0]["_links"]["endpoint"].update( + href="https://api.ercot.com/api/public-reports/archive/np4-190-cd?download=-1257192853" + ), + ], +) +def test_bundle_contract_drift(change): + client, _ = bundle_client(change) + with client: + client.products() + with pytest.raises(SchemaMismatchError): + client.bundles("np4-190-cd") diff --git a/tests/test_installed_evidence_index.py b/tests/test_installed_evidence_index.py new file mode 100644 index 00000000..4076c12f --- /dev/null +++ b/tests/test_installed_evidence_index.py @@ -0,0 +1,76 @@ +"""Keep live receipt accounting separate from generated and complete-query claims.""" + +import hashlib +import json +from pathlib import Path +from urllib.parse import parse_qs, urlsplit + +from tinyercot.public._schemas import ENDPOINTS + +ROOT = Path(__file__).resolve().parents[1] + + +def test_installed_index_binds_generated_paths_and_both_source_directions(): + index = json.loads( + (ROOT / "docs/evidence/installed-registry-index.json").read_text() + ) + manifest = ROOT / "tools/inputs/current/provenance.json" + assert index["manifest_sha256"] == hashlib.sha256(manifest.read_bytes()).hexdigest() + paths = {entry["path"] for entry in index["paths"]} + assert paths == {endpoint.path for endpoint in ENDPOINTS} + assert ( + index["generated_unique_paths"] == index["installed_unique_paths"] == len(paths) + ) + assert ( + index["current_unique_paths"] + == index["oldest_first_unique_paths"] + == len(paths) + ) + assert not index["pending_generated_paths"] + counts = {"current": 0, "historical": 0} + for entry in index["paths"]: + assert "site-packages" in entry["installed_module"] + assert {record["period"] for record in entry["records"]} == set(counts) + for record in entry["records"]: + counts[record["period"]] += 1 + receipt = record["receipt"] + assert record["status"] == "typed" and record["rows"] >= 1 + assert set(receipt) == { + "source_url", + "sha256", + "byte_count", + "retrieved_at", + "status", + } + assert len(receipt["sha256"]) == 64 and receipt["status"] == 200 + url = urlsplit(receipt["source_url"]) + assert url.scheme == "https" and url.netloc == "api.ercot.com" + assert url.path == "/api/public-reports" + entry["path"] + if record["period"] == "historical": + query = parse_qs(url.query) + assert query["dir"] == ["asc"] and query["sort"] == [record["sort"]] + assert counts == { + "current": index["current_requests"], + "historical": index["oldest_first_requests"], + } + + +def test_pagination_claims_reference_actual_pages_and_matching_totals(): + index = json.loads( + (ROOT / "docs/evidence/installed-registry-index.json").read_text() + ) + evidence = json.loads( + (ROOT / index["pagination"]["complete_selection"]["evidence"]).read_text() + ) + pages = [ + r + for r in evidence["receipts"] + if r["kind"] == "typed-reports-complete-selection" + ] + assert [record["page"] for record in pages] == [1, 2] + assert {record["total_records"] for record in pages} == { + sum(r["rows"] for r in pages) + } + assert index["pagination"]["live_complete_selection_unique_paths"] == 1 + assert index["pagination"]["new_batch_pagination_requests"] == 0 + assert not index["pagination"]["complete_history_extraction"] diff --git a/tests/test_metadata_boundaries.py b/tests/test_metadata_boundaries.py new file mode 100644 index 00000000..dd381fa9 --- /dev/null +++ b/tests/test_metadata_boundaries.py @@ -0,0 +1,279 @@ +"""Adversarial metadata must not authorize restricted or unknown retrieval.""" + +import hashlib +import json + +import httpx +import pytest + +from tinyercot.catalog import Access +from tinyercot.public import Credentials, StreamingLimits +from tinyercot.public._http import AccessDeniedError, SchemaMismatchError +from tinyercot.public.api import BASE +from tinyercot.public.api_archives import APIArchiveClient +from tinyercot.public.metadata import decode_product +from tools import discover_public, generate_public, register_public_batch + + +def product(**changes): + result = { + "emilId": "NP4-190-CD", + "name": "Synthetic public product", + "status": "Active", + "contentType": "DATA", + "securityClassification": "Public", + "audience": "Public", + "artifacts": [ + { + "reportTypeId": 12345, + "displayName": "Synthetic artifact", + "_links": { + "endpoint": {"href": BASE + "/np4-190-cd/dam_stlmnt_pnt_prices"} + }, + } + ], + } + result.update(changes) + return result + + +@pytest.mark.parametrize( + "security,audience,expected", + [ + ("Public", "Public", Access.PUBLIC), + ("Public", "Certified", Access.RESTRICTED), + ("Public", "Secure", Access.RESTRICTED), + ("Public", None, Access.UNKNOWN), + ("Public", "new-audience", Access.UNKNOWN), + ("Secure", "Public", Access.RESTRICTED), + ("Certified", "Public", Access.RESTRICTED), + (None, "Public", Access.UNKNOWN), + ], +) +def test_access_requires_consistent_explicit_public_evidence( + security, audience, expected +): + assert ( + decode_product( + product(securityClassification=security, audience=audience) + ).access + is expected + ) + + +def test_missing_audience_is_not_public(): + body = product() + body.pop("audience") + assert decode_product(body).access is Access.UNKNOWN + + +@pytest.mark.parametrize("audience", [True, 1, [], {}]) +def test_unknown_audience_types_fail_closed(audience): + with pytest.raises(SchemaMismatchError): + decode_product(product(audience=audience)) + + +@pytest.mark.parametrize( + "url", + [ + "http://api.ercot.com/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices", + "https://evil.example/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices", + "https://api.ercot.com@evil.example/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices", + BASE + "/np4-190-cd/dam_stlmnt_pnt_prices?private=1", + BASE + "/np4-190-cd/dam_stlmnt_pnt_prices#token", + BASE + "/np4-190-cd/../participant-only", + BASE + "/np4-190-cd/%2e%2e/participant-only", + BASE + "/np4-188-cd/dam_clear_price_for_cap", + ], +) +def test_malicious_or_cross_product_artifact_links_fail_closed(url): + body = product() + body["artifacts"][0]["_links"]["endpoint"]["href"] = url + with pytest.raises(SchemaMismatchError): + decode_product(body) + + +@pytest.mark.parametrize("audience", ["Certified", "Secure", "new-audience", None]) +def test_nonpublic_audience_cannot_authorize_archive_request(audience): + requests = [] + + def transport(request): + requests.append(str(request.url)) + if request.method == "POST": + return httpx.Response( + 200, json={"id_token": "synthetic", "expires_in": 3600} + ) + if str(request.url) == BASE + "/": + return httpx.Response( + 200, json={"_embedded": {"products": [product(audience=audience)]}} + ) + pytest.fail("Nonpublic metadata authorized an archive request") + + with APIArchiveClient( + Credentials("test", "test", "test"), + limits=StreamingLimits(min_interval=0), + transport=httpx.MockTransport(transport), + ) as client: + client.products() + with pytest.raises(AccessDeniedError): + client.archives("np4-190-cd") + assert len(requests) == 2 + + +def write_root(directory, products, **receipt_changes): + raw = json.dumps({"_embedded": {"products": products}}).encode() + (directory / "root.json").write_bytes(raw) + receipt = { + "source_url": BASE + "/", + "sha256": hashlib.sha256(raw).hexdigest(), + "byte_count": len(raw), + "status": 200, + "retrieved_at": "2026-09-06T00:00:00+00:00", + } + receipt.update(receipt_changes) + (directory / "root-receipt.json").write_text(json.dumps(receipt)) + + +def test_batch_root_receipts_reject_headers_before_preserving_provenance(tmp_path): + write_root(tmp_path, [], headers={"Authorization": "synthetic-must-not-be-copied"}) + with pytest.raises(ValueError): + register_public_batch.project_batch(tmp_path, tmp_path / "unused.json") + + +@pytest.mark.parametrize( + "changes", + [{"status": "Inactive"}, {"status": "Retired"}, {"contentType": "BINARY"}], +) +def test_batch_does_not_project_inactive_or_binary_rows(tmp_path, monkeypatch, changes): + write_root(tmp_path, [product(**changes)]) + source = tmp_path / "np4-190-cd--dam_stlmnt_pnt_prices--current.json" + source.write_text("{}") + + def unexpected_discovery(**kwargs): + pytest.fail("Inactive or binary product reached row schema discovery") + + monkeypatch.setattr(register_public_batch, "discover", unexpected_discovery) + contracts, _ = register_public_batch.project_batch( + tmp_path, tmp_path / "unused.json" + ) + assert contracts == [] + + +@pytest.fixture +def schema_evidence(tmp_path, monkeypatch): + path = "/np4-190-cd/dam_stlmnt_pnt_prices" + spec = tmp_path / "spec.json" + spec.write_text(json.dumps({"paths": {path: {"get": {"parameters": []}}}})) + catalog = tmp_path / "catalog.json" + catalog.write_text( + json.dumps( + { + "sources": { + "public-reports": { + "sha256": hashlib.sha256(spec.read_bytes()).hexdigest() + } + }, + "operations": [ + {"service": "public-reports", "kind": "data", "path": path} + ], + } + ) + ) + monkeypatch.setattr(discover_public, "CATALOG", catalog) + return { + "spec": spec, + "response": tmp_path / "row.json", + "receipt": tmp_path / "receipt.json", + "path": path, + } + + +def write_response(evidence, *, kind="INTEGER", value=None, suffix=""): + raw = json.dumps( + {"fields": [{"name": "observedField", "dataType": kind}], "data": [[value]]} + ).encode() + evidence["response"].write_bytes(raw) + evidence["receipt"].write_text( + json.dumps( + { + "source_url": BASE + evidence["path"] + suffix, + "retrieved_at": "2026-09-06T00:00:00+00:00", + "sha256": hashlib.sha256(raw).hexdigest(), + "byte_count": len(raw), + "status": 200, + } + ) + ) + + +def test_null_observation_is_opt_in_and_does_not_create_installed_proof( + schema_evidence, +): + write_response(schema_evidence) + assert discover_public.discover(**schema_evidence)["row_schema"] == "unknown" + projected = discover_public.discover(**schema_evidence, allow_observed_nulls=True) + assert projected["row_schema"] == "verified_observed" + assert projected["observed_nullable_fields"] == ["observedField"] + assert "installed" not in projected + + +@pytest.mark.parametrize( + "kind,value", + [("UUID", None), ("STRUCT", {}), ("INTEGER", True), ("INTEGER", "123")], +) +def test_opt_in_nulls_do_not_bypass_unsupported_types(schema_evidence, kind, value): + write_response(schema_evidence, kind=kind, value=value) + assert ( + discover_public.discover(**schema_evidence, allow_observed_nulls=True)[ + "row_schema" + ] + == "unknown" + ) + + +@pytest.mark.parametrize("suffix", ["#token=synthetic", "?Authorization="]) +def test_observation_receipt_rejects_nonquery_fragments_and_blank_unknown_keys( + schema_evidence, suffix +): + write_response(schema_evidence, value=123, suffix=suffix) + with pytest.raises(ValueError): + discover_public.discover(**schema_evidence) + + +@pytest.mark.parametrize( + "changes", + [ + {"audience": "Certified"}, + {"securityClassification": "Secure"}, + {"status": "Retired"}, + {"contentType": "BINARY"}, + ], +) +def test_generator_rejects_pinned_but_ineligible_product_evidence( + tmp_path, monkeypatch, changes +): + manifest = json.loads(generate_public.MANIFEST.read_text()) + entry, pin = next( + ( + entry, + json.loads((generate_public.MANIFEST.parent / entry["input"]).read_text()), + ) + for entry in manifest["contracts"] + if "product_evidence" + in json.loads((generate_public.MANIFEST.parent / entry["input"]).read_text()) + ) + pin["product_evidence"].update(changes) + raw = json.dumps(pin).encode() + (tmp_path / entry["input"]).write_bytes(raw) + manifest_path = tmp_path / "provenance.json" + manifest_path.write_text( + json.dumps( + { + "inputs": {entry["input"]: hashlib.sha256(raw).hexdigest()}, + "contracts": [entry], + } + ) + ) + monkeypatch.setattr(generate_public, "MANIFEST", manifest_path) + with pytest.raises(ValueError): + generate_public.contracts() diff --git a/tests/test_metadata_registry.py b/tests/test_metadata_registry.py new file mode 100644 index 00000000..8fffa520 --- /dev/null +++ b/tests/test_metadata_registry.py @@ -0,0 +1,96 @@ +"""Check every generated current contract against its two bounded source samples.""" + +import datetime +import hashlib +from pathlib import Path + +import httpx +import pytest + +from tinyercot.catalog import Access +from tinyercot.public import Credentials, StreamingLimits +from tinyercot.public._http import Payload, Receipt +from tinyercot.public._schemas import ENDPOINTS +from tinyercot.public.metadata import MetadataClient +from tinyercot.public.reports import decode_page + +ROOT = Path(__file__).resolve().parents[1] +BATCH = ROOT / "tests/fixtures/public/batch" +NEW = [endpoint for endpoint in ENDPOINTS if "product_evidence" in endpoint.contract] + + +@pytest.mark.parametrize("endpoint", NEW, ids=lambda endpoint: endpoint.path) +@pytest.mark.parametrize("period", ["current", "historical"]) +def test_generated_rows_decode_primary_source_observations(endpoint, period): + name = endpoint.path.strip("/").replace("/", "--") + "--" + period + ".json" + path = BATCH / name + if not path.exists(): + pytest.skip("No source row observation for this period") + # apply_patch stores a final newline; source observations have none. + raw = path.read_bytes().removesuffix(b"\n") + digest = hashlib.sha256(raw).hexdigest() + assert digest in { + receipt["sha256"] for receipt in endpoint.contract["observations"] + } + receipt = Receipt( + "https://api.ercot.com/api/public-reports" + endpoint.path, + datetime.datetime.now(datetime.UTC), + digest, + len(raw), + ) + decoded = decode_page(Payload(raw, receipt), endpoint, page=1, size=1) + assert len(decoded.rows) == 1 + assert type(decoded.rows[0]) is endpoint.row_model + assert set(type(decoded.rows[0]).model_fields) == { + field["name"] for field in endpoint.contract["fields"] + } + + +def test_public_metadata_retains_access_and_artifacts_without_row_claims(): + raw = (BATCH / "root.json").read_bytes() + + def transport(request): + if request.method == "POST": + return httpx.Response( + 200, json={"id_token": "synthetic", "expires_in": 3600} + ) + return httpx.Response(200, content=raw) + + with MetadataClient( + Credentials("test", "test", "test"), + limits=StreamingLimits(min_interval=0), + transport=httpx.MockTransport(transport), + ) as client: + products, receipt = client.products() + assert len(products) == 116 + assert all(product.access is Access.PUBLIC for product in products) + assert sum(len(product.artifacts) for product in products) == 242 + assert receipt.sha256 == hashlib.sha256(raw).hexdigest() + + +def test_generated_datetime_filters_preserve_source_naive_time_and_reject_offsets(): + endpoint = next( + ep + for ep in NEW + if any( + p["schema"].get("format") == "yyyy-MM-ddTH24:mm:ss" + for p in ep.contract["query_parameters"] + ) + ) + name = next( + p["name"] + for p in endpoint.contract["query_parameters"] + if p["schema"].get("format") == "yyyy-MM-ddTH24:mm:ss" + ) + from tinyercot.public.reports import query_parameters + + assert ( + query_parameters( + endpoint, {name: datetime.datetime.fromisoformat("2026-09-04T01:02:03")} + )[name] + == "2026-09-04T01:02:03" + ) + with pytest.raises(ValueError): + query_parameters( + endpoint, {name: datetime.datetime(2026, 9, 4, tzinfo=datetime.UTC)} + ) diff --git a/tests/test_probe_api_archives.py b/tests/test_probe_api_archives.py new file mode 100644 index 00000000..9ac60283 --- /dev/null +++ b/tests/test_probe_api_archives.py @@ -0,0 +1,56 @@ +"""Offline checks for the installed probe's receipt-verified cache binding.""" + +import json +from dataclasses import asdict + +import pytest +from test_resource_dme import EVIDENCE, source_file + +from tinyercot.public._http import SchemaMismatchError +from tools.probe_api_archives import cached_file + + +def write_evidence(tmp_path): + archive = source_file(EVIDENCE["samples"][0]) + path = tmp_path / f"download--np3-988-er--{archive.document.document_id}.zip" + path.write_bytes(archive.body) + path.with_suffix(".receipt.json").write_text( + json.dumps(asdict(archive.receipt), default=str) + ) + (tmp_path / "archive--np3-988-er.json").write_text( + json.dumps( + { + "archives": [ + { + "docId": archive.document.document_id, + "friendlyName": archive.document.friendly_name, + "postDatetime": archive.document.post_datetime, + } + ] + } + ) + ) + return archive, path + + +def test_cached_document_preserves_original_receipt(tmp_path): + archive, _ = write_evidence(tmp_path) + verified = cached_file(tmp_path, archive.document) + assert verified == archive + + +def test_changed_file_or_receipt_fails_without_network(tmp_path): + archive, path = write_evidence(tmp_path) + path.write_bytes(archive.body + b"changed") + with pytest.raises(SchemaMismatchError, match="receipt"): + cached_file(tmp_path, archive.document) + + +def test_publication_metadata_cannot_be_rebound(tmp_path): + archive, _ = write_evidence(tmp_path) + source = tmp_path / "archive--np3-988-er.json" + body = json.loads(source.read_text()) + body["archives"][0]["postDatetime"] = "2026-01-01T00:00:00" + source.write_text(json.dumps(body)) + with pytest.raises(SchemaMismatchError, match="metadata changed"): + cached_file(tmp_path, archive.document) diff --git a/tests/test_public_aggregate_dashboards.py b/tests/test_public_aggregate_dashboards.py new file mode 100644 index 00000000..d577b0d9 --- /dev/null +++ b/tests/test_public_aggregate_dashboards.py @@ -0,0 +1,245 @@ +import datetime +import hashlib +import json +from decimal import Decimal +from pathlib import Path + +import httpx +import pytest + +from tinyercot.public._http import Limits, Payload, Receipt, SchemaMismatchError +from tinyercot.public.aggregate_dashboards import ( + DC_TIE_FLOWS_URL, + GENERATION_OUTAGES_URL, + AggregateDashboardClient, + decode_dc_tie_flows, + decode_generation_outages, +) + +FIXTURES = Path(__file__).parent / "fixtures/public" +OUTAGES = (FIXTURES / "generation-outages-live.json").read_bytes() +TIES = (FIXTURES / "dc-tie-flows-live.json").read_bytes() + + +def payload(raw): + return Payload( + raw, + Receipt( + GENERATION_OUTAGES_URL, + datetime.datetime(2026, 9, 6, 0, 35, tzinfo=datetime.UTC), + hashlib.sha256(raw).hexdigest(), + len(raw), + ), + ) + + +def test_outages_retain_current_previous_metadata_and_epoch_keys(): + result = decode_generation_outages(payload(OUTAGES)) + assert len(result.current) == 4 + assert len(result.previous) == 4 + assert result.current_outages == 15206 + assert result.current[-1].source_epoch == "1788654660000" + assert result.current[-1].row.combined.unplanned == 14725 + assert result.current[-1].row.combined.planned == 481 + assert result.current[-1].row.dispatchable.total == 9812 + assert result.current[-1].row.renewable.total == 5394 + assert result.current[-1].row.deliveryTime == "2026-09-05 19:31:00-0500" + assert result.current[-1].row.dstFlag == "N" + assert result.days.current == ("2026-09-05",) + assert len(result.days.previous) == 6 + assert result.resource_types == ("Dispatchable", "Renewable") + assert result.raw == OUTAGES + assert not result.is_stale() + + +def test_dc_ties_retain_signed_flows_and_frequency_precision(): + result = decode_dc_tie_flows(payload(TIES)) + assert len(result.rows) == 4 + row = result.rows[0] + assert row.currentFrequency == Decimal("59.993") + assert row.currentSystemInertia == 323984 + assert row.dcE == 0 and row.dcN == -218 and row.dcL == 70 and row.dcR == 0 + assert row.timestamp == "2026-09-05 00:00:00-0500" + assert row.epoch == 1788584400000 + assert row.interval == "00:00:00" and row.dstFlag == "N" + assert result.raw == TIES + assert not result.is_stale() + + +@pytest.mark.parametrize("bad", [None, True, "1", 1.5, {}, []]) +def test_unknown_outage_numeric_types_fail_closed(bad): + body = json.loads(OUTAGES) + next(iter(body["current"].values()))["Combined"]["planned"] = bad + with pytest.raises(SchemaMismatchError): + decode_generation_outages(payload(json.dumps(body).encode())) + + +@pytest.mark.parametrize( + "change", + [ + "epoch", + "offset", + "extra", + "missing", + "new_type", + "day", + "duplicate_day", + "section", + "future", + "reverse", + "total_type", + ], +) +def test_outage_schema_and_time_drift_fail_closed(change): + body = json.loads(OUTAGES) + key = next(iter(body["current"])) + row = body["current"][key] + if change == "epoch": + body["current"][str(int(key) + 1)] = body["current"].pop(key) + elif change == "offset": + row["deliveryTime"] = row["deliveryTime"].replace("-0500", "-0600") + elif change == "extra": + row["Combined"]["unknown"] = 1 + elif change == "missing": + row.pop("Renewable") + elif change == "new_type": + body["types"].append("Unknown Resource") + elif change == "day": + body["days"]["current"] = ["2026-09-03"] + elif change == "duplicate_day": + body["days"]["previous"].append(body["days"]["current"][0]) + elif change == "section": + body["current"] = [] + elif change == "future": + body["lastUpdated"] = "2026-09-04 19:31:00-0500" + elif change == "reverse": + body["current"] = dict(reversed(list(body["current"].items()))) + elif change == "total_type": + body["currentOutages"] = True + with pytest.raises(SchemaMismatchError): + decode_generation_outages(payload(json.dumps(body).encode())) + + +@pytest.mark.parametrize( + "field,bad", + [ + ("currentFrequency", None), + ("currentFrequency", "60"), + ("currentFrequency", True), + ("currentFrequency", float("nan")), + ("currentFrequency", float("inf")), + ("currentSystemInertia", None), + ("dcE", "1"), + ("dcN", 1.5), + ("dcL", True), + ("dcR", None), + ("epoch", "1788584400000"), + ("dstFlag", False), + ], +) +def test_dc_tie_numeric_and_label_types_fail_closed(field, bad): + body = json.loads(TIES) + body["data"][0][field] = bad + with pytest.raises(SchemaMismatchError): + decode_dc_tie_flows(payload(json.dumps(body).encode())) + + +@pytest.mark.parametrize( + "change", + [ + "epoch", + "interval", + "offset", + "extra", + "missing", + "duplicate", + "reverse", + "future", + "data_type", + ], +) +def test_dc_tie_schema_and_temporal_drift_fail_closed(change): + body = json.loads(TIES) + row = body["data"][0] + if change == "epoch": + row["epoch"] += 1 + elif change == "interval": + row["interval"] = "01:00:00" + elif change == "offset": + row["timestamp"] = row["timestamp"].replace("-0500", "-0600") + elif change == "extra": + row["unknown"] = 1 + elif change == "missing": + row.pop("dcR") + elif change == "duplicate": + body["data"].insert(0, row) + elif change == "reverse": + body["data"].reverse() + elif change == "future": + body["lastUpdated"] = "2026-09-04 19:32:10-0500" + elif change == "data_type": + body["data"] = {} + with pytest.raises(SchemaMismatchError): + decode_dc_tie_flows(payload(json.dumps(body).encode())) + + +def test_outage_dst_repeated_local_hour_remains_two_distinct_instants(): + body = json.loads(OUTAGES) + original = next(iter(body["current"].values())) + body["current"] = {} + body["previous"] = {} + body["days"] = {"current": ["2026-11-01"], "previous": []} + body["lastUpdated"] = "2026-11-01 01:30:00-0600" + for text in ["2026-11-01 01:30:00-0500", "2026-11-01 01:30:00-0600"]: + stamp = datetime.datetime.strptime(text, "%Y-%m-%d %H:%M:%S%z") + body["current"][str(int(stamp.timestamp() * 1000))] = { + **original, + "deliveryTime": text, + "dstFlag": "unknown-meaning", + } + result = decode_generation_outages(payload(json.dumps(body).encode())) + assert result.current[0].timestamp < result.current[1].timestamp + assert result.current[0].row.dstFlag == "unknown-meaning" + + +def test_outage_totals_remain_source_values_without_recalculation(): + body = json.loads(OUTAGES) + next(iter(body["current"].values()))["Combined"]["total"] = 123 + result = decode_generation_outages(payload(json.dumps(body).encode())) + assert result.current[0].row.combined.total == 123 + + +def test_public_aggregate_methods_each_make_one_anonymous_capture(): + requests = [] + + def handler(request): + requests.append(request) + assert "Authorization" not in request.headers + assert "Ocp-Apim-Subscription-Key" not in request.headers + assert not request.url.query + return httpx.Response( + 200, + content={GENERATION_OUTAGES_URL: OUTAGES, DC_TIE_FLOWS_URL: TIES}[ + str(request.url) + ], + ) + + with AggregateDashboardClient( + limits=Limits(min_interval=0), transport=httpx.MockTransport(handler) + ) as client: + assert requests == [] + assert client.generation_outages().current + assert client.dc_tie_flows().rows + assert len(requests) == 2 + + +def test_aggregate_fixture_provenance_hashes(): + root = Path(__file__).resolve().parents[1] + evidence = json.loads( + (root / "docs/evidence/aggregate-dashboard-fixture-provenance.json").read_text() + ) + for record in evidence["fixtures"]: + assert ( + hashlib.sha256((root / record["fixture"]).read_bytes()).hexdigest() + == record["fixture_sha256"] + ) diff --git a/tests/test_public_coverage.py b/tests/test_public_coverage.py index 37faf453..bec4f360 100644 --- a/tests/test_public_coverage.py +++ b/tests/test_public_coverage.py @@ -2,16 +2,18 @@ from tinyercot.catalog import operations from tinyercot.public import coverage +from tinyercot.public._schemas import ENDPOINTS def test_every_audited_family_and_operation_has_an_explicit_scope(): entries = coverage() - assert len(entries) == 39 + 257 + 2 + assert len(entries) == 39 + 257 + 8 assert len({entry.key for entry in entries}) == len(entries) - assert Counter(entry.status for entry in entries)["covered"] == 6 + assert Counter(entry.status for entry in entries)["covered"] == len(ENDPOINTS) + 11 assert {entry.status for entry in entries} == { "covered", - "deferred", + "pending", + "retired", "restricted", "unavailable", } @@ -32,14 +34,18 @@ def test_typed_counts_do_not_claim_broad_api_coverage(): typed = [ entry for entry in coverage() - if entry.key.startswith("api:") and entry.status == "covered" + if entry.key.startswith("api:") + and entry.status == "covered" + and entry.title in {operation.path for operation in observed} ] assert len(observed) == 243 assert len({(op.service, op.path.split("/")[1]) for op in observed}) == 98 - assert len(typed) == 4 - assert {entry.title.split("/")[1] for entry in typed} == { - "np4-190-cd", - "np4-188-cd", - "np6-905-cd", - "np6-345-cd", - } + assert len(typed) == len(ENDPOINTS) == 56 + assert {entry.title for entry in typed} == {endpoint.path for endpoint in ENDPOINTS} + + +def test_retirement_does_not_exclude_available_public_history(): + retired = [entry for entry in coverage() if entry.status == "retired"] + assert len(retired) == 2 + assert all("available history remain active" in entry.scope for entry in retired) + assert not any(entry.status == "deferred" for entry in coverage()) diff --git a/tests/test_public_dashboards.py b/tests/test_public_dashboards.py new file mode 100644 index 00000000..d1bc84f4 --- /dev/null +++ b/tests/test_public_dashboards.py @@ -0,0 +1,273 @@ +import datetime +import hashlib +import json +from dataclasses import replace +from decimal import Decimal +from pathlib import Path + +import httpx +import pytest + +from tinyercot.public._http import ( + AccessDeniedError, + Limits, + Payload, + Receipt, + SchemaMismatchError, +) +from tinyercot.public.dashboards import ( + DAILY_PRC_URL, + FUEL_MIX_URL, + DashboardClient, + decode_fuel_mix, + decode_grid_conditions, +) + +FIXTURES = Path(__file__).parent / "fixtures/public" +FUEL = (FIXTURES / "fuel-mix-live.json").read_bytes() +PRC = (FIXTURES / "daily-prc-live.json").read_bytes() + + +def payload(raw, url=FUEL_MIX_URL): + return Payload( + raw, + Receipt( + url, + datetime.datetime(2026, 9, 6, 0, 27, tzinfo=datetime.UTC), + hashlib.sha256(raw).hexdigest(), + len(raw), + ), + ) + + +def test_fuel_mix_retains_exact_numbers_capacity_and_source_time(): + snapshot = decode_fuel_mix(payload(FUEL)) + assert len(snapshot.rows) == 8 + assert snapshot.rows[0].generation.natural_gas == Decimal("30015.6174087524466") + assert snapshot.rows[0].generation.power_storage == Decimal("-1307.51257324219") + assert snapshot.monthly_capacity.power_storage == 20654 + assert snapshot.rows[0].source_day == "2026-09-04" + assert snapshot.rows[0].source_timestamp == "2026-09-04 00:00:00-0500" + assert snapshot.rows[0].timestamp.utcoffset() == datetime.timedelta(hours=-5) + assert snapshot.source_last_updated == "2026-09-05 19:21:00-0500" + assert snapshot.raw == FUEL + assert not snapshot.is_stale() + assert snapshot.is_stale(max_age=datetime.timedelta(minutes=1)) + assert replace( + snapshot, + last_updated=snapshot.receipt.retrieved_at + datetime.timedelta(seconds=1), + ).is_stale() + with pytest.raises(ValueError): + snapshot.is_stale(max_age=datetime.timedelta(seconds=-1)) + + +def test_grid_conditions_retains_status_and_prc_time_evidence(): + snapshot = decode_grid_conditions(payload(PRC, DAILY_PRC_URL)) + assert len(snapshot.rows) == 4 + assert snapshot.current_condition.state == "normal" + assert ( + snapshot.current_condition.condition_note + == "There is enough power for current demand." + ) + assert snapshot.current_condition.prc_value == "11,013" + assert snapshot.current_condition.index == 7001 + assert snapshot.rows[-1].prc == 11013 + assert snapshot.rows[-1].epoch == snapshot.current_condition.datetime * 1000 + assert snapshot.rows[-1].dstFlag == "N" + assert snapshot.raw == PRC + assert not snapshot.is_stale() + + +@pytest.mark.parametrize( + "bad", [None, True, "12.3", [], {}, float("nan"), float("inf")] +) +def test_fuel_mix_rejects_unobserved_numeric_types(bad): + body = json.loads(FUEL) + first = next(iter(next(iter(body["data"].values())).values())) + first["Wind"]["gen"] = bad + with pytest.raises(SchemaMismatchError): + decode_fuel_mix(payload(json.dumps(body).encode())) + + +@pytest.mark.parametrize( + "change", + [ + "extra", + "missing", + "new_fuel", + "nested", + "capacity", + "wrong_day", + "bad_offset", + "future", + "reverse", + "data_type", + ], +) +def test_fuel_mix_rejects_schema_and_temporal_drift(change): + body = json.loads(FUEL) + day = next(iter(body["data"])) + observations = body["data"][day] + first_time = next(iter(observations)) + first = observations[first_time] + if change == "extra": + body["unknown"] = [] + elif change == "missing": + first.pop("Solar") + elif change == "new_fuel": + first["New Fuel"] = {"gen": 1} + elif change == "nested": + first["Wind"]["forecast"] = 1 + elif change == "capacity": + body["monthlyCapacity"]["Wind"] = "1" + elif change == "wrong_day": + body["data"]["2026-09-03"] = body["data"].pop(day) + elif change == "bad_offset": + observations[first_time.replace("-0500", "-0600")] = observations.pop( + first_time + ) + elif change == "future": + body["lastUpdated"] = "2026-09-03 19:21:00-0500" + elif change == "reverse": + body["data"][day] = dict(reversed(list(observations.items()))) + elif change == "data_type": + body["data"] = [] + with pytest.raises(SchemaMismatchError): + decode_fuel_mix(payload(json.dumps(body).encode())) + + +@pytest.mark.parametrize( + "change", + [ + "epoch", + "interval", + "offset", + "boolean", + "string", + "null", + "extra", + "missing", + "status", + "condition_time", + "duplicate", + "reverse", + "rows_type", + ], +) +def test_prc_rejects_schema_and_temporal_drift(change): + body = json.loads(PRC) + row = body["data"][0] + if change == "epoch": + row["epoch"] += 1 + elif change == "interval": + row["interval"] = "12:00:00" + elif change == "offset": + row["timestamp"] = row["timestamp"].replace("-0500", "-0600") + elif change == "boolean": + row["prc"] = True + elif change == "string": + row["prc"] = "11238" + elif change == "null": + row["prc"] = None + elif change == "extra": + row["unknown"] = 1 + elif change == "missing": + row.pop("dstFlag") + elif change == "status": + body["current_condition"]["state"] = 0 + elif change == "condition_time": + body["current_condition"]["datetime"] += 1 + elif change == "duplicate": + body["data"].insert(0, row) + elif change == "reverse": + body["data"].reverse() + elif change == "rows_type": + body["data"] = {} + with pytest.raises(SchemaMismatchError): + decode_grid_conditions(payload(json.dumps(body).encode(), DAILY_PRC_URL)) + + +def test_unknown_status_labels_are_preserved_without_inventing_enum_semantics(): + body = json.loads(PRC) + body["current_condition"]["state"] = "new-source-state" + body["current_condition"]["title"] = "New source title" + body["data"][0]["dstFlag"] = "uninterpreted-source-flag" + snapshot = decode_grid_conditions(payload(json.dumps(body).encode())) + assert snapshot.current_condition.state == "new-source-state" + assert snapshot.rows[0].dstFlag == "uninterpreted-source-flag" + + +@pytest.mark.parametrize( + "timestamps", + [ + ["2026-11-01 01:30:00-0500", "2026-11-01 01:30:00-0600"], + ["2026-03-08 01:55:00-0600", "2026-03-08 03:00:00-0500"], + ], +) +def test_prc_explicit_offsets_disambiguate_dst(timestamps): + body = json.loads(PRC) + body["data"] = [] + for text in timestamps: + stamp = datetime.datetime.strptime(text, "%Y-%m-%d %H:%M:%S%z") + body["data"].append( + { + "timestamp": text, + "epoch": int(stamp.timestamp() * 1000), + "interval": text[11:19], + "dstFlag": "unchanged", + "prc": 1, + } + ) + body["lastUpdated"] = timestamps[-1] + body["current_condition"]["datetime"] = body["data"][-1]["epoch"] // 1000 + snapshot = decode_grid_conditions(payload(json.dumps(body).encode())) + assert snapshot.rows[0].epoch < snapshot.rows[1].epoch + + +def test_public_client_captures_once_per_method_without_credentials(): + requests = [] + + def handler(request): + requests.append(request) + assert "Authorization" not in request.headers + assert "Ocp-Apim-Subscription-Key" not in request.headers + assert not request.url.query + return httpx.Response( + 200, content={FUEL_MIX_URL: FUEL, DAILY_PRC_URL: PRC}[str(request.url)] + ) + + with DashboardClient( + limits=Limits(min_interval=0), transport=httpx.MockTransport(handler) + ) as client: + assert requests == [] + assert client.fuel_mix().rows + assert client.grid_conditions().rows + assert len(requests) == 2 + + +def test_denied_anonymous_source_does_not_retry_or_seek_credentials(): + requests = [] + + def handler(request): + requests.append(request) + return httpx.Response(403) + + with ( + DashboardClient(transport=httpx.MockTransport(handler)) as client, + pytest.raises(AccessDeniedError), + ): + client.grid_conditions() + assert len(requests) == 1 + + +def test_dashboard_fixture_hashes_match_provenance(): + root = Path(__file__).resolve().parents[1] + evidence = json.loads( + (root / "docs/evidence/dashboard-fixture-provenance.json").read_text() + ) + for record in evidence["fixtures"]: + assert ( + hashlib.sha256((root / record["fixture"]).read_bytes()).hexdigest() + == record["fixture_sha256"] + ) + assert record["source_receipt"]["status"] == 200 diff --git a/tests/test_resource_dme.py b/tests/test_resource_dme.py new file mode 100644 index 00000000..6e7f6af2 --- /dev/null +++ b/tests/test_resource_dme.py @@ -0,0 +1,109 @@ +"""Source-cell fixtures for exact-text public resource CSV decoding.""" + +import csv +import datetime +import hashlib +import io +import json +import zipfile +from dataclasses import replace +from pathlib import Path + +import pytest + +from tinyercot.public._http import ( + AccessDeniedError, + LimitError, + Receipt, + SchemaMismatchError, +) +from tinyercot.public.api_archives import APIArchive, APIArchiveFile +from tinyercot.public.resource_dme import ResourceDmeRow, iter_resource_dme + +EVIDENCE = json.loads( + (Path(__file__).parent / "fixtures/public/resource-dme-excerpt.json").read_text() +) + + +def source_file(sample, *, rows=None, header=None, csv_bytes=None): + text = io.StringIO(newline="") + writer = csv.writer(text) + writer.writerow(sample["header"] if header is None else header) + writer.writerows(sample["rows"] if rows is None else rows) + raw = io.BytesIO() + with zipfile.ZipFile(raw, "w", zipfile.ZIP_DEFLATED) as archive: + archive.writestr( + sample["member"], + text.getvalue().encode() if csv_bytes is None else csv_bytes, + ) + body = raw.getvalue() + document = APIArchive( + "np3-988-er", sample["document_id"], "source fixture", "2026-09-05T05:02:43.000" + ) + receipt = Receipt( + sample["receipt"]["source_url"], + datetime.datetime.now(datetime.UTC), + hashlib.sha256(body).hexdigest(), + len(body), + ) + return APIArchiveFile(document, receipt, (sample["member"],), body) + + +@pytest.mark.parametrize("sample", EVIDENCE["samples"]) +def test_current_and_historical_text_cells(sample): + rows = list(iter_resource_dme(source_file(sample))) + assert len(rows) == 3 and rows[0].record_number == 2 + assert isinstance(rows[0].row, ResourceDmeRow) + for record, original in zip(rows, sample["rows"], strict=True): + assert list(record.row.model_dump().values()) == original + assert any(record.row.dme_duns.startswith("0") for record in rows) + + +def test_blanks_whitespace_quotes_and_multiline_are_preserved(): + cells = [ + " Owner ", + "resource, name", + 'Quoted "name"', + "", + "line1\nline2", + "0000123", + "N", + ] + row = next(iter_resource_dme(source_file(EVIDENCE["samples"][0], rows=[cells]))).row + assert list(row.model_dump().values()) == cells + + +def test_complete_iteration_exceeds_default_budget(): + sample = EVIDENCE["samples"][0] + archive = source_file(sample, rows=sample["rows"] * 400) + assert sum(1 for _ in iter_resource_dme(archive, max_rows=None)) == 1200 + with pytest.raises(LimitError, match="row budget"): + list(iter_resource_dme(archive)) + + +@pytest.mark.parametrize( + "change", + [ + {"header": ["unknown"] * 7}, + {"rows": [["too", "short"]]}, + {"csv_bytes": b"\xff\xfe\xff"}, + {"csv_bytes": b'"unterminated'}, + ], +) +def test_unknown_schema_and_encoding_fail_closed(change): + with pytest.raises(SchemaMismatchError): + list(iter_resource_dme(source_file(EVIDENCE["samples"][0], **change))) + + +def test_source_identity_receipt_and_expansion_checks(): + source = source_file(EVIDENCE["samples"][0]) + with pytest.raises(AccessDeniedError): + list( + iter_resource_dme( + replace(source, document=replace(source.document, emil_id="private")) + ) + ) + with pytest.raises(SchemaMismatchError, match="receipt"): + list(iter_resource_dme(replace(source, body=source.body + b"changed"))) + with pytest.raises(LimitError): + list(iter_resource_dme(source, max_expanded_bytes=1)) diff --git a/tests/test_rt_archives.py b/tests/test_rt_archives.py new file mode 100644 index 00000000..26b0a171 --- /dev/null +++ b/tests/test_rt_archives.py @@ -0,0 +1,203 @@ +"""Public RT archive boundaries, streaming, and immutable cache behavior.""" + +import datetime +import hashlib +import io +import json +import zipfile +from dataclasses import replace +from decimal import Decimal +from pathlib import Path + +import httpx +import pytest +from openpyxl import Workbook + +from tinyercot.public._http import ( + AccessDeniedError, + LimitError, + Limits, + SchemaMismatchError, +) +from tinyercot.public.archive_reports import ( + RTArchiveClient, + RTArchivePrice, + iter_rt_archive, +) + +EVIDENCE = json.loads( + (Path(__file__).parent / "fixtures/public/rt-archive-excerpt.json").read_text() +) + + +def workbook_zip(*, rows=None, header=None, second=True): + """Build a tiny workbook from the recorded public source cells.""" + book = Workbook() + book.active.title = "Dec_1" + data = EVIDENCE["samples"][0] + for sheet in [book.active] + ([book.create_sheet("Copy")] if second else []): + sheet.append(header or data["header"]) + for row in data["rows"] if rows is None else rows: + sheet.append(row) + inner = io.BytesIO() + book.save(inner) + book.close() + outer = io.BytesIO() + with zipfile.ZipFile(outer, "w", zipfile.ZIP_DEFLATED) as archive: + archive.writestr("rt.xlsx", inner.getvalue()) + return outer.getvalue() + + +def client_for(raw, *, mutate=None): + """Provide public listing and ZIP transport with request accounting.""" + document = dict(EVIDENCE["samples"][0]["listing_document"]) + document["ContentSize"] = str(len(raw)) + if mutate: + document.update(mutate) + calls = [] + + def handle(request): + calls.append(request.url) + assert "authorization" not in request.headers + if "IceDocListJsonWS" in request.url.path: + assert request.url.params["reportTypeId"] == "13061" + return httpx.Response( + 200, + json={ + "ListDocsByRptTypeRes": {"DocumentList": [{"Document": document}]} + }, + ) + assert request.url.params["reportTypeId"] == "13061" + return httpx.Response(200, content=raw) + + return RTArchiveClient( + limits=Limits(min_interval=0), transport=httpx.MockTransport(handle) + ), calls + + +def test_complete_iteration_and_cache(tmp_path): + client, calls = client_for(workbook_zip()) + with client: + documents, receipt = client.archives() + assert receipt.source_url.endswith("reportTypeId=13061") + download = client.download(documents[0], cache=tmp_path) + rows = list(iter_rt_archive(download, max_rows=None, max_scan_rows=None)) + assert len(rows) == 6 + assert [r.sheet for r in rows] == ["Dec_1"] * 3 + ["Copy"] * 3 + assert rows[0].row == RTArchivePrice( + delivery_date=datetime.date(2010, 12, 1), + delivery_hour=1, + delivery_interval=1, + repeated_hour_flag="N", + settlement_point_name="HB_BUSAVG", + settlement_point_type="SH", + settlement_point_price=Decimal("25.08"), + ) + assert rows[0].row_number == 2 + cached = client.download(documents[0], cache=tmp_path) + assert cached.cache_hit and cached.receipt == download.receipt + assert len(calls) == 2 + with pytest.raises(LimitError, match="row budget"): + list(iter_rt_archive(download, max_rows=1)) + with pytest.raises(LimitError, match="scan budget"): + list(iter_rt_archive(download, max_scan_rows=1)) + with pytest.raises(SchemaMismatchError, match="absent"): + list(iter_rt_archive(download, sheets=["missing"])) + + +@pytest.mark.parametrize( + "change", + [ + {"SecurityStatus": "S"}, + {"ReportTypeID": "13060"}, + {"DocID": "../1"}, + {"FriendlyName": "private"}, + ], +) +def test_listing_fail_closed(change): + client, calls = client_for(workbook_zip(), mutate=change) + with client, pytest.raises((AccessDeniedError, SchemaMismatchError)): + client.archives() + assert len(calls) == 1 + + +@pytest.mark.parametrize( + "cells", + [ + ["12/01/2010", "1", 1, "N", "HB_BUSAVG", "SH", 25.08], + ["12/01/2010", 1, 5, "N", "HB_BUSAVG", "SH", 25.08], + ["12/01/2010", 1, 1, "N", "HB_BUSAVG", "SH", "25.08"], + ["12/01/2026", 1, 1, "N", "HB_BUSAVG", "SH", 25.08], + ["12/01/2010", 1, 1, None, "HB_BUSAVG", "SH", 25.08], + ], +) +def test_unknown_cell_contract(tmp_path, cells): + client, _ = client_for(workbook_zip(rows=[cells])) + with client: + documents, _ = client.archives() + download = client.download(documents[0], cache=tmp_path) + with pytest.raises(SchemaMismatchError): + list(iter_rt_archive(download)) + + +def test_unknown_epoch(tmp_path): + client, _ = client_for(workbook_zip(header=["unknown"] * 7)) + with client: + documents, _ = client.archives() + download = client.download(documents[0], cache=tmp_path) + with pytest.raises(SchemaMismatchError, match="schema epoch"): + list(iter_rt_archive(download)) + + +def test_changed_cache_and_unlisted_document(tmp_path): + client, calls = client_for(workbook_zip()) + with client: + documents, _ = client.archives() + with pytest.raises(AccessDeniedError): + client.download(replace(documents[0], security="S"), cache=tmp_path) + download = client.download(documents[0], cache=tmp_path) + download.path.write_bytes(b"changed") + with pytest.raises(SchemaMismatchError): + client.download(documents[0], cache=tmp_path) + with pytest.raises(SchemaMismatchError): + list(iter_rt_archive(download)) + assert len(calls) == 2 + + +def test_provenance_hashes(): + assert EVIDENCE["product_id"] == "NP6-785-ER" + for sample in EVIDENCE["samples"]: + assert len(sample["receipt"]["sha256"]) == hashlib.sha256().digest_size * 2 + assert sample["listing_document"]["SecurityStatus"] == "P" + + +def test_complete_iteration_exceeds_default_budget(tmp_path): + source_row = EVIDENCE["samples"][0]["rows"][0] + client, _ = client_for(workbook_zip(rows=[source_row] * 1001)) + with client: + documents, _ = client.archives() + download = client.download(documents[0], cache=tmp_path) + assert ( + sum(1 for _ in iter_rt_archive(download, max_rows=None, max_scan_rows=None)) + == 2002 + ) + with pytest.raises(LimitError, match="row budget"): + list(iter_rt_archive(download)) + + +def test_html_success_is_not_a_download(tmp_path): + client, _ = client_for(b"No Document") + with client: + documents, _ = client.archives() + with pytest.raises(SchemaMismatchError, match="ZIP"): + client.download(documents[0], cache=tmp_path) + assert list(tmp_path.iterdir()) == [] + + +def test_advertised_budget_is_checked_before_download(tmp_path): + client, calls = client_for(workbook_zip(), mutate={"ContentSize": "16000001"}) + with client: + documents, _ = client.archives() + with pytest.raises(LimitError, match="Advertised"): + client.download(documents[0], cache=tmp_path) + assert len(calls) == 1 diff --git a/tests/test_typing_proof.py b/tests/test_typing_proof.py new file mode 100644 index 00000000..83ca0cf2 --- /dev/null +++ b/tests/test_typing_proof.py @@ -0,0 +1,115 @@ +"""Check generated assertion structure; real PEP 561 proof uses an installed wheel.""" + +import ast + +import pytest + +from tinyercot import public +from tinyercot.public import _schemas +from tools.check_typing import registry_assertions + + +@pytest.fixture +def registry(): + source = ( + "SAMPLE: Endpoint[SampleRow, SampleRowFilters] = " + "Endpoint('/np1-2-cd/7d_sample', SampleRow, 'sample.json')\n" + ) + bundle = { + "sample.json": { + "path": "/np1-2-cd/7d_sample", + "fields": [ + {"name": "price", "dataType": "DOUBLE"}, + {"name": "deliveryDate", "dataType": "DATE"}, + ], + "observed_nullable_fields": ["price"], + "query_parameters": [ + { + "name": "deliveryDateFrom", + "schema": {"type": "string", "format": "yyyy-MM-dd"}, + }, + { + "name": "postedDatetimeFrom", + "schema": {"type": "string", "format": "yyyy-MM-ddTH24:mm:ss"}, + }, + {"name": "priceFrom", "schema": {"type": "number"}}, + {"name": "size", "schema": {"type": "integer"}}, + ], + } + } + return source, bundle + + +def test_assertions_cover_precise_facade_filters_rows_and_iteration(registry): + positive, negative, counts = registry_assertions(*registry) + ast.parse(positive) + ast.parse(negative) + assert counts == { + "endpoints": 1, + "row_fields": 2, + "filter_fields": 3, + "invalid_uses": 1, + } + assert ( + "assert_type(schemas.SAMPLE, Endpoint[rows.SampleRow, schemas.SampleRowFilters])" + in positive + ) + assert "products.np1_2_cd._7d_sample" in positive + assert "assert_type(row.price, Decimal | None)" in positive + assert "assert_type(filters['postedDatetimeFrom'], datetime)" in positive + assert "Iterator[DataPage[rows.SampleRow]]" in positive + assert "Iterator[rows.SampleRow]" in positive + assert "'not_a_source_filter': 1" in negative + assert registry_assertions(*registry) == (positive, negative, counts) + + +def test_assertions_reject_registry_contract_identity_mismatch(registry): + source, bundle = registry + bundle["sample.json"]["path"] = "/np1-2-cd/different" + with pytest.raises(ValueError, match="identity"): + registry_assertions(source, bundle) + + +def test_assertions_reject_an_unrepresented_bundled_contract(registry): + source, bundle = registry + bundle["missing.json"] = {**bundle["sample.json"], "path": "/np1-2-cd/missing"} + with pytest.raises(ValueError, match="every bundled"): + registry_assertions(source, bundle) + + +def test_product_facades_cover_every_endpoint_and_stable_exports_remain(): + assert len(public.__all__) == len(set(public.__all__)) + for endpoint in _schemas.ENDPOINTS: + constants = [ + name for name in vars(_schemas) if getattr(_schemas, name) is endpoint + ] + assert len(constants) == 1 + name = constants[0] + product, method = endpoint.path.strip("/").split("/") + if not method.isidentifier(): + method = "_" + method + assert ( + getattr(getattr(public.products, product.replace("-", "_")), method) + is endpoint + ) + if name in {"DAM_PRICES", "DAM_CAPACITY_PRICES", "RT_PRICES", "SYSTEM_LOAD"}: + assert name in public.__all__ + assert getattr(public, name) is endpoint + assert getattr(public, endpoint.row_model.__name__) is endpoint.row_model + filter_name = endpoint.row_model.__name__ + "Filters" + assert getattr(public, filter_name) is getattr(_schemas, filter_name) + for name in [ + "MetadataClient", + "Product", + "Artifact", + "DashboardClient", + "AggregateDashboardClient", + "RTArchiveClient", + "APIArchiveClient", + "APIBundle", + "APIBundlePage", + "ResourceDmeRow", + "iter_resource_dme", + "products", + ]: + assert name in public.__all__ and getattr(public, name) is not None diff --git a/tests/typing_invalid.py b/tests/typing_invalid.py index 0091373e..42b5f898 100644 --- a/tests/typing_invalid.py +++ b/tests/typing_invalid.py @@ -1,7 +1,17 @@ """Negative static contracts; the installed checker must reject each line.""" from tinyercot import np4_190_cd -from tinyercot.public import DAM_PRICES, RT_PRICES, ReportsClient +from tinyercot.public import ( + DAM_PRICES, + RT_PRICES, + APIArchiveClient, + APIArchiveFile, + DashboardClient, + Download, + ReportsClient, + iter_resource_dme, + iter_rt_archive, +) def invalid_contracts(client: ReportsClient) -> None: @@ -10,3 +20,16 @@ def invalid_contracts(client: ReportsClient) -> None: RT_PRICES.page(client, filters={"deliveryHourFrom": "one"}) _ = client.page(RT_PRICES).rows[0].not_a_source_field np4_190_cd.dam_stlmnt_pnt_prices(deliveryDateFrom="2026-09-04") + + +def invalid_additive_contracts( + dashboard: DashboardClient, + archives: APIArchiveClient, + api_file: APIArchiveFile, + annual: Download, +) -> None: + """Reject unknown live fields, unlisted identities, and identifier coercion.""" + _ = dashboard.fuel_mix().rows[0].generation.not_a_source_fuel + archives.download_bundle("unlisted-document") + _identifier: int = next(iter_resource_dme(api_file)).row.dme_duns + iter_rt_archive(annual, max_rows="all") diff --git a/tests/typing_public.py b/tests/typing_public.py index de1d3f98..3beb0ad4 100644 --- a/tests/typing_public.py +++ b/tests/typing_public.py @@ -1,9 +1,10 @@ """Positive static contracts; copy outside the checkout for installed checks.""" -from collections.abc import AsyncIterator, Iterator -from datetime import date +from collections.abc import AsyncIterator, Generator, Iterator +from datetime import date, datetime from decimal import Decimal -from typing import assert_type +from pathlib import Path +from typing import Literal, assert_type import pandas as pd @@ -14,16 +15,41 @@ DAM_PRICES, RT_PRICES, SYSTEM_LOAD, + AggregateDashboardClient, + APIArchive, + APIArchiveClient, + APIArchiveFile, + APIArchivePage, + APIBundle, + APIBundlePage, + ArchiveDocument, ArchivePrice, + Artifact, DamCapacityPrice, DamPrice, + DashboardClient, + DcTieRow, + DcTieSnapshot, Download, + FuelMixSnapshot, + GenerationOutagesSnapshot, + GridConditionsSnapshot, + MetadataClient, + Product, PublicClient, RealTimePrice, + Receipt, ReportsClient, + ResourceDmeRecord, + ResourceDmeRow, + RTArchiveClient, + RTArchivePrice, + RTArchiveRecord, SystemLoad, WebClient, iter_dam_archive, + iter_resource_dme, + iter_rt_archive, ) @@ -76,3 +102,68 @@ def public_contracts( async def legacy_async_contract() -> None: """Check the legacy async DataFrame return contract without running it.""" assert_type(await np4_190_cd.dam_stlmnt_pnt_prices_df_async(), pd.DataFrame) + + +def live_and_metadata_contracts( + dashboard: DashboardClient, + aggregates: AggregateDashboardClient, + metadata: MetadataClient, +) -> None: + """Verify precise anonymous snapshots and independent public metadata types.""" + with aggregates as scoped: + assert_type(scoped, AggregateDashboardClient) + assert_type(dashboard.fuel_mix(), FuelMixSnapshot) + assert_type(dashboard.fuel_mix().rows[0].generation.natural_gas, Decimal) + assert_type(dashboard.fuel_mix().rows[0].source_timestamp, str) + assert_type(dashboard.fuel_mix().rows[0].timestamp, datetime) + assert_type(dashboard.grid_conditions(), GridConditionsSnapshot) + assert_type(dashboard.grid_conditions().current_condition.state, str) + assert_type(dashboard.grid_conditions().rows[0].prc, int) + assert_type(aggregates.generation_outages(), GenerationOutagesSnapshot) + assert_type(aggregates.generation_outages().current[0].row.combined.total, int) + assert_type(aggregates.generation_outages().current[0].source_epoch, str) + assert_type(aggregates.dc_tie_flows(), DcTieSnapshot) + assert_type(aggregates.dc_tie_flows().rows, tuple[DcTieRow, ...]) + assert_type(aggregates.dc_tie_flows().rows[0].currentFrequency, Decimal) + assert_type(aggregates.dc_tie_flows().rows[0].dcN, int) + assert_type(metadata.products(), tuple[tuple[Product, ...], Receipt]) + assert_type(metadata.product("np4-190-cd"), tuple[Product, Receipt]) + assert_type(metadata.product("np4-190-cd")[0].access, Access) + assert_type(metadata.product("np4-190-cd")[0].artifacts, tuple[Artifact, ...]) + assert_type(metadata.product("np4-190-cd")[0].artifacts[0].path, str | None) + + +def archive_contracts( + annual: RTArchiveClient, + archives: APIArchiveClient, + document: ArchiveDocument, + download: Download, + api_file: APIArchiveFile, +) -> None: + """Verify selected file rows while keeping generic archive schemas unknown.""" + assert_type(annual.archives(), tuple[tuple[ArchiveDocument, ...], Receipt]) + assert_type(annual.download(document, cache=Path("cache")), Download) + assert_type( + iter_rt_archive(download, max_rows=None), Generator[RTArchiveRecord, None, None] + ) + assert_type(next(iter_rt_archive(download)).row, RTArchivePrice) + assert_type(next(iter_rt_archive(download)).row.settlement_point_price, Decimal) + assert_type(archives.archives("np4-190-cd"), APIArchivePage) + assert_type(archives.archives("np4-190-cd").documents, tuple[APIArchive, ...]) + assert_type(archives.bundles("np4-190-cd"), APIBundlePage) + assert_type(archives.bundles("np4-190-cd").documents, tuple[APIBundle, ...]) + assert_type( + archives.archives("np4-190-cd").lifecycle, + Literal["active", "retired-or-inactive", "unknown"], + ) + assert_type( + archives.download(archives.archives("np4-190-cd").documents[0]), APIArchiveFile + ) + assert_type( + archives.download_bundle(archives.bundles("np4-190-cd").documents[0]), + APIArchiveFile, + ) + assert_type(api_file.row_schema, Literal["unknown"]) + assert_type(iter_resource_dme(api_file), Generator[ResourceDmeRecord, None, None]) + assert_type(next(iter_resource_dme(api_file)).row, ResourceDmeRow) + assert_type(next(iter_resource_dme(api_file)).row.dme_duns, str) diff --git a/tests/wheel_smoke.py b/tests/wheel_smoke.py index e6c0faaa..6f66be48 100644 --- a/tests/wheel_smoke.py +++ b/tests/wheel_smoke.py @@ -57,11 +57,25 @@ def deny_network(*args, **kwargs): assert frame.settlementPointPrice[0] == 12.25 assert str(frame.DSTFlag.dtype) == "bool" public = importlib.import_module("tinyercot.public") -assert len(public.coverage()) == 298 +coverage = public.coverage() +assert len({entry.key for entry in coverage}) == len(coverage) +assert len([entry for entry in coverage if entry.key.startswith("api:")]) == len( + catalog.operations() +) +assert len([entry for entry in coverage if entry.key.startswith("family:")]) == 39 assert files("tinyercot").joinpath("py.typed").is_file() assert files("tinyercot.public").joinpath("_contracts.json").is_file() assert public.RT_PRICES.row_model is public.RealTimePrice -assert len([entry for entry in public.coverage() if entry.status == "covered"]) == 6 +registry = importlib.import_module("tinyercot.public._schemas") +data_paths = { + operation.path for operation in catalog.operations() if operation.kind == "data" +} +assert { + entry.title + for entry in coverage + if entry.status == "covered" and entry.title in data_paths +} == {endpoint.path for endpoint in registry.ENDPOINTS} +assert public.products.np6_322_cd.sced_system_lambda in registry.ENDPOINTS assert public.Credentials("test", "test", "test") with public.WebClient(): pass diff --git a/tinyercot/public/__init__.py b/tinyercot/public/__init__.py index 1b370b6b..ada063d0 100644 --- a/tinyercot/public/__init__.py +++ b/tinyercot/public/__init__.py @@ -1,11 +1,18 @@ -"""Opt-in bounded retrieval of selected public ERCOT data sources. +"""Opt-in retrieval, typed public products, metadata, and source-specific files. -Use ReportsClient for generated current report contracts, PublicClient for DAM -price samples, and WebClient for annual files and the ESR live feed. Legacy -tinyercot imports and behavior are unchanged. +Use ReportsClient with generated endpoint constants or the products namespace. +Anonymous dashboard and annual-file clients are separate from authenticated +Public Reports metadata and selected archive downloads. Legacy imports remain +unchanged. Unknown file schemas and source lifecycle are explicit. """ -from ._generated import DamCapacityPrice, DamPrice, RealTimePrice, SystemLoad +from . import products +from ._generated import ( + DamCapacityPrice, + DamPrice, + RealTimePrice, + SystemLoad, +) from ._http import ( AccessDeniedError, AuthenticationError, @@ -28,7 +35,35 @@ RealTimePriceFilters, SystemLoadFilters, ) -from .api import Credentials, PricePage, PublicClient +from .aggregate_dashboards import ( + AggregateDashboardClient, + DcTieRow, + DcTieSnapshot, + GenerationOutageRow, + GenerationOutagesSnapshot, + OutageAmounts, + OutageDays, + OutageObservation, +) +from .api import ( + Credentials, + PricePage, + PublicClient, +) +from .api_archives import ( + APIArchive, + APIArchiveClient, + APIArchiveFile, + APIArchivePage, + APIBundle, + APIBundlePage, +) +from .archive_reports import ( + RTArchiveClient, + RTArchivePrice, + RTArchiveRecord, + iter_rt_archive, +) from .archives import ( ArchiveDocument, ArchivePrice, @@ -38,22 +73,63 @@ iter_dam_archive, sample_dam_archive, ) -from .coverage import Coverage, coverage -from .live import EsrRow, EsrSnapshot -from .reports import DataPage, ReportsClient -from .schema import Endpoint -from .web import WebClient +from .coverage import ( + Coverage, + coverage, +) +from .dashboards import ( + DashboardClient, + DashboardSnapshot, + FuelMixRow, + FuelMixSnapshot, + FuelMixValues, + GridCondition, + GridConditionsSnapshot, + PrcRow, +) +from .live import ( + EsrRow, + EsrSnapshot, +) +from .metadata import ( + Artifact, + MetadataClient, + Product, +) +from .reports import ( + DataPage, + ReportsClient, +) +from .resource_dme import ( + ResourceDmeRecord, + ResourceDmeRow, + iter_resource_dme, +) +from .schema import ( + Endpoint, +) +from .web import ( + WebClient, +) __all__ = [ "DAM_CAPACITY_PRICES", "DAM_PRICES", "RT_PRICES", "SYSTEM_LOAD", + "APIArchive", + "APIArchiveClient", + "APIArchiveFile", + "APIArchivePage", + "APIBundle", + "APIBundlePage", "AccessDeniedError", + "AggregateDashboardClient", "ArchiveDocument", "ArchivePrice", "ArchiveRecord", "ArchiveSample", + "Artifact", "AuthenticationError", "Coverage", "Credentials", @@ -61,21 +137,43 @@ "DamCapacityPriceFilters", "DamPrice", "DamPriceFilters", + "DashboardClient", + "DashboardSnapshot", "DataPage", + "DcTieRow", + "DcTieSnapshot", "Download", "Endpoint", "EsrRow", "EsrSnapshot", + "FuelMixRow", + "FuelMixSnapshot", + "FuelMixValues", + "GenerationOutageRow", + "GenerationOutagesSnapshot", + "GridCondition", + "GridConditionsSnapshot", "LimitError", "Limits", + "MetadataClient", + "OutageAmounts", + "OutageDays", + "OutageObservation", + "PrcRow", "PricePage", + "Product", "PublicClient", "PublicDataError", + "RTArchiveClient", + "RTArchivePrice", + "RTArchiveRecord", "RateLimitError", "RealTimePrice", "RealTimePriceFilters", "Receipt", "ReportsClient", + "ResourceDmeRecord", + "ResourceDmeRow", "SchemaMismatchError", "SourceUnavailableError", "StreamingLimits", @@ -84,5 +182,8 @@ "WebClient", "coverage", "iter_dam_archive", + "iter_resource_dme", + "iter_rt_archive", + "products", "sample_dam_archive", ] diff --git a/tinyercot/public/_contracts.json b/tinyercot/public/_contracts.json index c9a2db3c..b7f38b9f 100644 --- a/tinyercot/public/_contracts.json +++ b/tinyercot/public/_contracts.json @@ -860,5 +860,14754 @@ "byte_count": 2262, "status": 200 } + }, + "gen-55-cd--hrly_rt_load_fcast_actual.json": { + "format_version": 1, + "service": "public-reports", + "path": "/gen-55-cd/hrly_rt_load_fcast_actual", + "observed_at": "2026-09-06 00:37:12.006183+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEndingFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "hourEndingTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "currentDayFcastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "currentDayFcastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "dayAheadFcastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "dayAheadFcastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "actualLoadFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "actualLoadTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "dayAheadHSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "dayAheadHSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "currentDayHSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "currentDayHSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "currentDayFcast", + "label": "Current Day Forecast", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "dayAheadFcast", + "label": "Day Ahead Forecast", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "actualLoad", + "label": "Actual Load", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "dayAheadHSL", + "label": "Day Ahead HSL", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "currentDayHSL", + "label": "Current Day HSL", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:12.006183+00:00", + "sha256": "1f13194f01aff5b70ffe5ce39239f2e71a2231547b7d927a777827eeacb1ffb6", + "byte_count": 1674, + "status": 200 + }, + "observed_nullable_fields": [ + "actualLoad", + "currentDayHSL" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:12.006183+00:00", + "sha256": "1f13194f01aff5b70ffe5ce39239f2e71a2231547b7d927a777827eeacb1ffb6", + "byte_count": 1674, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:37:13.954828+00:00", + "sha256": "8f0155f666c3607327c4bc7d9814d18fcf5e015c6415637434a37fa488692ad0", + "byte_count": 1681, + "status": 200 + } + ], + "product_evidence": { + "emilId": "GEN-55-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13499, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np1-302--as_obligation.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np1-302/as_obligation", + "observed_at": "2026-09-06 00:37:16.668025+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "qseName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "REGUPOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGUPOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGUPOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGUPOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "qseName", + "label": "QSE Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "REGUPOblAdvisory", + "label": "Reg Up Obligation Advisory", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "REGDNOblAdvisory", + "label": "Reg Down Obligation Advisory", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RRSOblAdvisory", + "label": "RRS Obligation Advisory", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "NSPINOblAdvisory", + "label": "NSPIN Obligation Advisory", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ECRSOblAdvisory", + "label": "ECRS Obligation Advisory", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "REGUPOblFinal", + "label": "Reg Up Obligation Final", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "REGDNOblFinal", + "label": "Reg Down Obligation Final", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RRSOblFinal", + "label": "RRS Obligation Final", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "NSPINOblFinal", + "label": "NSPIN Obligation Final", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ECRSOblFinal", + "label": "ECRS Obligation Final", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np1-302/as_obligation?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:16.668025+00:00", + "sha256": "36f971b0020b4186524c7c7e5fa8c7245fd4f3b428d2e2c6e13b43a3cf8672b2", + "byte_count": 2473, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np1-302/as_obligation?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:16.668025+00:00", + "sha256": "36f971b0020b4186524c7c7e5fa8c7245fd4f3b428d2e2c6e13b43a3cf8672b2", + "byte_count": 2473, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np1-302/as_obligation?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:37:18.262190+00:00", + "sha256": "7ea5d9661aa9744d086b052605b815b3eca42c2a4e43d15ba5dc2cd799dc4d5e", + "byte_count": 2455, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP1-302", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 10039, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np3-161-cd--7d_plus_avail_res_poc_margin.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np3-161-cd/7d_plus_avail_res_poc_margin", + "observed_at": "2026-09-06 00:37:20.328493+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "operatingDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "operatingDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "nonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "nonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdNonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdNonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdNonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdNonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "IRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "IRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdIRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdIRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdIRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdIRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "operatingDate", + "label": "Operating Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "nonIRRNonPUN", + "label": "Resource POL (Non-IRR, Non-PUN)", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ESR", + "label": "Resource POL (ESR)", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdNonIRRNonPUN", + "label": "Aggregate Approved Resource POL (Non-IRR, Non-PUN)", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdNonIRRNonPUN", + "label": "Aggregate Received Resource POL (Non-IRR, Non-PUN)", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "IRR", + "label": "Resource POL (IRR)", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdIRR", + "label": "Aggregate Approved Resource POL (IRR)", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdIRR", + "label": "Aggregate Received Resource POL (IRR)", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdESR", + "label": "Aggregate Approved Resource POL (ESR)", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdESR", + "label": "Aggregate Received Resource POL (ESR)", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:20.328493+00:00", + "sha256": "780f72f2049581f9b4a73de823bcc336d5f653f48a48bc12eb7384805d317d66", + "byte_count": 2320, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:20.328493+00:00", + "sha256": "780f72f2049581f9b4a73de823bcc336d5f653f48a48bc12eb7384805d317d66", + "byte_count": 2320, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:22.459719+00:00", + "sha256": "abf3829f721bc0e1e9f551a6313a1ff5728732235ecbbd4ed5e808954c6f0954", + "byte_count": 2314, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-161-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 22470, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np3-162-cd--7d_avail_res_poc_margin.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np3-162-cd/7d_avail_res_poc_margin", + "observed_at": "2026-09-06 00:37:24.785394+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "aggRcvdESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "operatingDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "operatingDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEndingFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "hourEndingTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "nonIrrNonPunFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "nonIrrNonPunTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdNonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdNonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdNonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdNonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "IRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "IRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdIRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdIRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdIRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdIRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "operatingDate", + "label": "Operating Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "nonIrrNonPun", + "label": "Maximum Daily Resource POL", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdNonIRRNonPUN", + "label": "Aggregate Approved Resource POL (Non-IRR, Non-PUN)", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdNonIRRNonPUN", + "label": "Aggregate Received Resource POL (Non-IRR, Non-PUN)", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "IRR", + "label": "Maximum Daily Resource POL (IRR)", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdIRR", + "label": "Aggregate Approved Resource POL (IRR)", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdIRR", + "label": "Aggregate Received Resource POL (IRR)", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ESR", + "label": "Maximum Daily Resource POL (ESR)", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdESR", + "label": "Aggregate Approved Resource POL (ESR)", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdESR", + "label": "Aggregate Received Resource POL (ESR)", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 13, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:24.785394+00:00", + "sha256": "64d6f7d9551479a30d896e51321cae1f06b1def528ad50c8935e79f52e454091", + "byte_count": 2615, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:24.785394+00:00", + "sha256": "64d6f7d9551479a30d896e51321cae1f06b1def528ad50c8935e79f52e454091", + "byte_count": 2615, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:26.641624+00:00", + "sha256": "705b702f2f12a56068efebbb5f9bbe317b600bb6c95281dac95f55d99e6ed3d1", + "byte_count": 2614, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-162-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 22469, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np3-233-cd--hourly_res_outage_cap.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np3-233-cd/hourly_res_outage_cap", + "observed_at": "2026-09-06 00:37:36.517906+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "operatingDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "operatingDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEndingFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "hourEndingTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneSouthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneSouthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneNorthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneNorthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneWestFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneWestTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneHoustonFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneHoustonTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneSouthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneSouthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneNorthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneNorthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneWestFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneWestTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneHoustonFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneHoustonTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneSouthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneSouthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneNorthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneNorthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneWestFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneWestTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneHoustonFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneHoustonTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "operatingDate", + "label": "Operating Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalResourceMWZoneSouth", + "label": "Total Resource MW Zone South", + "cardinality": 4, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalResourceMWZoneNorth", + "label": "Total Resource MW Zone North", + "cardinality": 5, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalResourceMWZoneWest", + "label": "Total Resource MW Zone West", + "cardinality": 6, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalResourceMWZoneHouston", + "label": "Total Resource MW Zone Houston", + "cardinality": 7, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalIRRMWZoneSouth", + "label": "Total IRR MW Zone South", + "cardinality": 8, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalIRRMWZoneNorth", + "label": "Total IRR MW Zone North", + "cardinality": 9, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalIRRMWZoneWest", + "label": "Total IRR MW Zone West", + "cardinality": 10, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalIRRMWZoneHouston", + "label": "Total IRR MW Zone Houston", + "cardinality": 11, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalNewEquipResourceMWZoneSouth", + "label": "Total New Equipment Resource MW Zone South", + "cardinality": 12, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalNewEquipResourceMWZoneNorth", + "label": "Total New Equipment Resource MW Zone North", + "cardinality": 13, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalNewEquipResourceMWZoneWest", + "label": "Total New Equipment Resource MW Zone West", + "cardinality": 14, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalNewEquipResourceMWZoneHouston", + "label": "Total New Equipment Resource MW Zone Houston", + "cardinality": 15, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap?size=1&page=1&sort=operatingDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:36.517906+00:00", + "sha256": "0d10814cf4976d2530b429563fd684a65d08da0deb8e4cda18a9706d7862fcad", + "byte_count": 3018, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap?size=1&page=1&sort=operatingDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:36.517906+00:00", + "sha256": "0d10814cf4976d2530b429563fd684a65d08da0deb8e4cda18a9706d7862fcad", + "byte_count": 3018, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap?size=1&page=1&sort=operatingDate&dir=asc", + "retrieved_at": "2026-09-06 00:37:38.432391+00:00", + "sha256": "a616d9597a1dbd1e6d3e979ef4471e8b98a1688cb5d3cb4e6e0b61bff5bf9ee3", + "byte_count": 3024, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-233-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13103, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np3-560-cd--7d_load_fcast_by_fzn.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np3-560-cd/7d_load_fcast_by_fzn", + "observed_at": "2026-09-06 00:37:38.977492+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "houstonFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "houstonTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "north", + "label": "North", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "south", + "label": "South", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "houston", + "label": "Houston", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "systemTotal", + "label": "System Total", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 9, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:38.977492+00:00", + "sha256": "5e437bd30381b74c0cda614dc74f3e1af0125714b66e21ee7b9f33737000019f", + "byte_count": 1809, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:38.977492+00:00", + "sha256": "5e437bd30381b74c0cda614dc74f3e1af0125714b66e21ee7b9f33737000019f", + "byte_count": 1809, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:40.987354+00:00", + "sha256": "35354df61beb7ef65de9788a557ca12fb1ae9cd71297a858349679dd53c64be9", + "byte_count": 1805, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-560-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12311, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np3-561-cd--7d_load_fcast_by_wzn.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np3-561-cd/7d_load_fcast_by_wzn", + "observed_at": "2026-09-06 00:37:43.111243+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "coastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "coastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "coast", + "label": "Coast", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "east", + "label": "East", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "farWest", + "label": "Far West", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "north", + "label": "North", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "northCentral", + "label": "North Central", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southCentral", + "label": "South Central", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southern", + "label": "Southern", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "systemTotal", + "label": "System Total", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 13, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:43.111243+00:00", + "sha256": "07b07250cd9ee51044c99e4bb7779d3a13277648e08c23ed0284b4c13920b901", + "byte_count": 2320, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:43.111243+00:00", + "sha256": "07b07250cd9ee51044c99e4bb7779d3a13277648e08c23ed0284b4c13920b901", + "byte_count": 2320, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:45.445307+00:00", + "sha256": "896f0026fd3affb4d1d9d6f620fc3f111e47544b853da7959f7f6b4518305a5b", + "byte_count": 2309, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-561-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12312, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np3-562-cd--ih_load_fcast_by_wzn.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np3-562-cd/ih_load_fcast_by_wzn", + "observed_at": "2026-09-06 00:37:47.164389+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "farWestFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "model", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "inUseFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "coastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "coastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalEnding", + "label": "Interval Ending", + "cardinality": 2, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "coast", + "label": "Coast", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "east", + "label": "East", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "farWest", + "label": "Far West", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "north", + "label": "North", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "northCentral", + "label": "North Central", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southCentral", + "label": "South Central", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southern", + "label": "Southern", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "systemTotal", + "label": "System Total", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "model", + "label": "Model", + "cardinality": 12, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "inUseFlag", + "label": "In Use Flag", + "cardinality": 13, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 14, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:47.164389+00:00", + "sha256": "d9024dbda3e05168a00a3dea4c9e3dc37883f8675b5446dfd9199d5ede70f788", + "byte_count": 2511, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:47.164389+00:00", + "sha256": "d9024dbda3e05168a00a3dea4c9e3dc37883f8675b5446dfd9199d5ede70f788", + "byte_count": 2511, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:49.355980+00:00", + "sha256": "85bc1e3c185465a3c1fe51ec3c3a4c08300dda6204eba6a9d096be51fef10fb8", + "byte_count": 2515, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-562-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 16553, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np3-565-cd--lf_by_model_weather_zone.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np3-565-cd/lf_by_model_weather_zone", + "observed_at": "2026-09-06 00:38:19.023514+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "coastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "coastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "systemTotalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "model", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "inUseFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "coast", + "label": "Coast", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "east", + "label": "East", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "farWest", + "label": "Far West", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "north", + "label": "North", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "northCentral", + "label": "North Central", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southCentral", + "label": "South Central", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southern", + "label": "Southern", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "systemTotal", + "label": "System Total", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "model", + "label": "Model", + "cardinality": 13, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "inUseFlag", + "label": "In Use Flag", + "cardinality": 14, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 15, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:38:19.023514+00:00", + "sha256": "3ed90e939aa2f4efa0b8427582f09800f41d8e322bcc82f044feb45588380b2c", + "byte_count": 2607, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:38:19.023514+00:00", + "sha256": "3ed90e939aa2f4efa0b8427582f09800f41d8e322bcc82f044feb45588380b2c", + "byte_count": 2607, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:38:34.171487+00:00", + "sha256": "8704e30812e94377745fa2b5ddc00541b52aeea9f0d53d71f57bdf30b6fc5e93", + "byte_count": 2603, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-565-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 14837, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-158-sg--dam_essps.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-158-sg/dam_essps", + "observed_at": "2026-09-06 00:32:07.472297+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "groupIndexFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "groupIndexTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "updateTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "updateTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "groupIndex", + "label": "Group Index", + "cardinality": 5, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "updateTime", + "label": "Update Time", + "cardinality": 6, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 7, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:32:07.472297+00:00", + "sha256": "2ec1865a530ed3acaa47f7b1d47ee0a60bbce036584d2be19ffd318ff5248f61", + "byte_count": 1548, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:32:07.472297+00:00", + "sha256": "2ec1865a530ed3acaa47f7b1d47ee0a60bbce036584d2be19ffd318ff5248f61", + "byte_count": 1548, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:32:09.483801+00:00", + "sha256": "41062012de7a8e87058091f7228ebfb4e2f43547fd9acf3038cbee9f05d52228", + "byte_count": 1544, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-158-SG", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13058, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-159-cd--load_distribution_factors.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-159-cd/load_distribution_factors", + "observed_at": "2026-09-06 00:32:24.910796+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "LDFDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "LDFDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "LDFHour", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "substation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "distributionFactorFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "distributionFactorTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "loadId", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "MVARDistributionFactorFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MVARDistributionFactorTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "MRIDLoad", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "LDFDate", + "label": "LDF Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "LDFHour", + "label": "LDF Hour", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "substation", + "label": "Substation", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "distributionFactor", + "label": "Distribution Factor", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "loadId", + "label": "Load Id", + "cardinality": 6, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "MVARDistributionFactor", + "label": "MVAR Distribution Factor", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "MRIDLoad", + "label": "MRID Load", + "cardinality": 8, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 9, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors?size=1&page=1&sort=LDFDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:24.910796+00:00", + "sha256": "993ab035308e4cf7739bea8d28ffa61e13250f68dd83c949448fe5a73cff892b", + "byte_count": 1835, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors?size=1&page=1&sort=LDFDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:24.910796+00:00", + "sha256": "993ab035308e4cf7739bea8d28ffa61e13250f68dd83c949448fe5a73cff892b", + "byte_count": 1835, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors?size=1&page=1&sort=LDFDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:34.734047+00:00", + "sha256": "5487238968fdfbff4a8e4afb654371177e1e065c9cea36c3fe83e3d293119b53", + "byte_count": 1847, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-159-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12324, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-183-cd--dam_hourly_lmp.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-183-cd/dam_hourly_lmp", + "observed_at": "2026-09-06 00:32:34.811307+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "busName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "busName", + "label": "Bus Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMP", + "label": "LMP", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:34.811307+00:00", + "sha256": "cfa236240f8622d5755d3c1896af78322e875f9923ab981157181a021e60ef1f", + "byte_count": 1235, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:34.811307+00:00", + "sha256": "cfa236240f8622d5755d3c1896af78322e875f9923ab981157181a021e60ef1f", + "byte_count": 1235, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:36.934518+00:00", + "sha256": "1c9275c26f20a05a4c8386121890e93f4f8685ada25650b4e89f24174650204b", + "byte_count": 1231, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-183-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12328, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-19-cd--dam_agg_as_offer_curve.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-19-cd/dam_agg_as_offer_curve", + "observed_at": "2026-09-06 00:33:54.816697+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "ancillaryType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ancillaryType", + "label": "Ancillary Type", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "price", + "label": "Price", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 6, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:54.816697+00:00", + "sha256": "35716ba50f9690417cb259eb3dd27fd572777906a50ddc14a1ccb1fe1d7efd14", + "byte_count": 1361, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:54.816697+00:00", + "sha256": "35716ba50f9690417cb259eb3dd27fd572777906a50ddc14a1ccb1fe1d7efd14", + "byte_count": 1361, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:56.760091+00:00", + "sha256": "112ed960c283728aa67652f67fa1ecaa134eb41fb10f535af3bbbde2799dc562", + "byte_count": 1359, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-19-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12330, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-191-cd--dam_shadow_prices.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-191-cd/dam_shadow_prices", + "observed_at": "2026-09-06 00:29:12.188633+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "constraintIdFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintIdTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "contingencyName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "constraintLimitFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintLimitTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintValueFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintValueTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "violationAmountFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "violationAmountTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "shadowPriceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "fromStation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "toStation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "fromStationkVFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "fromStationkVTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "toStationkVFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "toStationkVTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "deliveryTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "constraintId", + "label": "Constraint Id", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintName", + "label": "Constraint Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "contingencyName", + "label": "Contingency Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "constraintLimit", + "label": "Constraint Limit", + "cardinality": 6, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintValue", + "label": "Constraint Value", + "cardinality": 7, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "violationAmount", + "label": "Violation Amount", + "cardinality": 8, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "shadowPrice", + "label": "Shadow Price", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "fromStation", + "label": "From Station", + "cardinality": 10, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "toStation", + "label": "To Station", + "cardinality": 11, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "fromStationkV", + "label": "From Station kV", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "toStationkV", + "label": "To Station kV", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryTime", + "label": "Delivery Time", + "cardinality": 14, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 15, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:29:12.188633+00:00", + "sha256": "db45f1a9cb9f9cd1b1c99e27813b992446bcc029b2a39c4639a4baf4aae652f0", + "byte_count": 2674, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:29:12.188633+00:00", + "sha256": "db45f1a9cb9f9cd1b1c99e27813b992446bcc029b2a39c4639a4baf4aae652f0", + "byte_count": 2674, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:29:14.219945+00:00", + "sha256": "de4b4145be0ec6b778a82fdfeb20d4dfbc1d85c1c24c74cef4fc959c1ddebb8b", + "byte_count": 2674, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-191-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12332, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-192-cd--dam_total_energy_purchased.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-192-cd/dam_total_energy_purchased", + "observed_at": "2026-09-06 00:32:39.185937+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "totalDamEnergyBoughtFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalDamEnergyBoughtTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "totalDamEnergyBought", + "label": "Total DAM Energy Bought", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:39.185937+00:00", + "sha256": "1c4bf6d563b3e77e988766b08cd083598e37ff0ecb297f65918c09cbce362a66", + "byte_count": 1280, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:39.185937+00:00", + "sha256": "1c4bf6d563b3e77e988766b08cd083598e37ff0ecb297f65918c09cbce362a66", + "byte_count": 1280, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:41.270109+00:00", + "sha256": "84234f8ad8273961086d9bddab4bbfa5014e2f23d3cf8f370fc59a4be32c5330", + "byte_count": 1274, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-192-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12333, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-193-cd--total_dam_energy_sold.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-193-cd/total_dam_energy_sold", + "observed_at": "2026-09-06 00:32:43.447934+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "totalDAMEnergySoldFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalDAMEnergySoldTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "totalDAMEnergySold", + "label": "Total DAM Energy Sold", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:43.447934+00:00", + "sha256": "9a2a56d1bc33f2a79cdb8f2bcdbef7d34ae3ab32fe6d23783d3bbc1e91eff4f9", + "byte_count": 1260, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:43.447934+00:00", + "sha256": "9a2a56d1bc33f2a79cdb8f2bcdbef7d34ae3ab32fe6d23783d3bbc1e91eff4f9", + "byte_count": 1260, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:45.465991+00:00", + "sha256": "da2ce61b6c5bd72f62af5705613c88f28cd7e28c22cde16ccdd76b6ff40e088b", + "byte_count": 1261, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-193-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12334, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-194-cd--dam_ptp_obligation_sp_results.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-194-cd/dam_ptp_obligation_sp_results", + "observed_at": "2026-09-06 00:32:47.519937+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "stlPnt", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "totalPtpOblAwardedSourceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalPtpOblAwardedSourceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalPtpOblAwardedSinkFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalPtpOblAwardedSinkTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "DELIVERY DATE", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "HOUR ENDING", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "stlPnt", + "label": "STL_PNT", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "totalPtpOblAwardedSource", + "label": "TOTAL_PTP_OBL_AWARDED_SOURCE", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalPtpOblAwardedSink", + "label": "TOTAL_PTP_OBL_AWARDED_SINK", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 6, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:47.519937+00:00", + "sha256": "9fa2ba5a6579c6187dd44163d5bf9a1659b681843d697cde4cbbdc00380adf55", + "byte_count": 1463, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:47.519937+00:00", + "sha256": "9fa2ba5a6579c6187dd44163d5bf9a1659b681843d697cde4cbbdc00380adf55", + "byte_count": 1463, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:49.575911+00:00", + "sha256": "8b9cc5740cc0f00497248a284bdef1a929a0e3cce8627df32adb97a9b9470d4f", + "byte_count": 1459, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-194-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13042, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-196-m--dam_price_corrections_eblmp.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-196-m/dam_price_corrections_eblmp", + "observed_at": "2026-09-06 00:33:00.514846+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "electricalBus", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "electricalBus", + "label": "Electric Bus Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMPOriginal", + "label": "LMP Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "LMPCorrected", + "label": "LMP Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 6, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 7, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:00.514846+00:00", + "sha256": "73a38d542e10bee603ef8d7957332b7a977ff806dff171eafa3727c9e4a5c656", + "byte_count": 1550, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:00.514846+00:00", + "sha256": "73a38d542e10bee603ef8d7957332b7a977ff806dff171eafa3727c9e4a5c656", + "byte_count": 1550, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:02.338482+00:00", + "sha256": "c48c8ec1db8c625acb254116d4760d2b18323bb500ebda873e39bcd319863500", + "byte_count": 1553, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-196-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13044, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-196-m--dam_price_corrections_mcpc.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-196-m/dam_price_corrections_mcpc", + "observed_at": "2026-09-06 00:32:55.870063+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "MCPCOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "MCPCOriginal", + "label": "MCPC Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "MCPCCorrected", + "label": "MCPC Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 6, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 7, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:55.870063+00:00", + "sha256": "3c0814c609efe98095dc5f475e84760b80dac09c9a528b1566fb428fc4579091", + "byte_count": 1525, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:55.870063+00:00", + "sha256": "3c0814c609efe98095dc5f475e84760b80dac09c9a528b1566fb428fc4579091", + "byte_count": 1525, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:57.945622+00:00", + "sha256": "b8e89ccaf67a683bf2498a7d7e17dedc5aeb09e4727904945410a7b131bdcca7", + "byte_count": 1524, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-196-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13044, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-196-m--dam_price_corrections_spp.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-196-m/dam_price_corrections_spp", + "observed_at": "2026-09-06 00:32:51.747752+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "SPPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "SPPOriginal", + "label": "Settlement Point Price Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "SPPCorrected", + "label": "Settlement Point Price Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 6, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 7, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:32:51.747752+00:00", + "sha256": "33a23a8c07f56dc4a9d7f4c3bfdaab8df7c8418f2b44de5332c79f1210acfb37", + "byte_count": 1594, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:32:51.747752+00:00", + "sha256": "33a23a8c07f56dc4a9d7f4c3bfdaab8df7c8418f2b44de5332c79f1210acfb37", + "byte_count": 1594, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp?size=1&page=1&sort=priceCorrectionTime&dir=asc", + "retrieved_at": "2026-09-06 00:32:53.837804+00:00", + "sha256": "4a39145ee09ff92fdbaf3368e91fc714315e635a89d95cb241a8c4bc7af44326", + "byte_count": 1595, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-196-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13044, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-197-m--rtm_price_corrections_eblmp.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_eblmp", + "observed_at": "2026-09-06 00:33:31.287166+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "cappedLMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedLMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedLMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedLMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "electricalBus", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "electricalBus", + "label": "Electrical Bus", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedLMPOriginal", + "label": "Capped LMP Original", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedLMPOriginal", + "label": "Uncapped LMP Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "cappedLMPCorrected", + "label": "Capped LMP Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedLMPCorrected", + "label": "Uncapped LMP Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 7, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:31.287166+00:00", + "sha256": "daacde6c38a38f0390c4e12f1879f77d4e3e2d7c1939317941a315b4c86c8ba1", + "byte_count": 1793, + "status": 200 + }, + "observed_nullable_fields": [ + "uncappedLMPCorrected", + "uncappedLMPOriginal" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:31.287166+00:00", + "sha256": "daacde6c38a38f0390c4e12f1879f77d4e3e2d7c1939317941a315b4c86c8ba1", + "byte_count": 1793, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp?size=1&page=1&sort=priceCorrectionTime&dir=asc", + "retrieved_at": "2026-09-06 00:33:39.121693+00:00", + "sha256": "e9d5a54a787f4d787a6b41c2012df438800bfcc7b0c6bbaea2ae64192d9caf98", + "byte_count": 1795, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-197-m--rtm_price_corrections_mcpc_sced.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_mcpc_sced", + "observed_at": "2026-09-06 00:33:16.884297+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "cappedMCPCOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedMCPCOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedMCPCCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedMCPCCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedMCPCOriginal", + "label": "Capped MCPC Original", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedMCPCOriginal", + "label": "Uncapped MCPC Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "cappedMCPCCorrected", + "label": "Capped MCPC Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedMCPCCorrected", + "label": "Uncapped MCPC Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 7, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:16.884297+00:00", + "sha256": "f603f64a418ba88a5a92de01e1929e5ff768c905916f37e346127877195386dd", + "byte_count": 1792, + "status": 200 + }, + "observed_nullable_fields": [ + "uncappedMCPCCorrected", + "uncappedMCPCOriginal" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:16.884297+00:00", + "sha256": "f603f64a418ba88a5a92de01e1929e5ff768c905916f37e346127877195386dd", + "byte_count": 1792, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:33:18.980553+00:00", + "sha256": "6307e492749c04525fe05cac1dbf51edd82a98f29ed0735f0194f8bde2e7f26c", + "byte_count": 1791, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-197-m--rtm_price_corrections_mcpc_spp.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_mcpc_spp", + "observed_at": "2026-09-06 00:33:47.743460+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "MCPCOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "MCPCOriginal", + "label": "MCPC Original", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "MCPCCorrected", + "label": "MCPC Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 7, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:47.743460+00:00", + "sha256": "93c4dde4dc74c14fd8978f9328bafba61c5367c460f7f15756a09c010ba254aa", + "byte_count": 1732, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:47.743460+00:00", + "sha256": "93c4dde4dc74c14fd8978f9328bafba61c5367c460f7f15756a09c010ba254aa", + "byte_count": 1732, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp?size=1&page=1&sort=priceCorrectionTime&dir=asc", + "retrieved_at": "2026-09-06 00:33:49.686029+00:00", + "sha256": "2976690ee5ff354be239bc94b1ed5a05be957b48406e869888c2ba9f53110ffd", + "byte_count": 1730, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-197-m--rtm_price_corrections_shadow.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_shadow", + "observed_at": "2026-09-06 00:33:04.452226+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "constraintIdFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintIdTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "contingencyName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "shadowPriceOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintId", + "label": "Constraint Id", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintName", + "label": "Constraint Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "contingencyName", + "label": "Contingency Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "shadowPriceOriginal", + "label": "Shadow Price Original", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "shadowPriceCorrected", + "label": "Shadow Price Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "limitOriginal", + "label": "Limit Original", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "limitCorrected", + "label": "Limit Corrected", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "valueOriginal", + "label": "Value Original", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "valueCorrected", + "label": "Value Corrected", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 11, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 12, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:04.452226+00:00", + "sha256": "f5606e297fb1d959006e4768e4c05ef868dd0868e122e278f69d3a0791543601", + "byte_count": 2340, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:04.452226+00:00", + "sha256": "f5606e297fb1d959006e4768e4c05ef868dd0868e122e278f69d3a0791543601", + "byte_count": 2340, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:33:06.383626+00:00", + "sha256": "0dd9440b9b6a75387286287f289543aa1361c71e7d0baf894f4f3e3cf7ee4b72", + "byte_count": 2332, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-197-m--rtm_price_corrections_soglmp.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_soglmp", + "observed_at": "2026-09-06 00:33:08.878850+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "resourceType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "resourceName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterLMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterLMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterLMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterLMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPACorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPACorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "resourceType", + "label": "Resource Type", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceName", + "label": "Resource Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterName", + "label": "Meter Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterLMPOriginal", + "label": "Meter LMP Original", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "meterLMPCorrected", + "label": "Meter LMP Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPAOriginal", + "label": "RTRDPA Original", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPACorrected", + "label": "RTRDPA Corrected", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "finalLMPOriginal", + "label": "Final LMP Original", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "finalLMPCorrected", + "label": "Final LMP Corrected", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 11, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": " Repeat Hour Flag", + "cardinality": 12, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "RTORPAOriginal", + "label": "RTORPA Original", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": false, + "sortable": false, + "hasRange": true + }, + { + "name": "RTORPACorrected", + "label": "RTORPA Corrected", + "cardinality": 14, + "dataType": "DOUBLE", + "searchable": false, + "sortable": false, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:08.878850+00:00", + "sha256": "6e44a667ea8adf224d6516c9df931bbd0ad9b4d80d26c51573d19af1af278dce", + "byte_count": 2650, + "status": 200 + }, + "observed_nullable_fields": [ + "RTORPACorrected", + "RTORPAOriginal" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:08.878850+00:00", + "sha256": "6e44a667ea8adf224d6516c9df931bbd0ad9b4d80d26c51573d19af1af278dce", + "byte_count": 2650, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:33:10.793701+00:00", + "sha256": "c8629403994867e0335a4e0ed090b7ce75a66b8b118d490b3bc58ba0e72703c4", + "byte_count": 2647, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-197-m--rtm_price_corrections_sogprice.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_sogprice", + "observed_at": "2026-09-06 00:33:12.873257+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "resourceType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "resourceName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "priceOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "resourceType", + "label": "Resource Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceName", + "label": "Resource Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterName", + "label": "Meter Name", + "cardinality": 6, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "priceOriginal", + "label": "Price Original", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrected", + "label": "Price Corrected", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 9, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 10, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:12.873257+00:00", + "sha256": "3ec799b42a7f5dbbcf928e22341229aa28202ec7a04bd68208059f2e72a9f67b", + "byte_count": 2013, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:12.873257+00:00", + "sha256": "3ec799b42a7f5dbbcf928e22341229aa28202ec7a04bd68208059f2e72a9f67b", + "byte_count": 2013, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:14.885150+00:00", + "sha256": "40515fc1bb929fababb59e5838b2f4f3ef6a7c86abfe59e6258dc1644392f601", + "byte_count": 2008, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-197-m--rtm_price_corrections_splmp.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_splmp", + "observed_at": "2026-09-06 00:33:44.512474+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "settlementPointName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "settlementPointName", + "label": "Settlement Point", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMPOriginal", + "label": "LMP Original", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "LMPCorrected", + "label": "LMP Corrected", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 5, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 6, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:44.512474+00:00", + "sha256": "0b8df9d51b38f9aec09a77e6ceb9a72d9cf5b7b2222c1dd66b586d4227085eeb", + "byte_count": 1438, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:44.512474+00:00", + "sha256": "0b8df9d51b38f9aec09a77e6ceb9a72d9cf5b7b2222c1dd66b586d4227085eeb", + "byte_count": 1438, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp?size=1&page=1&sort=priceCorrectionTime&dir=asc", + "retrieved_at": "2026-09-06 00:33:46.181612+00:00", + "sha256": "227429807fb2d95fb881a2830ea38b1f78c35ff78b1c89c695f02bedcc105a14", + "byte_count": 1437, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-197-m--rtm_price_corrections_spp.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_spp", + "observed_at": "2026-09-06 00:33:39.282719+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "settlementPointName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPointType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "SPPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "settlementPointName", + "label": "Settlement Point Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPointType", + "label": "Settlement Point Type", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "SPPOriginal", + "label": "SPP Original", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "SPPCorrected", + "label": "SPP Corrected", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 8, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 9, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:39.282719+00:00", + "sha256": "058496e9703c6dc9381b788dab58a8551638f06cb4be13efc354e3e62020033e", + "byte_count": 1865, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:39.282719+00:00", + "sha256": "058496e9703c6dc9381b788dab58a8551638f06cb4be13efc354e3e62020033e", + "byte_count": 1865, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:41.343686+00:00", + "sha256": "9a7592136c8c0179bc1f114a33c326ec8c5ebc848b8a9b3cd4dd8115c7c1ab3a", + "byte_count": 1863, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-200-cd--dam_de_energized_spbc.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-200-cd/dam_de_energized_spbc", + "observed_at": "2026-09-06 00:33:57.003317+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 4, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:57.003317+00:00", + "sha256": "04fce1756dcf0732ef9aae79179c8d0f8cff83f7f313931584c0a4c094df7361", + "byte_count": 1133, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:57.003317+00:00", + "sha256": "04fce1756dcf0732ef9aae79179c8d0f8cff83f7f313931584c0a4c094df7361", + "byte_count": 1133, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:59.081259+00:00", + "sha256": "08ac3b070979f0acf986d284df465112be8b6ebce528458e1a2be3e7d2034a68", + "byte_count": 1132, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-200-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13063, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-212-cd--dam_sced_as_demand_curves.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-212-cd/dam_sced_as_demand_curves", + "observed_at": "2026-09-06 00:34:08.261581+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "demandCurvePointFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "demandCurvePointTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "demandCurvePoint", + "label": "Demand Curve Point", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "price", + "label": "Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:08.261581+00:00", + "sha256": "c0f4e123289450c5181d49b4355075216ffd9546820726a9e95b684b8809e7c0", + "byte_count": 1681, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:08.261581+00:00", + "sha256": "c0f4e123289450c5181d49b4355075216ffd9546820726a9e95b684b8809e7c0", + "byte_count": 1681, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:34:14.051951+00:00", + "sha256": "fdf0c6af9faa4867820233b305d59d0acfcafbb12d74a14a6918bad439d24ca1", + "byte_count": 1682, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-212-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24893, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-213-cd--hruc_as_demand_curves.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-213-cd/hruc_as_demand_curves", + "observed_at": "2026-09-06 00:34:24.741049+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "RUCTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RUCTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "demandCurvePointFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "demandCurvePointTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "RUCTimestamp", + "label": "RUC Timestamp", + "cardinality": 3, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "demandCurvePoint", + "label": "Demand Curve Point", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "price", + "label": "Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:24.741049+00:00", + "sha256": "4a4d5f8551c941d5c9978cb435f4c90a3bfd8ce77052c17127df3bfdb75b349b", + "byte_count": 1674, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:24.741049+00:00", + "sha256": "4a4d5f8551c941d5c9978cb435f4c90a3bfd8ce77052c17127df3bfdb75b349b", + "byte_count": 1674, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:34:31.094636+00:00", + "sha256": "66d52d07fc7ac60680f5722ecb8a41f0b4e2c927043c91e3a89385bb64558367", + "byte_count": 1673, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-213-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 26382, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-214-cd--druc_as_demand_curves.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-214-cd/druc_as_demand_curves", + "observed_at": "2026-09-06 00:34:31.620370+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "RUCTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RUCTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "demandCurvePointFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "demandCurvePointTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "RUCTimestamp", + "label": "RUC Timestamp", + "cardinality": 3, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "demandCurvePoint", + "label": "Demand Curve Point", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "price", + "label": "Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:31.620370+00:00", + "sha256": "70e2be03bae063a1228ad564f4ee5ca9a5ed120580867da6158bbaaa1f063626", + "byte_count": 1670, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:31.620370+00:00", + "sha256": "70e2be03bae063a1228ad564f4ee5ca9a5ed120580867da6158bbaaa1f063626", + "byte_count": 1670, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:34:33.531743+00:00", + "sha256": "8c9352a6467b5e4692f5ccea9aeb38f2cb68e02d25a8e845f056a16ad056aa15", + "byte_count": 1672, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-214-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 26383, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-215-cd--wruc_as_demand_curves.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-215-cd/wruc_as_demand_curves", + "observed_at": "2026-09-06 00:34:37.568075+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "RUCTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RUCTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "demandCurvePointFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "demandCurvePointTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "RUCTimestamp", + "label": "RUC Timestamp", + "cardinality": 4, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "demandCurvePoint", + "label": "Demand Curve Point", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "price", + "label": "Price", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 9, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:37.568075+00:00", + "sha256": "ed7433735b66b8920357ad1770c025117b8c4f3fae2c0f174e1a9d5d28013e62", + "byte_count": 1825, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:37.568075+00:00", + "sha256": "ed7433735b66b8920357ad1770c025117b8c4f3fae2c0f174e1a9d5d28013e62", + "byte_count": 1825, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:34:39.851515+00:00", + "sha256": "e8e396838ccf075c55dd8a8077550334c56b0f07f65b738cc1a77ab4da90e157", + "byte_count": 1826, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-215-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 26384, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-231-cd--electrical_bus_map_heur_price.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-231-cd/electrical_bus_map_heur_price", + "observed_at": "2026-09-06 00:34:40.026782+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "toEBName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "type", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "priorityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priorityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "marketType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "fromEBName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "marketType", + "label": "Market Type", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "fromEBName", + "label": "From EB Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "toEBName", + "label": "To EB Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "type", + "label": "Type", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "priority", + "label": "Prioirty", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:40.026782+00:00", + "sha256": "0757c36af7899c97591b482f4f7e9380dc03c393078d36b2b59c9c940196e2bc", + "byte_count": 1393, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:40.026782+00:00", + "sha256": "0757c36af7899c97591b482f4f7e9380dc03c393078d36b2b59c9c940196e2bc", + "byte_count": 1393, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:34:42.053902+00:00", + "sha256": "14f185bca4e7364790b212ec7d5d5a6ccf79d3e9edf533e2d1ce4e6b06527d64", + "byte_count": 1389, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-231-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13098, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-33-cd--dam_as_plan.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-33-cd/dam_as_plan", + "observed_at": "2026-09-06 00:34:44.828813+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "ancillaryType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ancillaryType", + "label": "Ancillary Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 5, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 6, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:44.828813+00:00", + "sha256": "a29dd5a759f3a1c85ebcaed9d13b20fb56ab0f7d7acf3af32f486b72d0062795", + "byte_count": 1345, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:44.828813+00:00", + "sha256": "a29dd5a759f3a1c85ebcaed9d13b20fb56ab0f7d7acf3af32f486b72d0062795", + "byte_count": 1345, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:34:46.453380+00:00", + "sha256": "38abe96b4545df12a03b1e7956435cfbd3bdd6009408fdb3944ea61e56f9874a", + "byte_count": 1344, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-33-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12316, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np4-523-cd--dam_system_lambda.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np4-523-cd/dam_system_lambda", + "observed_at": "2026-09-06 00:29:07.797208+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "systemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "systemLambda", + "label": "System Lambda", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 4, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:29:07.797208+00:00", + "sha256": "766feac4c56955e0a17ad211f1591588f375f40e8da86206d748897b66bdb7a0", + "byte_count": 1061, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:29:07.797208+00:00", + "sha256": "766feac4c56955e0a17ad211f1591588f375f40e8da86206d748897b66bdb7a0", + "byte_count": 1061, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:29:09.895072+00:00", + "sha256": "2b988b1c0c75b3a7aa1eea3c6658c0237f22cae1870eaaf8e6f17879bb0e02b8", + "byte_count": 1059, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-523-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13113, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-322-cd--sced_system_lambda.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-322-cd/sced_system_lambda", + "observed_at": "2026-09-06 00:28:59.474426+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "cappedSystemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedSystemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedSystemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedSystemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedSystemLambda", + "label": "Capped System Lambda", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedSystemLambda", + "label": "Uncapped System Lambda", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:28:59.474426+00:00", + "sha256": "77ca7de176a6e8b5054e003fbefb544c5a9708d7e0afd78e1586bb640a10f374", + "byte_count": 1136, + "status": 200 + }, + "observed_nullable_fields": [ + "uncappedSystemLambda" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:28:59.474426+00:00", + "sha256": "77ca7de176a6e8b5054e003fbefb544c5a9708d7e0afd78e1586bb640a10f374", + "byte_count": 1136, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:01.567657+00:00", + "sha256": "4971a333900c56d988835c3b8bcceaded74a110cecfd7376c6c98d08e78ddb74", + "byte_count": 1139, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-322-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13114, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-323-cd--rt_price_adder_sced.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-323-cd/rt_price_adder_sced", + "observed_at": "2026-09-06 00:31:12.153704+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "systemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPATo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARUSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARUSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARDSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARDSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPANSSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPANSSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRUCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRUCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRMRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRMRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDNCLRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDNCLRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDERSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDERSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEIMPORTFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEIMPORTTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEEXPORTFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEEXPORTTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTIMPORTFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTIMPORTTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTEXPORTFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTEXPORTTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLLSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLLSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLHSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLHSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDLLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDLLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "systemLambda", + "label": "System Lambda", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPA", + "label": "RTRDPA", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARUS", + "label": "RTRDPARUS", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARDS", + "label": "RTRDPARDS", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARRS", + "label": "RTRDPARRS", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPAECRS", + "label": "RTRDPAECRS", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPANSS", + "label": "RTRDPANSS", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRRUC", + "label": "RTRRUC", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRRMR", + "label": "RTRRMR", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDNCLR", + "label": "RTDNCLR", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDERS", + "label": "RTDERS", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDCTIEIMPORT", + "label": "RTDCTIEIMPORT", + "cardinality": 14, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDCTIEEXPORT", + "label": "RTDCTIEEXPORT", + "cardinality": 15, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTBLTIMPORT", + "label": "RTBLTIMPORT", + "cardinality": 16, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTBLTEXPORT", + "label": "RTBLTEXPORT", + "cardinality": 17, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTOLLSL", + "label": "RTOLLSL", + "cardinality": 18, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTOLHSL", + "label": "RTOLHSL", + "cardinality": 19, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDLL", + "label": "RTDLL", + "cardinality": 20, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:12.153704+00:00", + "sha256": "67f0d42818fe6f977d738a0926e7cf04cde4ff4ac290cc65d27d5c8365f822fc", + "byte_count": 3211, + "status": 200 + }, + "observed_nullable_fields": [ + "RTDLL" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:12.153704+00:00", + "sha256": "67f0d42818fe6f977d738a0926e7cf04cde4ff4ac290cc65d27d5c8365f822fc", + "byte_count": 3211, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:14.300100+00:00", + "sha256": "fbbf89da188814d6615ee7f0a5cebde1d105e68c4e33d2561ea4919e1c5f46d4", + "byte_count": 3211, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-323-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13221, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-324-cd--rt_15min_price_adders.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-324-cd/rt_15min_price_adders", + "observed_at": "2026-09-06 00:31:16.353390+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "RTRDPAFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPATo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRUFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRUTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRDFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRDTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPNSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPNSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPA", + "label": "RTRDPA", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPRU", + "label": "RTRDPRU", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPRD", + "label": "RTRDPRD", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPRRS", + "label": "RTRDPRRS", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPECRS", + "label": "RTRDPECRS", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPNS", + "label": "RTRDPNS", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 10, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:16.353390+00:00", + "sha256": "961eefa8a4a711a38d900384dd3b42a4ab0367b39ee6ddd292c3cc1e649d846f", + "byte_count": 1891, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:16.353390+00:00", + "sha256": "961eefa8a4a711a38d900384dd3b42a4ab0367b39ee6ddd292c3cc1e649d846f", + "byte_count": 1891, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:31:18.428695+00:00", + "sha256": "027c9a2300ba7911c754f8eebe6175b0051016fb4d8d58c9e5c66960737db055", + "byte_count": 1890, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-324-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13220, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-325-cd--rtd_price_adders.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-325-cd/rtd_price_adders", + "observed_at": "2026-09-06 00:31:04.471292+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "RTDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RTDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "intervalIDFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalIDTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalEndingFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "IERepeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "systemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPATo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARUSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARUSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARDSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARDSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPANSSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPANSSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRUCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRUCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRMRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRMRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDNCLRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDNCLRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDERSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDERSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEImportFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEImportTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEExportFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEExportTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTImportFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTImportTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTExportFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTExportTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLLSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLLSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLHSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLHSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDLLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDLLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "RTDTimestamp", + "label": "RTD Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "intervalID", + "label": "Interval ID", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalEnding", + "label": "Interval Ending", + "cardinality": 4, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "IERepeatHourFlag", + "label": "IE Repeated Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "systemLambda", + "label": "System Lambda", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPA", + "label": "RTRDPA", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARUS", + "label": "RTRDPARUS", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARDS", + "label": "RTRDPARDS", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARRS", + "label": "RTRDPARRS", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPAECRS", + "label": "RTRDPAECRS", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPANSS", + "label": "RTRDPANSS", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRRUC", + "label": "RTRRUC", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRRMR", + "label": "RTRRMR", + "cardinality": 14, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDNCLR", + "label": "RTDNCLR", + "cardinality": 15, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDERS", + "label": "RTDERS", + "cardinality": 16, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDCTIEImport", + "label": "RTDCTIEIMPORT", + "cardinality": 17, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDCTIEExport", + "label": "RTDCTIEEXPORT", + "cardinality": 18, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTBLTImport", + "label": "RTBLTIMPORT", + "cardinality": 19, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTBLTExport", + "label": "RTBLTEXPORT", + "cardinality": 20, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTOLLSL", + "label": "RTOLLSL", + "cardinality": 21, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTOLHSL", + "label": "RTOLHSL", + "cardinality": 22, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDLL", + "label": "RTDLL", + "cardinality": 23, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:04.471292+00:00", + "sha256": "c4d02b98f78e09bb85eda102da98765be19e8e495cd048205d670beb4453ab1c", + "byte_count": 3644, + "status": 200 + }, + "observed_nullable_fields": [ + "RTDLL" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:04.471292+00:00", + "sha256": "c4d02b98f78e09bb85eda102da98765be19e8e495cd048205d670beb4453ab1c", + "byte_count": 3644, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders?size=1&page=1&sort=RTDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:06.552442+00:00", + "sha256": "7bd2b55b3c121038863a74f93a27948cb857d3d7fb0e0e7b419913b24a7d1445", + "byte_count": 3635, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-325-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13222, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-326-cd--rt_price_sog.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-326-cd/rt_price_sog", + "observed_at": "2026-09-06 00:31:20.888518+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "resourceType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "resourceName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterPriceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterPriceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "resourceType", + "label": "Resource Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceName", + "label": "Resource Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterName", + "label": "Meter Name", + "cardinality": 6, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterPrice", + "label": "Meter Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:20.888518+00:00", + "sha256": "a3a54b7424614862ded3f8f302642e3c8dee48515d0961f74a2f02d359421987", + "byte_count": 1646, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:20.888518+00:00", + "sha256": "a3a54b7424614862ded3f8f302642e3c8dee48515d0961f74a2f02d359421987", + "byte_count": 1646, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:31:22.696810+00:00", + "sha256": "cb5ac6745ec658a40d12ccc733cb05a7e01cf8d00a3c070b2f00b2d654dba28c", + "byte_count": 1644, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-326-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 21115, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-327-cd--lmp_sog_price_adders.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-327-cd/lmp_sog_price_adders", + "observed_at": "2026-09-06 00:31:26.465076+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "resourceType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "resourceName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "stationName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "voltageLevelFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "voltageLevelTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterLMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterLMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPATo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceType", + "label": "Resource Type", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceName", + "label": "Resource Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "stationName", + "label": "Station Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "voltageLevel", + "label": "Voltage Level", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "meterName", + "label": "Meter Name", + "cardinality": 7, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterLMP", + "label": "Meter LMP", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPA", + "label": "RTRDPA", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "finalLMP", + "label": "Final LMP", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:26.465076+00:00", + "sha256": "c216f6148611a494fdc747a0f3dbd0368fe691f9d5df85d4ec73d8982fea3689", + "byte_count": 1957, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:26.465076+00:00", + "sha256": "c216f6148611a494fdc747a0f3dbd0368fe691f9d5df85d4ec73d8982fea3689", + "byte_count": 1957, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:27.385676+00:00", + "sha256": "f9da8a1192f808af407756e0206aa16b570f58d6051f951fb39a3c237ae40da0", + "byte_count": 1957, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-327-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 21114, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-328-cd--tot_as_res_cap.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-328-cd/tot_as_res_cap", + "observed_at": "2026-09-06 00:31:28.945447+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "capREGDNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGDNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capRRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capRRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capNSPINFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capNSPINTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSECRSNSPINFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSECRSNSPINTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "capREGUPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Time Stamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "capREGUP", + "label": "CapREGUPTotal", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capREGDN", + "label": "CapREGDNTotal", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capRRS", + "label": "CapRRSTotal", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capECRS", + "label": "CapECRSTotal", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capNSPIN", + "label": "CapNSPINTotal", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capREGUPRRS", + "label": "CapREGUP_RRSTotal", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capREGUPRRSECRS", + "label": "CapREGUP_RRS_ECRSTotal", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capREGUPRRSECRSNSPIN", + "label": "CapREGUP_RRS_ECRS_NSPINTotal", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:28.945447+00:00", + "sha256": "076ed447f643c88d3938c9d2a297e30ed7bce5b892429fd402c91be561935711", + "byte_count": 2008, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:28.945447+00:00", + "sha256": "076ed447f643c88d3938c9d2a297e30ed7bce5b892429fd402c91be561935711", + "byte_count": 2008, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:31.071131+00:00", + "sha256": "9cdc02f04a7283319b00fdbc0d6ecbce420279022e38dbad7f6d67d1ca114e4c", + "byte_count": 2007, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-328-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24887, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-329-cd--rtd_ind_mcpc.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-329-cd/rtd_ind_mcpc", + "observed_at": "2026-09-06 00:31:08.321837+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "RRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RTDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "intervalIdFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalIdTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalEndingFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalRepeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "REGUPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGUPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "RTDTimestamp", + "label": "RTD Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "intervalId", + "label": "Interval ID", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalEnding", + "label": "Interval Ending", + "cardinality": 4, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalRepeatHourFlag", + "label": "Interval Ending Repeat Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "REGUP", + "label": "REGUP", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "REGDN", + "label": "REGDN", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RRS", + "label": "RRS", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ECRS", + "label": "ECRS", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "NSPIN", + "label": "NSPIN", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:08.321837+00:00", + "sha256": "5e9e8ba38d87463616136b1463341e8fd78a31fba130693fb0f7ca82f1dfe514", + "byte_count": 1890, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:08.321837+00:00", + "sha256": "5e9e8ba38d87463616136b1463341e8fd78a31fba130693fb0f7ca82f1dfe514", + "byte_count": 1890, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc?size=1&page=1&sort=RTDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:10.263823+00:00", + "sha256": "8e5d5f24ff6f8e4c3f08b9a4439f12df1ea317dbc2f0fe904ecec1895eefc03b", + "byte_count": 1892, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-329-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24889, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-331-cd--rt_clear_price_cap.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-331-cd/rt_clear_price_cap", + "observed_at": "2026-09-06 00:31:33.147496+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "MCPCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInt", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 4, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "MCPC", + "label": "MCPC", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:33.147496+00:00", + "sha256": "559631ae29eedeab7cccb265d22ca1232686479c4d1d3ede643b8bc298a6b293", + "byte_count": 1386, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:33.147496+00:00", + "sha256": "559631ae29eedeab7cccb265d22ca1232686479c4d1d3ede643b8bc298a6b293", + "byte_count": 1386, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:31:35.294454+00:00", + "sha256": "556c83d4d62051828fac3b17f090e7ecda8aa70001ca42762f47206b476cf5da", + "byte_count": 1385, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-331-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24898, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-332-cd--rt_clear_price_cap_sced.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-332-cd/rt_clear_price_cap_sced", + "observed_at": "2026-09-06 00:31:37.366909+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "cappedMCPCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedMCPCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedMCPC", + "label": "Capped MCPC", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedMCPC", + "label": "Uncapped MCPC", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:37.366909+00:00", + "sha256": "2902461ca6ba846272b90ba6f7ce31a3e6ea50330fc8ee9bd9295b6e4e6679dc", + "byte_count": 1272, + "status": 200 + }, + "observed_nullable_fields": [ + "uncappedMCPC" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:37.366909+00:00", + "sha256": "2902461ca6ba846272b90ba6f7ce31a3e6ea50330fc8ee9bd9295b6e4e6679dc", + "byte_count": 1272, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:39.594425+00:00", + "sha256": "189dce808819a0c380ac1e5bf34a66c03e4d079a52aa1158f54bf0a1f17a6140", + "byte_count": 1270, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-332-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24891, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-346-cd--act_sys_load_by_fzn.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-346-cd/act_sys_load_by_fzn", + "observed_at": "2026-09-06 00:29:03.588023+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "operatingDayFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "operatingDayTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "houstonFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "houstonTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "operatingDay", + "label": "Operating Day", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "north", + "label": "North", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "south", + "label": "South", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "houston", + "label": "Houston", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "total", + "label": "Total", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn?size=1&page=1&sort=operatingDay&dir=desc", + "retrieved_at": "2026-09-06 00:29:03.588023+00:00", + "sha256": "dc5832d9a14dc3ebf634cad1fcdcb34d7bcf955a102dd40b910cf7e698b31456", + "byte_count": 1584, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn?size=1&page=1&sort=operatingDay&dir=desc", + "retrieved_at": "2026-09-06 00:29:03.588023+00:00", + "sha256": "dc5832d9a14dc3ebf634cad1fcdcb34d7bcf955a102dd40b910cf7e698b31456", + "byte_count": 1584, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn?size=1&page=1&sort=operatingDay&dir=asc", + "retrieved_at": "2026-09-06 00:29:05.706607+00:00", + "sha256": "e174bfdd94814df13b850064adaae472f24e4fec341c438300feeb3d5c76dcfb", + "byte_count": 1582, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-346-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 14836, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-787-cd--lmp_electrical_bus.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-787-cd/lmp_electrical_bus", + "observed_at": "2026-09-06 00:29:17.122838+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "electricalBus", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "cappedLMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedLMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "electricalBus", + "label": "Electrical Bus", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedLMP", + "label": "Capped LMP", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedLMP", + "label": "Uncapped LMP", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:17.122838+00:00", + "sha256": "73f21c51e3e9320e361702cc9943651d9008e736a4601ce5edf4b47506bb4c5d", + "byte_count": 1325, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:17.122838+00:00", + "sha256": "73f21c51e3e9320e361702cc9943651d9008e736a4601ce5edf4b47506bb4c5d", + "byte_count": 1325, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:19.237816+00:00", + "sha256": "555fead5e0a803ab327da690c1069bcc10c42bc8fdd9b4fcd4a0b90ffa530142", + "byte_count": 1328, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-787-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 11485, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-788-cd--lmp_node_zone_hub.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-788-cd/lmp_node_zone_hub", + "observed_at": "2026-09-06 00:29:20.538109+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Time Stamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMP", + "label": "LMP", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:20.538109+00:00", + "sha256": "d6066c77b929984396406f769ba2f0eee5384c3ac7273a88e257e87e0993da9e", + "byte_count": 1207, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:20.538109+00:00", + "sha256": "d6066c77b929984396406f769ba2f0eee5384c3ac7273a88e257e87e0993da9e", + "byte_count": 1207, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:22.561581+00:00", + "sha256": "d1ee007e7f784e138684d8afab529cb5b4335531f892cf77e929e88a4629b8c6", + "byte_count": 1206, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-788-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12300, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-86-cd--shdw_prices_bnd_trns_const.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-86-cd/shdw_prices_bnd_trns_const", + "observed_at": "2026-09-06 00:29:24.737003+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "fromStation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "toStation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "fromStationkVFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "fromStationkVTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "toStationkVFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "toStationkVTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "CCTStatus", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "constraintIDFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintIDTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "contingencyName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "shadowPriceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "maxShadowPriceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "maxShadowPriceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "violatedMWFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "violatedMWTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "constraintID", + "label": "Constraint Id", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintName", + "label": "Constraint Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "contingencyName", + "label": "Contingency Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "shadowPrice", + "label": "Shadow Price", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "maxShadowPrice", + "label": "Max Shadow Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "limit", + "label": "Limit", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "value", + "label": "Value", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "violatedMW", + "label": "Violated MW", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "fromStation", + "label": "From Station", + "cardinality": 11, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "toStation", + "label": "To Station", + "cardinality": 12, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "fromStationkV", + "label": "From Station kV", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "toStationkV", + "label": "To Station kV", + "cardinality": 14, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "CCTStatus", + "label": "CCT Status", + "cardinality": 15, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:24.737003+00:00", + "sha256": "a56d0f58cc9348f746e2a354af30679aa7ed95259a7a9b91e5bb5aabf8c24f35", + "byte_count": 2699, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:24.737003+00:00", + "sha256": "a56d0f58cc9348f746e2a354af30679aa7ed95259a7a9b91e5bb5aabf8c24f35", + "byte_count": 2699, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:26.813785+00:00", + "sha256": "890c8e8a29b30d9f42070f7fc64b510f45ce9fb0f53755c2c6ad030b4356996c", + "byte_count": 2676, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-86-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12302, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-915-cd--sum_hdl_ldl.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-915-cd/sum_hdl_ldl", + "observed_at": "2026-09-06 00:31:41.512422+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "GTBDFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "GTBDTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "sumHDLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "sumHDLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "sumLDLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "sumLDLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "GTBD", + "label": "Generation To Be Dispatched", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "sumHDL", + "label": "Sum Of High Dispatch Limit", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "sumLDL", + "label": "Sum Of Low Dispatch Limit", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:41.512422+00:00", + "sha256": "19ed635229753d9f4b64c2ccfba8adaa692f9fc31b73049f3d7cf5492b4321ff", + "byte_count": 1258, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:41.512422+00:00", + "sha256": "19ed635229753d9f4b64c2ccfba8adaa692f9fc31b73049f3d7cf5492b4321ff", + "byte_count": 1258, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:43.653354+00:00", + "sha256": "ca557c8e50e5bddc431d8432eacc9bae9c7f17b42988a74ed4b6f54f1ca04ab8", + "byte_count": 1257, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-915-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13081, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } + }, + "np6-970-cd--rtd_lmp_node_zone_hub.json": { + "format_version": 1, + "service": "public-reports", + "path": "/np6-970-cd/rtd_lmp_node_zone_hub", + "observed_at": "2026-09-06 00:29:30.095166+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "RTDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RTDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "intervalIdFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalIdTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalEndingFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalRepeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPointType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "RTDTimestamp", + "label": "RTD Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "intervalId", + "label": "Interval Id", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalEnding", + "label": "Interval Ending", + "cardinality": 4, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalRepeatHourFlag", + "label": "Interval Repeat Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 6, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPointType", + "label": "Settlement Point Type", + "cardinality": 7, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMP", + "label": "LMP", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:30.095166+00:00", + "sha256": "349ef965fb4e01e6b92959b1bc4a61de24fbcb10f067514efdb90d7a063d6948", + "byte_count": 1836, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:30.095166+00:00", + "sha256": "349ef965fb4e01e6b92959b1bc4a61de24fbcb10f067514efdb90d7a063d6948", + "byte_count": 1836, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub?size=1&page=1&sort=RTDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:31.940579+00:00", + "sha256": "e0085a828a39ea732024407ca067d781af2c2ea2e4202c033ccd57486a6da735", + "byte_count": 1832, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-970-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13073, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } } } diff --git a/tinyercot/public/_coverage.json b/tinyercot/public/_coverage.json index 55f21107..acfd0b61 100644 --- a/tinyercot/public/_coverage.json +++ b/tinyercot/public/_coverage.json @@ -5,8 +5,8 @@ { "key": "family:DAM prices, lambda, constraints", "title": "DAM prices, lambda, constraints", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-183-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np4-188-cd", @@ -25,8 +25,8 @@ { "key": "family:RT SCED prices and constraints", "title": "RT SCED prices and constraints", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np6-787-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np6-788-cd", @@ -45,8 +45,8 @@ { "key": "family:Price corrections and investigations", "title": "Price corrections and investigations", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-196-m", "https://www.ercot.com/mp/data-products/data-product-details?id=np4-197-m", @@ -67,8 +67,8 @@ { "key": "family:Historical hub/zone and AS price files", "title": "Historical hub/zone and AS price files", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-180-er", "https://www.ercot.com/mp/data-products/data-product-details?id=np6-785-er", @@ -83,8 +83,8 @@ { "key": "family:RTD indicative prices and capacity prices", "title": "RTD indicative prices and capacity prices", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np6-970-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np6-325-cd", @@ -99,8 +99,8 @@ { "key": "family:RTC+B ancillary prices, capability, and SOG", "title": "RTC+B ancillary prices, capability, and SOG", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np6-323-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np6-324-cd", @@ -123,8 +123,8 @@ { "key": "family:Historical RT adders and RTC+B archives", "title": "Historical RT adders and RTC+B archives", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np6-792-er", "https://www.ercot.com/mp/data-products/data-product-details?id=np6-793-er", @@ -143,8 +143,8 @@ { "key": "family:DAM plans, energy totals, AS offers/demand curves", "title": "DAM plans, energy totals, AS offers/demand curves", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-33-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np4-19-cd", @@ -167,8 +167,8 @@ { "key": "family:Legacy total AS offers", "title": "Legacy total AS offers", - "status": "unavailable", - "scope": "Retired for new publication per ERCOT notice. Last data 2025-12-05 posted 2025-12-04. Current OpenAPI retains path; current EMIL omits product. Preserve import for history.", + "status": "retired", + "scope": "Retired for new publication per ERCOT notice. Last data 2025-12-05 posted 2025-12-04. Current OpenAPI retains path; current EMIL omits product. Preserve import for history. Public archive/document retrieval and available history remain active coverage work; retirement excludes only new current publication.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-179-cd" ], @@ -179,8 +179,8 @@ { "key": "family:RUC demand curves, deployment factors, constraints", "title": "RUC demand curves, deployment factors, constraints", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-213-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np4-214-cd", @@ -215,8 +215,8 @@ { "key": "family:System and zonal actual load", "title": "System and zonal actual load", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np6-345-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np6-346-cd", @@ -235,8 +235,8 @@ { "key": "family:Load forecasts", "title": "Load forecasts", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np3-565-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np3-566-cd", @@ -255,8 +255,8 @@ { "key": "family:Long hourly-load archive", "title": "Long hourly-load archive", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/gridinfo/load/load_hist" ], @@ -267,8 +267,8 @@ { "key": "family:Wind and solar actual/forecast series", "title": "Wind and solar actual/forecast series", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-732-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np4-733-cd", @@ -293,8 +293,8 @@ { "key": "family:Renewable forecast models and intra-hour forecasts", "title": "Renewable forecast models and intra-hour forecasts", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-442-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np4-443-cd", @@ -311,8 +311,8 @@ { "key": "family:Storage four-second Public Data API", "title": "Storage four-second Public Data API", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://apiexplorer.ercot.com/api-details#api=esrapi-apim-api" ], @@ -323,8 +323,8 @@ { "key": "family:Live storage, fuel mix, and generation outages", "title": "Live storage, fuel mix, and generation outages", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=gen-545-ui", "https://www.ercot.com/mp/data-products/data-product-details?id=gen-544-ui", @@ -339,8 +339,8 @@ { "key": "family:Live grid conditions, reserves, supply and demand", "title": "Live grid conditions, reserves, supply and demand", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=gen-530-ui", "https://www.ercot.com/mp/data-products/data-product-details?id=gen-518-ui", @@ -363,8 +363,8 @@ { "key": "family:Live price, weather, combined renewable displays", "title": "Live price, weather, combined renewable displays", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=gen-502-ui", "https://www.ercot.com/mp/data-products/data-product-details?id=gen-523-ui", @@ -391,8 +391,8 @@ { "key": "family:Outage capacity, unplanned outages, adequacy", "title": "Outage capacity, unplanned outages, adequacy", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np3-233-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np1-346-er", @@ -413,8 +413,8 @@ { "key": "family:DC tie schedules, flows, and state-estimator aggregates", "title": "DC tie schedules, flows, and state-estimator aggregates", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np3-765-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np6-626-cd", @@ -431,8 +431,8 @@ { "key": "family:2-day dispatch, energy curves, bids and offers", "title": "2-day dispatch, energy curves, bids and offers", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np3-906-ex", "https://www.ercot.com/mp/data-products/data-product-details?id=np3-907-ex", @@ -453,8 +453,8 @@ { "key": "family:3-day and event disclosures", "title": "3-day and event disclosures", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np3-257-ex", "https://www.ercot.com/mp/data-products/data-product-details?id=np3-914-ex", @@ -473,8 +473,8 @@ { "key": "family:60-day SCED and DAM disclosures, including ESR", "title": "60-day SCED and DAM disclosures, including ESR", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np3-965-er", "https://www.ercot.com/mp/data-products/data-product-details?id=np3-966-er" @@ -487,8 +487,8 @@ { "key": "family:COP snapshot and all updates", "title": "COP snapshot and all updates", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np1-301", "https://www.ercot.com/mp/data-products/data-product-details?id=np3-991-ex" @@ -501,8 +501,8 @@ { "key": "family:Legacy SASM disclosures", "title": "Legacy SASM disclosures", - "status": "unavailable", - "scope": "Four generated endpoints persist in current OpenAPI. New publication ended: final 2025-12-04 operating data posted 2026-02-03. EMIL still Active. Preserve history and imports.", + "status": "retired", + "scope": "Four generated endpoints persist in current OpenAPI. New publication ended: final 2025-12-04 operating data posted 2026-02-03. EMIL still Active. Preserve history and imports. Public archive/document retrieval and available history remain active coverage work; retirement excludes only new current publication.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np3-990-ex" ], @@ -513,8 +513,8 @@ { "key": "family:Settlement-point and electrical-bus mapping", "title": "Settlement-point and electrical-bus mapping", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-160-sg", "https://www.ercot.com/mp/data-products/data-product-details?id=np4-158-sg", @@ -533,8 +533,8 @@ { "key": "family:Public CRR auctions, ownership, and PTP results", "title": "Public CRR auctions, ownership, and PTP results", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np7-802-m", "https://www.ercot.com/mp/data-products/data-product-details?id=np7-803-m", @@ -557,8 +557,8 @@ { "key": "family:Scarcity, fuel cost, demand response, and integration reports", "title": "Scarcity, fuel cost, demand response, and integration reports", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-790-cd", "https://www.ercot.com/mp/data-products/data-product-details?id=np4-791-cd", @@ -589,8 +589,8 @@ { "key": "family:Load profiles, loss factors, and settlement aggregates", "title": "Load profiles, loss factors, and settlement aggregates", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=zp18-68-m", "https://www.ercot.com/mp/data-products/data-product-details?id=zp18-67-m", @@ -619,8 +619,8 @@ { "key": "family:Adequacy, planning, CDR, MORA and SARA history", "title": "Adequacy, planning, CDR, MORA and SARA history", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np3-774-m", "https://www.ercot.com/mp/data-products/data-product-details?id=np3-784-m", @@ -640,8 +640,8 @@ { "key": "family:Interconnection, resource lists and DG reports", "title": "Interconnection, resource lists and DG reports", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=pg7-201-er", "https://www.ercot.com/mp/data-products/data-product-details?id=np3-988-er", @@ -663,8 +663,8 @@ { "key": "family:Frequency events and public notices", "title": "Frequency events and public notices", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np12-261-m", "https://www.ercot.com/mp/data-products/data-product-details?id=np12-265-m", @@ -688,8 +688,8 @@ { "key": "family:Weather archive contractual boundary", "title": "Weather archive contractual boundary", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mp/data-products/data-product-details?id=np4-722-cd", "https://www.ercot.com/mktinfo/loadprofile" @@ -765,8 +765,8 @@ { "key": "family:Zonal-era and other old public collections", "title": "Zonal-era and other old public collections", - "status": "deferred", - "scope": "No current public retrieval for the whole family; selected supported subsets have separate entries.", + "status": "pending", + "scope": "Active public coverage work. Selected verified subsets have separate entries; remaining operations, documents, and available history are not yet covered.", "source_urls": [ "https://www.ercot.com/mktrules" ], diff --git a/tinyercot/public/_generated.py b/tinyercot/public/_generated.py index 058b2f85..855725e5 100644 --- a/tinyercot/public/_generated.py +++ b/tinyercot/public/_generated.py @@ -1,14 +1,14 @@ # Generated by tools/generate_public.py from pinned public field metadata. -"""Observed non-null public rows; unknown schemas fail decoding.""" +"""Observed public rows; undeclared fields and nullability fail decoding.""" -from datetime import date +from datetime import date, datetime from decimal import Decimal from pydantic import BaseModel, ConfigDict, StrictBool, StrictInt, StrictStr class DamPrice(BaseModel): - """A non-null row from the observed public field contract. + """A row from the observed public field contract. Attributes: deliveryDate: Source operating date, without an inferred timezone. @@ -37,7 +37,7 @@ class DamPrice(BaseModel): class DamCapacityPrice(BaseModel): - """A non-null row from the observed public field contract. + """A row from the observed public field contract. Attributes: deliveryDate: Source operating date, without an inferred timezone. @@ -66,7 +66,7 @@ class DamCapacityPrice(BaseModel): class RealTimePrice(BaseModel): - """A non-null row from the observed public field contract. + """A row from the observed public field contract. Attributes: deliveryDate: Source operating date, without an inferred timezone. @@ -101,7 +101,7 @@ class RealTimePrice(BaseModel): class SystemLoad(BaseModel): - """A non-null row from the observed public field contract. + """A row from the observed public field contract. Attributes: operatingDay: Source operatingDay value. @@ -148,3 +148,2138 @@ class SystemLoad(BaseModel): "total": "DOUBLE", "DSTFlag": "BOOLEAN", } + + +class Gen55CdHrlyRtLoadFcastActual(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + currentDayFcast: Source currentDayFcast value. + dayAheadFcast: Source dayAheadFcast value. + actualLoad: Source actualLoad value. + dayAheadHSL: Source dayAheadHSL value. + currentDayHSL: Source currentDayHSL value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictInt + currentDayFcast: Decimal + dayAheadFcast: Decimal + actualLoad: Decimal | None + dayAheadHSL: Decimal + currentDayHSL: Decimal | None + DSTFlag: StrictBool + + +GEN_55_CD_HRLY_RT_LOAD_FCAST_ACTUAL_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "INTEGER", + "currentDayFcast": "DOUBLE", + "dayAheadFcast": "DOUBLE", + "actualLoad": "DOUBLE", + "dayAheadHSL": "DOUBLE", + "currentDayHSL": "DOUBLE", + "DSTFlag": "BOOLEAN", +} + + +class Np1302AsObligation(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + qseName: Source qseName value. + REGUPOblAdvisory: Source REGUPOblAdvisory value. + REGDNOblAdvisory: Source REGDNOblAdvisory value. + RRSOblAdvisory: Source RRSOblAdvisory value. + NSPINOblAdvisory: Source NSPINOblAdvisory value. + ECRSOblAdvisory: Source ECRSOblAdvisory value. + REGUPOblFinal: Source REGUPOblFinal value. + REGDNOblFinal: Source REGDNOblFinal value. + RRSOblFinal: Source RRSOblFinal value. + NSPINOblFinal: Source NSPINOblFinal value. + ECRSOblFinal: Source ECRSOblFinal value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + qseName: StrictStr + REGUPOblAdvisory: Decimal + REGDNOblAdvisory: Decimal + RRSOblAdvisory: Decimal + NSPINOblAdvisory: Decimal + ECRSOblAdvisory: Decimal + REGUPOblFinal: Decimal + REGDNOblFinal: Decimal + RRSOblFinal: Decimal + NSPINOblFinal: Decimal + ECRSOblFinal: Decimal + + +NP1_302_AS_OBLIGATION_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "qseName": "VARCHAR", + "REGUPOblAdvisory": "DOUBLE", + "REGDNOblAdvisory": "DOUBLE", + "RRSOblAdvisory": "DOUBLE", + "NSPINOblAdvisory": "DOUBLE", + "ECRSOblAdvisory": "DOUBLE", + "REGUPOblFinal": "DOUBLE", + "REGDNOblFinal": "DOUBLE", + "RRSOblFinal": "DOUBLE", + "NSPINOblFinal": "DOUBLE", + "ECRSOblFinal": "DOUBLE", +} + + +class Np3161Cd7dPlusAvailResPocMargin(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + operatingDate: Source operatingDate value. + nonIRRNonPUN: Source nonIRRNonPUN value. + ESR: Source ESR value. + aggApprvdNonIRRNonPUN: Source aggApprvdNonIRRNonPUN value. + aggRcvdNonIRRNonPUN: Source aggRcvdNonIRRNonPUN value. + IRR: Source IRR value. + aggApprvdIRR: Source aggApprvdIRR value. + aggRcvdIRR: Source aggRcvdIRR value. + aggApprvdESR: Source aggApprvdESR value. + aggRcvdESR: Source aggRcvdESR value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + operatingDate: date + nonIRRNonPUN: Decimal + ESR: Decimal + aggApprvdNonIRRNonPUN: Decimal + aggRcvdNonIRRNonPUN: Decimal + IRR: Decimal + aggApprvdIRR: Decimal + aggRcvdIRR: Decimal + aggApprvdESR: Decimal + aggRcvdESR: Decimal + + +NP3_161_CD_7D_PLUS_AVAIL_RES_POC_MARGIN_FIELDS = { + "postedDatetime": "DATETIME", + "operatingDate": "DATE", + "nonIRRNonPUN": "DOUBLE", + "ESR": "DOUBLE", + "aggApprvdNonIRRNonPUN": "DOUBLE", + "aggRcvdNonIRRNonPUN": "DOUBLE", + "IRR": "DOUBLE", + "aggApprvdIRR": "DOUBLE", + "aggRcvdIRR": "DOUBLE", + "aggApprvdESR": "DOUBLE", + "aggRcvdESR": "DOUBLE", +} + + +class Np3162Cd7dAvailResPocMargin(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + operatingDate: Source operatingDate value. + hourEnding: Source hour-ending label, including 24:00. + nonIrrNonPun: Source nonIrrNonPun value. + aggApprvdNonIRRNonPUN: Source aggApprvdNonIRRNonPUN value. + aggRcvdNonIRRNonPUN: Source aggRcvdNonIRRNonPUN value. + IRR: Source IRR value. + aggApprvdIRR: Source aggApprvdIRR value. + aggRcvdIRR: Source aggRcvdIRR value. + ESR: Source ESR value. + aggApprvdESR: Source aggApprvdESR value. + aggRcvdESR: Source aggRcvdESR value. + repeatedHourFlag: Source repeatedHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + operatingDate: date + hourEnding: StrictInt + nonIrrNonPun: Decimal + aggApprvdNonIRRNonPUN: Decimal + aggRcvdNonIRRNonPUN: Decimal + IRR: Decimal + aggApprvdIRR: Decimal + aggRcvdIRR: Decimal + ESR: Decimal + aggApprvdESR: Decimal + aggRcvdESR: Decimal + repeatedHourFlag: StrictBool + + +NP3_162_CD_7D_AVAIL_RES_POC_MARGIN_FIELDS = { + "postedDatetime": "DATETIME", + "operatingDate": "DATE", + "hourEnding": "INTEGER", + "nonIrrNonPun": "DOUBLE", + "aggApprvdNonIRRNonPUN": "DOUBLE", + "aggRcvdNonIRRNonPUN": "DOUBLE", + "IRR": "DOUBLE", + "aggApprvdIRR": "DOUBLE", + "aggRcvdIRR": "DOUBLE", + "ESR": "DOUBLE", + "aggApprvdESR": "DOUBLE", + "aggRcvdESR": "DOUBLE", + "repeatedHourFlag": "BOOLEAN", +} + + +class Np3233CdHourlyResOutageCap(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + operatingDate: Source operatingDate value. + hourEnding: Source hour-ending label, including 24:00. + totalResourceMWZoneSouth: Source totalResourceMWZoneSouth value. + totalResourceMWZoneNorth: Source totalResourceMWZoneNorth value. + totalResourceMWZoneWest: Source totalResourceMWZoneWest value. + totalResourceMWZoneHouston: Source totalResourceMWZoneHouston value. + totalIRRMWZoneSouth: Source totalIRRMWZoneSouth value. + totalIRRMWZoneNorth: Source totalIRRMWZoneNorth value. + totalIRRMWZoneWest: Source totalIRRMWZoneWest value. + totalIRRMWZoneHouston: Source totalIRRMWZoneHouston value. + totalNewEquipResourceMWZoneSouth: Source totalNewEquipResourceMWZoneSouth value. + totalNewEquipResourceMWZoneNorth: Source totalNewEquipResourceMWZoneNorth value. + totalNewEquipResourceMWZoneWest: Source totalNewEquipResourceMWZoneWest value. + totalNewEquipResourceMWZoneHouston: Source totalNewEquipResourceMWZoneHouston value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + operatingDate: date + hourEnding: StrictInt + totalResourceMWZoneSouth: StrictInt + totalResourceMWZoneNorth: StrictInt + totalResourceMWZoneWest: StrictInt + totalResourceMWZoneHouston: StrictInt + totalIRRMWZoneSouth: StrictInt + totalIRRMWZoneNorth: StrictInt + totalIRRMWZoneWest: StrictInt + totalIRRMWZoneHouston: StrictInt + totalNewEquipResourceMWZoneSouth: StrictInt + totalNewEquipResourceMWZoneNorth: StrictInt + totalNewEquipResourceMWZoneWest: StrictInt + totalNewEquipResourceMWZoneHouston: StrictInt + + +NP3_233_CD_HOURLY_RES_OUTAGE_CAP_FIELDS = { + "postedDatetime": "DATETIME", + "operatingDate": "DATE", + "hourEnding": "INTEGER", + "totalResourceMWZoneSouth": "INTEGER", + "totalResourceMWZoneNorth": "INTEGER", + "totalResourceMWZoneWest": "INTEGER", + "totalResourceMWZoneHouston": "INTEGER", + "totalIRRMWZoneSouth": "INTEGER", + "totalIRRMWZoneNorth": "INTEGER", + "totalIRRMWZoneWest": "INTEGER", + "totalIRRMWZoneHouston": "INTEGER", + "totalNewEquipResourceMWZoneSouth": "INTEGER", + "totalNewEquipResourceMWZoneNorth": "INTEGER", + "totalNewEquipResourceMWZoneWest": "INTEGER", + "totalNewEquipResourceMWZoneHouston": "INTEGER", +} + + +class Np3560Cd7dLoadFcastByFzn(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + north: Source north value. + south: Source south value. + west: Source west value. + houston: Source houston value. + systemTotal: Source systemTotal value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + deliveryDate: date + hourEnding: StrictStr + north: Decimal + south: Decimal + west: Decimal + houston: Decimal + systemTotal: Decimal + DSTFlag: StrictBool + + +NP3_560_CD_7D_LOAD_FCAST_BY_FZN_FIELDS = { + "postedDatetime": "DATETIME", + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "north": "DOUBLE", + "south": "DOUBLE", + "west": "DOUBLE", + "houston": "DOUBLE", + "systemTotal": "DOUBLE", + "DSTFlag": "BOOLEAN", +} + + +class Np3561Cd7dLoadFcastByWzn(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + coast: Source coast value. + east: Source east value. + farWest: Source farWest value. + north: Source north value. + northCentral: Source northCentral value. + southCentral: Source southCentral value. + southern: Source southern value. + west: Source west value. + systemTotal: Source systemTotal value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + deliveryDate: date + hourEnding: StrictStr + coast: Decimal + east: Decimal + farWest: Decimal + north: Decimal + northCentral: Decimal + southCentral: Decimal + southern: Decimal + west: Decimal + systemTotal: Decimal + DSTFlag: StrictBool + + +NP3_561_CD_7D_LOAD_FCAST_BY_WZN_FIELDS = { + "postedDatetime": "DATETIME", + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "coast": "DOUBLE", + "east": "DOUBLE", + "farWest": "DOUBLE", + "north": "DOUBLE", + "northCentral": "DOUBLE", + "southCentral": "DOUBLE", + "southern": "DOUBLE", + "west": "DOUBLE", + "systemTotal": "DOUBLE", + "DSTFlag": "BOOLEAN", +} + + +class Np3562CdIhLoadFcastByWzn(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + intervalEnding: Source intervalEnding value. + coast: Source coast value. + east: Source east value. + farWest: Source farWest value. + north: Source north value. + northCentral: Source northCentral value. + southCentral: Source southCentral value. + southern: Source southern value. + west: Source west value. + systemTotal: Source systemTotal value. + model: Source model value. + inUseFlag: Source inUseFlag value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + intervalEnding: datetime + coast: Decimal + east: Decimal + farWest: Decimal + north: Decimal + northCentral: Decimal + southCentral: Decimal + southern: Decimal + west: Decimal + systemTotal: Decimal + model: StrictStr + inUseFlag: StrictBool + DSTFlag: StrictBool + + +NP3_562_CD_IH_LOAD_FCAST_BY_WZN_FIELDS = { + "postedDatetime": "DATETIME", + "intervalEnding": "DATETIME", + "coast": "DOUBLE", + "east": "DOUBLE", + "farWest": "DOUBLE", + "north": "DOUBLE", + "northCentral": "DOUBLE", + "southCentral": "DOUBLE", + "southern": "DOUBLE", + "west": "DOUBLE", + "systemTotal": "DOUBLE", + "model": "VARCHAR", + "inUseFlag": "BOOLEAN", + "DSTFlag": "BOOLEAN", +} + + +class Np3565CdLfByModelWeatherZone(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + coast: Source coast value. + east: Source east value. + farWest: Source farWest value. + north: Source north value. + northCentral: Source northCentral value. + southCentral: Source southCentral value. + southern: Source southern value. + west: Source west value. + systemTotal: Source systemTotal value. + model: Source model value. + inUseFlag: Source inUseFlag value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + deliveryDate: date + hourEnding: StrictStr + coast: Decimal + east: Decimal + farWest: Decimal + north: Decimal + northCentral: Decimal + southCentral: Decimal + southern: Decimal + west: Decimal + systemTotal: Decimal + model: StrictStr + inUseFlag: StrictBool + DSTFlag: StrictBool + + +NP3_565_CD_LF_BY_MODEL_WEATHER_ZONE_FIELDS = { + "postedDatetime": "DATETIME", + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "coast": "DOUBLE", + "east": "DOUBLE", + "farWest": "DOUBLE", + "north": "DOUBLE", + "northCentral": "DOUBLE", + "southCentral": "DOUBLE", + "southern": "DOUBLE", + "west": "DOUBLE", + "systemTotal": "DOUBLE", + "model": "VARCHAR", + "inUseFlag": "BOOLEAN", + "DSTFlag": "BOOLEAN", +} + + +class Np4158SgDamEssps(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + settlementPoint: Source hub, zone, or resource-node identifier. + groupIndex: Source groupIndex value. + updateTime: Source updateTime value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + deliveryDate: date + hourEnding: StrictStr + settlementPoint: StrictStr + groupIndex: StrictInt + updateTime: datetime + repeatHourFlag: StrictBool + + +NP4_158_SG_DAM_ESSPS_FIELDS = { + "postedDatetime": "DATETIME", + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "settlementPoint": "VARCHAR", + "groupIndex": "INTEGER", + "updateTime": "DATETIME", + "repeatHourFlag": "BOOLEAN", +} + + +class Np4159CdLoadDistributionFactors(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + LDFDate: Source LDFDate value. + LDFHour: Source LDFHour value. + substation: Source substation value. + distributionFactor: Source distributionFactor value. + loadId: Source loadId value. + MVARDistributionFactor: Source MVARDistributionFactor value. + MRIDLoad: Source MRIDLoad value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + LDFDate: date + LDFHour: StrictStr + substation: StrictStr + distributionFactor: Decimal + loadId: StrictStr + MVARDistributionFactor: Decimal + MRIDLoad: StrictStr + DSTFlag: StrictBool + + +NP4_159_CD_LOAD_DISTRIBUTION_FACTORS_FIELDS = { + "postedDatetime": "DATETIME", + "LDFDate": "DATE", + "LDFHour": "VARCHAR", + "substation": "VARCHAR", + "distributionFactor": "DOUBLE", + "loadId": "VARCHAR", + "MVARDistributionFactor": "DOUBLE", + "MRIDLoad": "VARCHAR", + "DSTFlag": "BOOLEAN", +} + + +class Np4183CdDamHourlyLmp(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + busName: Source busName value. + LMP: Source LMP value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + busName: StrictStr + LMP: Decimal + DSTFlag: StrictBool + + +NP4_183_CD_DAM_HOURLY_LMP_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "busName": "VARCHAR", + "LMP": "DOUBLE", + "DSTFlag": "BOOLEAN", +} + + +class Np419CdDamAggAsOfferCurve(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + ancillaryType: Source ancillary-service identifier. + price: Source price value. + quantity: Source quantity value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + ancillaryType: StrictStr + price: Decimal + quantity: Decimal + DSTFlag: StrictBool + + +NP4_19_CD_DAM_AGG_AS_OFFER_CURVE_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "ancillaryType": "VARCHAR", + "price": "DOUBLE", + "quantity": "DOUBLE", + "DSTFlag": "BOOLEAN", +} + + +class Np4191CdDamShadowPrices(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + constraintId: Source constraintId value. + constraintName: Source constraintName value. + contingencyName: Source contingencyName value. + constraintLimit: Source constraintLimit value. + constraintValue: Source constraintValue value. + violationAmount: Source violationAmount value. + shadowPrice: Source shadowPrice value. + fromStation: Source fromStation value. + toStation: Source toStation value. + fromStationkV: Source fromStationkV value. + toStationkV: Source toStationkV value. + deliveryTime: Source deliveryTime value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + constraintId: StrictInt + constraintName: StrictStr + contingencyName: StrictStr + constraintLimit: StrictInt + constraintValue: StrictInt + violationAmount: StrictInt + shadowPrice: Decimal + fromStation: StrictStr + toStation: StrictStr + fromStationkV: Decimal + toStationkV: Decimal + deliveryTime: datetime + DSTFlag: StrictBool + + +NP4_191_CD_DAM_SHADOW_PRICES_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "constraintId": "INTEGER", + "constraintName": "VARCHAR", + "contingencyName": "VARCHAR", + "constraintLimit": "INTEGER", + "constraintValue": "INTEGER", + "violationAmount": "INTEGER", + "shadowPrice": "DOUBLE", + "fromStation": "VARCHAR", + "toStation": "VARCHAR", + "fromStationkV": "DOUBLE", + "toStationkV": "DOUBLE", + "deliveryTime": "DATETIME", + "DSTFlag": "BOOLEAN", +} + + +class Np4192CdDamTotalEnergyPurchased(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + settlementPoint: Source hub, zone, or resource-node identifier. + totalDamEnergyBought: Source totalDamEnergyBought value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + settlementPoint: StrictStr + totalDamEnergyBought: Decimal + repeatHourFlag: StrictBool + + +NP4_192_CD_DAM_TOTAL_ENERGY_PURCHASED_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "settlementPoint": "VARCHAR", + "totalDamEnergyBought": "DOUBLE", + "repeatHourFlag": "BOOLEAN", +} + + +class Np4193CdTotalDamEnergySold(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + settlementPoint: Source hub, zone, or resource-node identifier. + totalDAMEnergySold: Source totalDAMEnergySold value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + settlementPoint: StrictStr + totalDAMEnergySold: Decimal + repeatHourFlag: StrictBool + + +NP4_193_CD_TOTAL_DAM_ENERGY_SOLD_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "settlementPoint": "VARCHAR", + "totalDAMEnergySold": "DOUBLE", + "repeatHourFlag": "BOOLEAN", +} + + +class Np4194CdDamPtpObligationSpResults(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + stlPnt: Source stlPnt value. + totalPtpOblAwardedSource: Source totalPtpOblAwardedSource value. + totalPtpOblAwardedSink: Source totalPtpOblAwardedSink value. + repeatedHourFlag: Source repeatedHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + stlPnt: StrictStr + totalPtpOblAwardedSource: Decimal + totalPtpOblAwardedSink: Decimal + repeatedHourFlag: StrictBool + + +NP4_194_CD_DAM_PTP_OBLIGATION_SP_RESULTS_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "stlPnt": "VARCHAR", + "totalPtpOblAwardedSource": "DOUBLE", + "totalPtpOblAwardedSink": "DOUBLE", + "repeatedHourFlag": "BOOLEAN", +} + + +class Np4196MDamPriceCorrectionsEblmp(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + electricalBus: Source electricalBus value. + LMPOriginal: Source LMPOriginal value. + LMPCorrected: Source LMPCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + electricalBus: StrictStr + LMPOriginal: Decimal + LMPCorrected: Decimal + priceCorrectionTime: datetime + DSTFlag: StrictBool + + +NP4_196_M_DAM_PRICE_CORRECTIONS_EBLMP_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "electricalBus": "VARCHAR", + "LMPOriginal": "DOUBLE", + "LMPCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "DSTFlag": "BOOLEAN", +} + + +class Np4196MDamPriceCorrectionsMcpc(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + ASType: Source ASType value. + MCPCOriginal: Source MCPCOriginal value. + MCPCCorrected: Source MCPCCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + ASType: StrictStr + MCPCOriginal: Decimal + MCPCCorrected: Decimal + priceCorrectionTime: datetime + DSTFlag: StrictBool + + +NP4_196_M_DAM_PRICE_CORRECTIONS_MCPC_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "ASType": "VARCHAR", + "MCPCOriginal": "DOUBLE", + "MCPCCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "DSTFlag": "BOOLEAN", +} + + +class Np4196MDamPriceCorrectionsSpp(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + settlementPoint: Source hub, zone, or resource-node identifier. + SPPOriginal: Source SPPOriginal value. + SPPCorrected: Source SPPCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + settlementPoint: StrictStr + SPPOriginal: Decimal + SPPCorrected: Decimal + priceCorrectionTime: datetime + DSTFlag: StrictBool + + +NP4_196_M_DAM_PRICE_CORRECTIONS_SPP_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "settlementPoint": "VARCHAR", + "SPPOriginal": "DOUBLE", + "SPPCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "DSTFlag": "BOOLEAN", +} + + +class Np4197MRtmPriceCorrectionsEblmp(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + electricalBus: Source electricalBus value. + cappedLMPOriginal: Source cappedLMPOriginal value. + uncappedLMPOriginal: Source uncappedLMPOriginal value. + cappedLMPCorrected: Source cappedLMPCorrected value. + uncappedLMPCorrected: Source uncappedLMPCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + repeatedHourFlag: Source repeatedHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + electricalBus: StrictStr + cappedLMPOriginal: Decimal + uncappedLMPOriginal: Decimal | None + cappedLMPCorrected: Decimal + uncappedLMPCorrected: Decimal | None + priceCorrectionTime: datetime + repeatedHourFlag: StrictBool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_EBLMP_FIELDS = { + "SCEDTimestamp": "DATETIME", + "electricalBus": "VARCHAR", + "cappedLMPOriginal": "DOUBLE", + "uncappedLMPOriginal": "DOUBLE", + "cappedLMPCorrected": "DOUBLE", + "uncappedLMPCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "repeatedHourFlag": "BOOLEAN", +} + + +class Np4197MRtmPriceCorrectionsMcpcSced(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + ASType: Source ASType value. + cappedMCPCOriginal: Source cappedMCPCOriginal value. + uncappedMCPCOriginal: Source uncappedMCPCOriginal value. + cappedMCPCCorrected: Source cappedMCPCCorrected value. + uncappedMCPCCorrected: Source uncappedMCPCCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + repeatedHourFlag: Source repeatedHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + ASType: StrictStr + cappedMCPCOriginal: Decimal + uncappedMCPCOriginal: Decimal | None + cappedMCPCCorrected: Decimal + uncappedMCPCCorrected: Decimal | None + priceCorrectionTime: datetime + repeatedHourFlag: StrictBool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SCED_FIELDS = { + "SCEDTimestamp": "DATETIME", + "ASType": "VARCHAR", + "cappedMCPCOriginal": "DOUBLE", + "uncappedMCPCOriginal": "DOUBLE", + "cappedMCPCCorrected": "DOUBLE", + "uncappedMCPCCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "repeatedHourFlag": "BOOLEAN", +} + + +class Np4197MRtmPriceCorrectionsMcpcSpp(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + deliveryInterval: Source deliveryInterval value. + ASType: Source ASType value. + MCPCOriginal: Source MCPCOriginal value. + MCPCCorrected: Source MCPCCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + deliveryInterval: StrictInt + ASType: StrictStr + MCPCOriginal: Decimal + MCPCCorrected: Decimal + priceCorrectionTime: datetime + repeatHourFlag: StrictBool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SPP_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "deliveryInterval": "INTEGER", + "ASType": "VARCHAR", + "MCPCOriginal": "DOUBLE", + "MCPCCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "repeatHourFlag": "BOOLEAN", +} + + +class Np4197MRtmPriceCorrectionsShadow(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + constraintId: Source constraintId value. + constraintName: Source constraintName value. + contingencyName: Source contingencyName value. + shadowPriceOriginal: Source shadowPriceOriginal value. + shadowPriceCorrected: Source shadowPriceCorrected value. + limitOriginal: Source limitOriginal value. + limitCorrected: Source limitCorrected value. + valueOriginal: Source valueOriginal value. + valueCorrected: Source valueCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + constraintId: StrictInt + constraintName: StrictStr + contingencyName: StrictStr + shadowPriceOriginal: Decimal + shadowPriceCorrected: Decimal + limitOriginal: Decimal + limitCorrected: Decimal + valueOriginal: Decimal + valueCorrected: Decimal + priceCorrectionTime: datetime + DSTFlag: StrictBool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SHADOW_FIELDS = { + "SCEDTimestamp": "DATETIME", + "constraintId": "INTEGER", + "constraintName": "VARCHAR", + "contingencyName": "VARCHAR", + "shadowPriceOriginal": "DOUBLE", + "shadowPriceCorrected": "DOUBLE", + "limitOriginal": "DOUBLE", + "limitCorrected": "DOUBLE", + "valueOriginal": "DOUBLE", + "valueCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "DSTFlag": "BOOLEAN", +} + + +class Np4197MRtmPriceCorrectionsSoglmp(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + resourceType: Source resourceType value. + resourceName: Source resourceName value. + meterName: Source meterName value. + meterLMPOriginal: Source meterLMPOriginal value. + meterLMPCorrected: Source meterLMPCorrected value. + RTRDPAOriginal: Source RTRDPAOriginal value. + RTRDPACorrected: Source RTRDPACorrected value. + finalLMPOriginal: Source finalLMPOriginal value. + finalLMPCorrected: Source finalLMPCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + repeatHourFlag: Source repeatHourFlag value. + RTORPAOriginal: Source RTORPAOriginal value. + RTORPACorrected: Source RTORPACorrected value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + resourceType: StrictStr + resourceName: StrictStr + meterName: StrictStr + meterLMPOriginal: Decimal + meterLMPCorrected: Decimal + RTRDPAOriginal: Decimal + RTRDPACorrected: Decimal + finalLMPOriginal: Decimal + finalLMPCorrected: Decimal + priceCorrectionTime: datetime + repeatHourFlag: StrictBool + RTORPAOriginal: Decimal | None + RTORPACorrected: Decimal | None + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SOGLMP_FIELDS = { + "SCEDTimestamp": "DATETIME", + "resourceType": "VARCHAR", + "resourceName": "VARCHAR", + "meterName": "VARCHAR", + "meterLMPOriginal": "DOUBLE", + "meterLMPCorrected": "DOUBLE", + "RTRDPAOriginal": "DOUBLE", + "RTRDPACorrected": "DOUBLE", + "finalLMPOriginal": "DOUBLE", + "finalLMPCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "RTORPAOriginal": "DOUBLE", + "RTORPACorrected": "DOUBLE", +} + + +class Np4197MRtmPriceCorrectionsSogprice(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + deliveryInterval: Source deliveryInterval value. + resourceType: Source resourceType value. + resourceName: Source resourceName value. + meterName: Source meterName value. + priceOriginal: Source priceOriginal value. + priceCorrected: Source priceCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + deliveryInterval: StrictInt + resourceType: StrictStr + resourceName: StrictStr + meterName: StrictStr + priceOriginal: Decimal + priceCorrected: Decimal + priceCorrectionTime: datetime + DSTFlag: StrictBool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SOGPRICE_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "deliveryInterval": "INTEGER", + "resourceType": "VARCHAR", + "resourceName": "VARCHAR", + "meterName": "VARCHAR", + "priceOriginal": "DOUBLE", + "priceCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "DSTFlag": "BOOLEAN", +} + + +class Np4197MRtmPriceCorrectionsSplmp(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + settlementPointName: Source settlementPointName value. + LMPOriginal: Source LMPOriginal value. + LMPCorrected: Source LMPCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + settlementPointName: StrictStr + LMPOriginal: Decimal + LMPCorrected: Decimal + priceCorrectionTime: datetime + DSTFlag: StrictBool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SPLMP_FIELDS = { + "SCEDTimestamp": "DATETIME", + "settlementPointName": "VARCHAR", + "LMPOriginal": "DOUBLE", + "LMPCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "DSTFlag": "BOOLEAN", +} + + +class Np4197MRtmPriceCorrectionsSpp(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + deliveryInterval: Source deliveryInterval value. + settlementPointName: Source settlementPointName value. + settlementPointType: Source settlementPointType value. + SPPOriginal: Source SPPOriginal value. + SPPCorrected: Source SPPCorrected value. + priceCorrectionTime: Source priceCorrectionTime value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + deliveryInterval: StrictInt + settlementPointName: StrictStr + settlementPointType: StrictStr + SPPOriginal: Decimal + SPPCorrected: Decimal + priceCorrectionTime: datetime + DSTFlag: StrictBool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SPP_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "deliveryInterval": "INTEGER", + "settlementPointName": "VARCHAR", + "settlementPointType": "VARCHAR", + "SPPOriginal": "DOUBLE", + "SPPCorrected": "DOUBLE", + "priceCorrectionTime": "DATETIME", + "DSTFlag": "BOOLEAN", +} + + +class Np4200CdDamDeEnergizedSpbc(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + settlementPoint: Source hub, zone, or resource-node identifier. + repeatedHourFlag: Source repeatedHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + settlementPoint: StrictStr + repeatedHourFlag: StrictBool + + +NP4_200_CD_DAM_DE_ENERGIZED_SPBC_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "settlementPoint": "VARCHAR", + "repeatedHourFlag": "BOOLEAN", +} + + +class Np4212CdDamScedAsDemandCurves(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + ASType: Source ASType value. + demandCurvePoint: Source demandCurvePoint value. + quantity: Source quantity value. + price: Source price value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + deliveryDate: date + hourEnding: StrictStr + ASType: StrictStr + demandCurvePoint: Decimal + quantity: Decimal + price: Decimal + repeatHourFlag: StrictBool + + +NP4_212_CD_DAM_SCED_AS_DEMAND_CURVES_FIELDS = { + "postedDatetime": "DATETIME", + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "ASType": "VARCHAR", + "demandCurvePoint": "DOUBLE", + "quantity": "DOUBLE", + "price": "DOUBLE", + "repeatHourFlag": "BOOLEAN", +} + + +class Np4213CdHrucAsDemandCurves(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + RUCTimestamp: Source RUCTimestamp value. + ASType: Source ASType value. + demandCurvePoint: Source demandCurvePoint value. + quantity: Source quantity value. + price: Source price value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + RUCTimestamp: datetime + ASType: StrictStr + demandCurvePoint: Decimal + quantity: Decimal + price: Decimal + repeatHourFlag: StrictBool + + +NP4_213_CD_HRUC_AS_DEMAND_CURVES_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "RUCTimestamp": "DATETIME", + "ASType": "VARCHAR", + "demandCurvePoint": "DOUBLE", + "quantity": "DOUBLE", + "price": "DOUBLE", + "repeatHourFlag": "BOOLEAN", +} + + +class Np4214CdDrucAsDemandCurves(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + RUCTimestamp: Source RUCTimestamp value. + ASType: Source ASType value. + demandCurvePoint: Source demandCurvePoint value. + quantity: Source quantity value. + price: Source price value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + RUCTimestamp: datetime + ASType: StrictStr + demandCurvePoint: Decimal + quantity: Decimal + price: Decimal + repeatHourFlag: StrictBool + + +NP4_214_CD_DRUC_AS_DEMAND_CURVES_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "RUCTimestamp": "DATETIME", + "ASType": "VARCHAR", + "demandCurvePoint": "DOUBLE", + "quantity": "DOUBLE", + "price": "DOUBLE", + "repeatHourFlag": "BOOLEAN", +} + + +class Np4215CdWrucAsDemandCurves(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + RUCTimestamp: Source RUCTimestamp value. + ASType: Source ASType value. + demandCurvePoint: Source demandCurvePoint value. + quantity: Source quantity value. + price: Source price value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + deliveryDate: date + hourEnding: StrictStr + RUCTimestamp: datetime + ASType: StrictStr + demandCurvePoint: Decimal + quantity: Decimal + price: Decimal + repeatHourFlag: StrictBool + + +NP4_215_CD_WRUC_AS_DEMAND_CURVES_FIELDS = { + "postedDatetime": "DATETIME", + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "RUCTimestamp": "DATETIME", + "ASType": "VARCHAR", + "demandCurvePoint": "DOUBLE", + "quantity": "DOUBLE", + "price": "DOUBLE", + "repeatHourFlag": "BOOLEAN", +} + + +class Np4231CdElectricalBusMapHeurPrice(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + marketType: Source marketType value. + fromEBName: Source fromEBName value. + toEBName: Source toEBName value. + type: Source type value. + priority: Source priority value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + marketType: StrictStr + fromEBName: StrictStr + toEBName: StrictStr + type: StrictStr + priority: Decimal + + +NP4_231_CD_ELECTRICAL_BUS_MAP_HEUR_PRICE_FIELDS = { + "postedDatetime": "DATETIME", + "marketType": "VARCHAR", + "fromEBName": "VARCHAR", + "toEBName": "VARCHAR", + "type": "VARCHAR", + "priority": "DOUBLE", +} + + +class Np433CdDamAsPlan(BaseModel): + """A row from the observed public field contract. + + Attributes: + postedDatetime: Source postedDatetime value. + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + ancillaryType: Source ancillary-service identifier. + quantity: Source quantity value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + postedDatetime: datetime + deliveryDate: date + hourEnding: StrictStr + ancillaryType: StrictStr + quantity: StrictInt + DSTFlag: StrictBool + + +NP4_33_CD_DAM_AS_PLAN_FIELDS = { + "postedDatetime": "DATETIME", + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "ancillaryType": "VARCHAR", + "quantity": "INTEGER", + "DSTFlag": "BOOLEAN", +} + + +class Np4523CdDamSystemLambda(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + hourEnding: Source hour-ending label, including 24:00. + systemLambda: Source systemLambda value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + hourEnding: StrictStr + systemLambda: Decimal + DSTFlag: StrictBool + + +NP4_523_CD_DAM_SYSTEM_LAMBDA_FIELDS = { + "deliveryDate": "DATE", + "hourEnding": "VARCHAR", + "systemLambda": "DOUBLE", + "DSTFlag": "BOOLEAN", +} + + +class Np6322CdScedSystemLambda(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatedHourFlag: Source repeatedHourFlag value. + cappedSystemLambda: Source cappedSystemLambda value. + uncappedSystemLambda: Source uncappedSystemLambda value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatedHourFlag: StrictBool + cappedSystemLambda: Decimal + uncappedSystemLambda: Decimal | None + + +NP6_322_CD_SCED_SYSTEM_LAMBDA_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatedHourFlag": "BOOLEAN", + "cappedSystemLambda": "DOUBLE", + "uncappedSystemLambda": "DOUBLE", +} + + +class Np6323CdRtPriceAdderSced(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatHourFlag: Source repeatHourFlag value. + systemLambda: Source systemLambda value. + RTRDPA: Source RTRDPA value. + RTRDPARUS: Source RTRDPARUS value. + RTRDPARDS: Source RTRDPARDS value. + RTRDPARRS: Source RTRDPARRS value. + RTRDPAECRS: Source RTRDPAECRS value. + RTRDPANSS: Source RTRDPANSS value. + RTRRUC: Source RTRRUC value. + RTRRMR: Source RTRRMR value. + RTDNCLR: Source RTDNCLR value. + RTDERS: Source RTDERS value. + RTDCTIEIMPORT: Source RTDCTIEIMPORT value. + RTDCTIEEXPORT: Source RTDCTIEEXPORT value. + RTBLTIMPORT: Source RTBLTIMPORT value. + RTBLTEXPORT: Source RTBLTEXPORT value. + RTOLLSL: Source RTOLLSL value. + RTOLHSL: Source RTOLHSL value. + RTDLL: Source RTDLL value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatHourFlag: StrictBool + systemLambda: Decimal + RTRDPA: Decimal + RTRDPARUS: Decimal + RTRDPARDS: Decimal + RTRDPARRS: Decimal + RTRDPAECRS: Decimal + RTRDPANSS: Decimal + RTRRUC: Decimal + RTRRMR: Decimal + RTDNCLR: Decimal + RTDERS: Decimal + RTDCTIEIMPORT: Decimal + RTDCTIEEXPORT: Decimal + RTBLTIMPORT: Decimal + RTBLTEXPORT: Decimal + RTOLLSL: Decimal + RTOLHSL: Decimal + RTDLL: Decimal | None + + +NP6_323_CD_RT_PRICE_ADDER_SCED_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "systemLambda": "DOUBLE", + "RTRDPA": "DOUBLE", + "RTRDPARUS": "DOUBLE", + "RTRDPARDS": "DOUBLE", + "RTRDPARRS": "DOUBLE", + "RTRDPAECRS": "DOUBLE", + "RTRDPANSS": "DOUBLE", + "RTRRUC": "DOUBLE", + "RTRRMR": "DOUBLE", + "RTDNCLR": "DOUBLE", + "RTDERS": "DOUBLE", + "RTDCTIEIMPORT": "DOUBLE", + "RTDCTIEEXPORT": "DOUBLE", + "RTBLTIMPORT": "DOUBLE", + "RTBLTEXPORT": "DOUBLE", + "RTOLLSL": "DOUBLE", + "RTOLHSL": "DOUBLE", + "RTDLL": "DOUBLE", +} + + +class Np6324CdRt15minPriceAdders(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + deliveryInterval: Source deliveryInterval value. + RTRDPA: Source RTRDPA value. + RTRDPRU: Source RTRDPRU value. + RTRDPRD: Source RTRDPRD value. + RTRDPRRS: Source RTRDPRRS value. + RTRDPECRS: Source RTRDPECRS value. + RTRDPNS: Source RTRDPNS value. + repeatHourFlag: Source repeatHourFlag value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + deliveryInterval: StrictInt + RTRDPA: Decimal + RTRDPRU: Decimal + RTRDPRD: Decimal + RTRDPRRS: Decimal + RTRDPECRS: Decimal + RTRDPNS: Decimal + repeatHourFlag: StrictBool + + +NP6_324_CD_RT_15MIN_PRICE_ADDERS_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "deliveryInterval": "INTEGER", + "RTRDPA": "DOUBLE", + "RTRDPRU": "DOUBLE", + "RTRDPRD": "DOUBLE", + "RTRDPRRS": "DOUBLE", + "RTRDPECRS": "DOUBLE", + "RTRDPNS": "DOUBLE", + "repeatHourFlag": "BOOLEAN", +} + + +class Np6325CdRtdPriceAdders(BaseModel): + """A row from the observed public field contract. + + Attributes: + RTDTimestamp: Source RTDTimestamp value. + repeatHourFlag: Source repeatHourFlag value. + intervalID: Source intervalID value. + intervalEnding: Source intervalEnding value. + IERepeatHourFlag: Source IERepeatHourFlag value. + systemLambda: Source systemLambda value. + RTRDPA: Source RTRDPA value. + RTRDPARUS: Source RTRDPARUS value. + RTRDPARDS: Source RTRDPARDS value. + RTRDPARRS: Source RTRDPARRS value. + RTRDPAECRS: Source RTRDPAECRS value. + RTRDPANSS: Source RTRDPANSS value. + RTRRUC: Source RTRRUC value. + RTRRMR: Source RTRRMR value. + RTDNCLR: Source RTDNCLR value. + RTDERS: Source RTDERS value. + RTDCTIEImport: Source RTDCTIEImport value. + RTDCTIEExport: Source RTDCTIEExport value. + RTBLTImport: Source RTBLTImport value. + RTBLTExport: Source RTBLTExport value. + RTOLLSL: Source RTOLLSL value. + RTOLHSL: Source RTOLHSL value. + RTDLL: Source RTDLL value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + RTDTimestamp: datetime + repeatHourFlag: StrictBool + intervalID: StrictInt + intervalEnding: datetime + IERepeatHourFlag: StrictBool + systemLambda: Decimal + RTRDPA: Decimal + RTRDPARUS: Decimal + RTRDPARDS: Decimal + RTRDPARRS: Decimal + RTRDPAECRS: Decimal + RTRDPANSS: Decimal + RTRRUC: Decimal + RTRRMR: Decimal + RTDNCLR: Decimal + RTDERS: Decimal + RTDCTIEImport: Decimal + RTDCTIEExport: Decimal + RTBLTImport: Decimal + RTBLTExport: Decimal + RTOLLSL: Decimal + RTOLHSL: Decimal + RTDLL: Decimal | None + + +NP6_325_CD_RTD_PRICE_ADDERS_FIELDS = { + "RTDTimestamp": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "intervalID": "INTEGER", + "intervalEnding": "DATETIME", + "IERepeatHourFlag": "BOOLEAN", + "systemLambda": "DOUBLE", + "RTRDPA": "DOUBLE", + "RTRDPARUS": "DOUBLE", + "RTRDPARDS": "DOUBLE", + "RTRDPARRS": "DOUBLE", + "RTRDPAECRS": "DOUBLE", + "RTRDPANSS": "DOUBLE", + "RTRRUC": "DOUBLE", + "RTRRMR": "DOUBLE", + "RTDNCLR": "DOUBLE", + "RTDERS": "DOUBLE", + "RTDCTIEImport": "DOUBLE", + "RTDCTIEExport": "DOUBLE", + "RTBLTImport": "DOUBLE", + "RTBLTExport": "DOUBLE", + "RTOLLSL": "DOUBLE", + "RTOLHSL": "DOUBLE", + "RTDLL": "DOUBLE", +} + + +class Np6326CdRtPriceSog(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + deliveryInterval: Source deliveryInterval value. + resourceType: Source resourceType value. + resourceName: Source resourceName value. + meterName: Source meterName value. + meterPrice: Source meterPrice value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + deliveryInterval: StrictInt + resourceType: StrictStr + resourceName: StrictStr + meterName: StrictStr + meterPrice: Decimal + DSTFlag: StrictBool + + +NP6_326_CD_RT_PRICE_SOG_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "deliveryInterval": "INTEGER", + "resourceType": "VARCHAR", + "resourceName": "VARCHAR", + "meterName": "VARCHAR", + "meterPrice": "DOUBLE", + "DSTFlag": "BOOLEAN", +} + + +class Np6327CdLmpSogPriceAdders(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatHourFlag: Source repeatHourFlag value. + resourceType: Source resourceType value. + resourceName: Source resourceName value. + stationName: Source stationName value. + voltageLevel: Source voltageLevel value. + meterName: Source meterName value. + meterLMP: Source meterLMP value. + RTRDPA: Source RTRDPA value. + finalLMP: Source finalLMP value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatHourFlag: StrictBool + resourceType: StrictStr + resourceName: StrictStr + stationName: StrictStr + voltageLevel: Decimal + meterName: StrictStr + meterLMP: Decimal + RTRDPA: Decimal + finalLMP: Decimal + + +NP6_327_CD_LMP_SOG_PRICE_ADDERS_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "resourceType": "VARCHAR", + "resourceName": "VARCHAR", + "stationName": "VARCHAR", + "voltageLevel": "DOUBLE", + "meterName": "VARCHAR", + "meterLMP": "DOUBLE", + "RTRDPA": "DOUBLE", + "finalLMP": "DOUBLE", +} + + +class Np6328CdTotAsResCap(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatHourFlag: Source repeatHourFlag value. + capREGUP: Source capREGUP value. + capREGDN: Source capREGDN value. + capRRS: Source capRRS value. + capECRS: Source capECRS value. + capNSPIN: Source capNSPIN value. + capREGUPRRS: Source capREGUPRRS value. + capREGUPRRSECRS: Source capREGUPRRSECRS value. + capREGUPRRSECRSNSPIN: Source capREGUPRRSECRSNSPIN value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatHourFlag: StrictBool + capREGUP: Decimal + capREGDN: Decimal + capRRS: Decimal + capECRS: Decimal + capNSPIN: Decimal + capREGUPRRS: Decimal + capREGUPRRSECRS: Decimal + capREGUPRRSECRSNSPIN: Decimal + + +NP6_328_CD_TOT_AS_RES_CAP_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "capREGUP": "DOUBLE", + "capREGDN": "DOUBLE", + "capRRS": "DOUBLE", + "capECRS": "DOUBLE", + "capNSPIN": "DOUBLE", + "capREGUPRRS": "DOUBLE", + "capREGUPRRSECRS": "DOUBLE", + "capREGUPRRSECRSNSPIN": "DOUBLE", +} + + +class Np6329CdRtdIndMcpc(BaseModel): + """A row from the observed public field contract. + + Attributes: + RTDTimestamp: Source RTDTimestamp value. + repeatHourFlag: Source repeatHourFlag value. + intervalId: Source intervalId value. + intervalEnding: Source intervalEnding value. + intervalRepeatHourFlag: Source intervalRepeatHourFlag value. + REGUP: Source REGUP value. + REGDN: Source REGDN value. + RRS: Source RRS value. + ECRS: Source ECRS value. + NSPIN: Source NSPIN value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + RTDTimestamp: datetime + repeatHourFlag: StrictBool + intervalId: StrictInt + intervalEnding: datetime + intervalRepeatHourFlag: StrictBool + REGUP: Decimal + REGDN: Decimal + RRS: Decimal + ECRS: Decimal + NSPIN: Decimal + + +NP6_329_CD_RTD_IND_MCPC_FIELDS = { + "RTDTimestamp": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "intervalId": "INTEGER", + "intervalEnding": "DATETIME", + "intervalRepeatHourFlag": "BOOLEAN", + "REGUP": "DOUBLE", + "REGDN": "DOUBLE", + "RRS": "DOUBLE", + "ECRS": "DOUBLE", + "NSPIN": "DOUBLE", +} + + +class Np6331CdRtClearPriceCap(BaseModel): + """A row from the observed public field contract. + + Attributes: + deliveryDate: Source operating date, without an inferred timezone. + deliveryHour: Source deliveryHour value. + deliveryInt: Source deliveryInt value. + repeatHourFlag: Source repeatHourFlag value. + ASType: Source ASType value. + MCPC: Decimal source capacity clearing price. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + deliveryDate: date + deliveryHour: StrictInt + deliveryInt: StrictInt + repeatHourFlag: StrictBool + ASType: StrictStr + MCPC: Decimal + + +NP6_331_CD_RT_CLEAR_PRICE_CAP_FIELDS = { + "deliveryDate": "DATE", + "deliveryHour": "INTEGER", + "deliveryInt": "INTEGER", + "repeatHourFlag": "BOOLEAN", + "ASType": "VARCHAR", + "MCPC": "DOUBLE", +} + + +class Np6332CdRtClearPriceCapSced(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatedHourFlag: Source repeatedHourFlag value. + ASType: Source ASType value. + cappedMCPC: Source cappedMCPC value. + uncappedMCPC: Source uncappedMCPC value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatedHourFlag: StrictBool + ASType: StrictStr + cappedMCPC: Decimal + uncappedMCPC: Decimal | None + + +NP6_332_CD_RT_CLEAR_PRICE_CAP_SCED_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatedHourFlag": "BOOLEAN", + "ASType": "VARCHAR", + "cappedMCPC": "DOUBLE", + "uncappedMCPC": "DOUBLE", +} + + +class Np6346CdActSysLoadByFzn(BaseModel): + """A row from the observed public field contract. + + Attributes: + operatingDay: Source operatingDay value. + hourEnding: Source hour-ending label, including 24:00. + north: Source north value. + south: Source south value. + west: Source west value. + houston: Source houston value. + total: Source total value. + DSTFlag: Raw source flag; no repeated-hour meaning is inferred. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + operatingDay: date + hourEnding: StrictStr + north: Decimal + south: Decimal + west: Decimal + houston: Decimal + total: Decimal + DSTFlag: StrictBool + + +NP6_346_CD_ACT_SYS_LOAD_BY_FZN_FIELDS = { + "operatingDay": "DATE", + "hourEnding": "VARCHAR", + "north": "DOUBLE", + "south": "DOUBLE", + "west": "DOUBLE", + "houston": "DOUBLE", + "total": "DOUBLE", + "DSTFlag": "BOOLEAN", +} + + +class Np6787CdLmpElectricalBus(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatedHourFlag: Source repeatedHourFlag value. + electricalBus: Source electricalBus value. + cappedLMP: Source cappedLMP value. + uncappedLMP: Source uncappedLMP value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatedHourFlag: StrictBool + electricalBus: StrictStr + cappedLMP: Decimal + uncappedLMP: Decimal + + +NP6_787_CD_LMP_ELECTRICAL_BUS_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatedHourFlag": "BOOLEAN", + "electricalBus": "VARCHAR", + "cappedLMP": "DOUBLE", + "uncappedLMP": "DOUBLE", +} + + +class Np6788CdLmpNodeZoneHub(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatHourFlag: Source repeatHourFlag value. + settlementPoint: Source hub, zone, or resource-node identifier. + LMP: Source LMP value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatHourFlag: StrictBool + settlementPoint: StrictStr + LMP: Decimal + + +NP6_788_CD_LMP_NODE_ZONE_HUB_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "settlementPoint": "VARCHAR", + "LMP": "DOUBLE", +} + + +class Np686CdShdwPricesBndTrnsConst(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatedHourFlag: Source repeatedHourFlag value. + constraintID: Source constraintID value. + constraintName: Source constraintName value. + contingencyName: Source contingencyName value. + shadowPrice: Source shadowPrice value. + maxShadowPrice: Source maxShadowPrice value. + limit: Source limit value. + value: Source value value. + violatedMW: Source violatedMW value. + fromStation: Source fromStation value. + toStation: Source toStation value. + fromStationkV: Source fromStationkV value. + toStationkV: Source toStationkV value. + CCTStatus: Source CCTStatus value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatedHourFlag: StrictBool + constraintID: StrictInt + constraintName: StrictStr + contingencyName: StrictStr + shadowPrice: Decimal + maxShadowPrice: Decimal + limit: Decimal + value: Decimal + violatedMW: Decimal + fromStation: StrictStr + toStation: StrictStr + fromStationkV: Decimal + toStationkV: Decimal + CCTStatus: StrictStr + + +NP6_86_CD_SHDW_PRICES_BND_TRNS_CONST_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatedHourFlag": "BOOLEAN", + "constraintID": "INTEGER", + "constraintName": "VARCHAR", + "contingencyName": "VARCHAR", + "shadowPrice": "DOUBLE", + "maxShadowPrice": "DOUBLE", + "limit": "DOUBLE", + "value": "DOUBLE", + "violatedMW": "DOUBLE", + "fromStation": "VARCHAR", + "toStation": "VARCHAR", + "fromStationkV": "DOUBLE", + "toStationkV": "DOUBLE", + "CCTStatus": "VARCHAR", +} + + +class Np6915CdSumHdlLdl(BaseModel): + """A row from the observed public field contract. + + Attributes: + SCEDTimestamp: Source SCEDTimestamp value. + repeatHourFlag: Source repeatHourFlag value. + GTBD: Source GTBD value. + sumHDL: Source sumHDL value. + sumLDL: Source sumLDL value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + SCEDTimestamp: datetime + repeatHourFlag: StrictBool + GTBD: Decimal + sumHDL: Decimal + sumLDL: Decimal + + +NP6_915_CD_SUM_HDL_LDL_FIELDS = { + "SCEDTimestamp": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "GTBD": "DOUBLE", + "sumHDL": "DOUBLE", + "sumLDL": "DOUBLE", +} + + +class Np6970CdRtdLmpNodeZoneHub(BaseModel): + """A row from the observed public field contract. + + Attributes: + RTDTimestamp: Source RTDTimestamp value. + repeatHourFlag: Source repeatHourFlag value. + intervalId: Source intervalId value. + intervalEnding: Source intervalEnding value. + intervalRepeatHourFlag: Source intervalRepeatHourFlag value. + settlementPoint: Source hub, zone, or resource-node identifier. + settlementPointType: Source settlementPointType value. + LMP: Source LMP value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + + RTDTimestamp: datetime + repeatHourFlag: StrictBool + intervalId: StrictInt + intervalEnding: datetime + intervalRepeatHourFlag: StrictBool + settlementPoint: StrictStr + settlementPointType: StrictStr + LMP: Decimal + + +NP6_970_CD_RTD_LMP_NODE_ZONE_HUB_FIELDS = { + "RTDTimestamp": "DATETIME", + "repeatHourFlag": "BOOLEAN", + "intervalId": "INTEGER", + "intervalEnding": "DATETIME", + "intervalRepeatHourFlag": "BOOLEAN", + "settlementPoint": "VARCHAR", + "settlementPointType": "VARCHAR", + "LMP": "DOUBLE", +} diff --git a/tinyercot/public/_http.py b/tinyercot/public/_http.py index 89121b09..21cd6f03 100644 --- a/tinyercot/public/_http.py +++ b/tinyercot/public/_http.py @@ -241,6 +241,7 @@ def request( params: dict | None = None, headers: dict | None = None, data: dict | None = None, + json_body: dict | None = None, authentication: bool = False, ) -> Payload: """Fetch within limits without retaining sensitive HTTP error objects. @@ -251,6 +252,7 @@ def request( params: Public query parameters only. headers: Authentication headers, when needed. data: Form-encoded auth fields; never placed in a URL or receipt. + json_body: Explicit public archive document selection for a POST. authentication: Whether to suppress auth payload provenance. Returns: @@ -272,6 +274,7 @@ def request( params=params, headers=headers, data=data, + json=json_body, follow_redirects=False, ) as response: status = response.status_code diff --git a/tinyercot/public/_schemas.py b/tinyercot/public/_schemas.py index 6369f236..92835ee8 100644 --- a/tinyercot/public/_schemas.py +++ b/tinyercot/public/_schemas.py @@ -1,13 +1,65 @@ # Generated by tools/generate_public.py; do not edit. """Verified public operation identities and complete query filter types.""" -from datetime import date +from datetime import date, datetime from decimal import Decimal from typing import TypedDict from ._generated import ( DamCapacityPrice, DamPrice, + Gen55CdHrlyRtLoadFcastActual, + Np419CdDamAggAsOfferCurve, + Np433CdDamAsPlan, + Np686CdShdwPricesBndTrnsConst, + Np1302AsObligation, + Np3161Cd7dPlusAvailResPocMargin, + Np3162Cd7dAvailResPocMargin, + Np3233CdHourlyResOutageCap, + Np3560Cd7dLoadFcastByFzn, + Np3561Cd7dLoadFcastByWzn, + Np3562CdIhLoadFcastByWzn, + Np3565CdLfByModelWeatherZone, + Np4158SgDamEssps, + Np4159CdLoadDistributionFactors, + Np4183CdDamHourlyLmp, + Np4191CdDamShadowPrices, + Np4192CdDamTotalEnergyPurchased, + Np4193CdTotalDamEnergySold, + Np4194CdDamPtpObligationSpResults, + Np4196MDamPriceCorrectionsEblmp, + Np4196MDamPriceCorrectionsMcpc, + Np4196MDamPriceCorrectionsSpp, + Np4197MRtmPriceCorrectionsEblmp, + Np4197MRtmPriceCorrectionsMcpcSced, + Np4197MRtmPriceCorrectionsMcpcSpp, + Np4197MRtmPriceCorrectionsShadow, + Np4197MRtmPriceCorrectionsSoglmp, + Np4197MRtmPriceCorrectionsSogprice, + Np4197MRtmPriceCorrectionsSplmp, + Np4197MRtmPriceCorrectionsSpp, + Np4200CdDamDeEnergizedSpbc, + Np4212CdDamScedAsDemandCurves, + Np4213CdHrucAsDemandCurves, + Np4214CdDrucAsDemandCurves, + Np4215CdWrucAsDemandCurves, + Np4231CdElectricalBusMapHeurPrice, + Np4523CdDamSystemLambda, + Np6322CdScedSystemLambda, + Np6323CdRtPriceAdderSced, + Np6324CdRt15minPriceAdders, + Np6325CdRtdPriceAdders, + Np6326CdRtPriceSog, + Np6327CdLmpSogPriceAdders, + Np6328CdTotAsResCap, + Np6329CdRtdIndMcpc, + Np6331CdRtClearPriceCap, + Np6332CdRtClearPriceCapSced, + Np6346CdActSysLoadByFzn, + Np6787CdLmpElectricalBus, + Np6788CdLmpNodeZoneHub, + Np6915CdSumHdlLdl, + Np6970CdRtdLmpNodeZoneHub, RealTimePrice, SystemLoad, ) @@ -101,9 +153,1573 @@ class SystemLoadFilters(TypedDict, total=False): ) +class Gen55CdHrlyRtLoadFcastActualFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEndingFrom: int + hourEndingTo: int + currentDayFcastFrom: float | Decimal + currentDayFcastTo: float | Decimal + dayAheadFcastFrom: float | Decimal + dayAheadFcastTo: float | Decimal + actualLoadFrom: float | Decimal + actualLoadTo: float | Decimal + dayAheadHSLFrom: float | Decimal + dayAheadHSLTo: float | Decimal + currentDayHSLFrom: float | Decimal + currentDayHSLTo: float | Decimal + DSTFlag: bool + + +GEN_55_CD_HRLY_RT_LOAD_FCAST_ACTUAL: Endpoint[ + Gen55CdHrlyRtLoadFcastActual, Gen55CdHrlyRtLoadFcastActualFilters +] = Endpoint( + "/gen-55-cd/hrly_rt_load_fcast_actual", + Gen55CdHrlyRtLoadFcastActual, + "gen-55-cd--hrly_rt_load_fcast_actual.json", +) + + +class Np1302AsObligationFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + qseName: str + REGUPOblAdvisoryFrom: float | Decimal + REGUPOblAdvisoryTo: float | Decimal + REGDNOblAdvisoryFrom: float | Decimal + REGDNOblAdvisoryTo: float | Decimal + RRSOblAdvisoryFrom: float | Decimal + RRSOblAdvisoryTo: float | Decimal + NSPINOblAdvisoryFrom: float | Decimal + NSPINOblAdvisoryTo: float | Decimal + ECRSOblAdvisoryFrom: float | Decimal + ECRSOblAdvisoryTo: float | Decimal + REGUPOblFinalFrom: float | Decimal + REGUPOblFinalTo: float | Decimal + REGDNOblFinalFrom: float | Decimal + REGDNOblFinalTo: float | Decimal + RRSOblFinalFrom: float | Decimal + RRSOblFinalTo: float | Decimal + NSPINOblFinalFrom: float | Decimal + NSPINOblFinalTo: float | Decimal + ECRSOblFinalFrom: float | Decimal + ECRSOblFinalTo: float | Decimal + + +NP1_302_AS_OBLIGATION: Endpoint[Np1302AsObligation, Np1302AsObligationFilters] = ( + Endpoint( + "/np1-302/as_obligation", Np1302AsObligation, "np1-302--as_obligation.json" + ) +) + + +class Np3161Cd7dPlusAvailResPocMarginFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + operatingDateFrom: date + operatingDateTo: date + nonIRRNonPUNFrom: float | Decimal + nonIRRNonPUNTo: float | Decimal + ESRFrom: float | Decimal + ESRTo: float | Decimal + aggApprvdNonIRRNonPUNFrom: float | Decimal + aggApprvdNonIRRNonPUNTo: float | Decimal + aggRcvdNonIRRNonPUNFrom: float | Decimal + aggRcvdNonIRRNonPUNTo: float | Decimal + IRRFrom: float | Decimal + IRRTo: float | Decimal + aggApprvdIRRFrom: float | Decimal + aggApprvdIRRTo: float | Decimal + aggRcvdIRRFrom: float | Decimal + aggRcvdIRRTo: float | Decimal + aggApprvdESRFrom: float | Decimal + aggApprvdESRTo: float | Decimal + aggRcvdESRFrom: float | Decimal + aggRcvdESRTo: float | Decimal + + +NP3_161_CD_7D_PLUS_AVAIL_RES_POC_MARGIN: Endpoint[ + Np3161Cd7dPlusAvailResPocMargin, Np3161Cd7dPlusAvailResPocMarginFilters +] = Endpoint( + "/np3-161-cd/7d_plus_avail_res_poc_margin", + Np3161Cd7dPlusAvailResPocMargin, + "np3-161-cd--7d_plus_avail_res_poc_margin.json", +) + + +class Np3162Cd7dAvailResPocMarginFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + aggRcvdESRFrom: float | Decimal + aggRcvdESRTo: float | Decimal + repeatedHourFlag: bool + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + operatingDateFrom: date + operatingDateTo: date + hourEndingFrom: int + hourEndingTo: int + nonIrrNonPunFrom: float | Decimal + nonIrrNonPunTo: float | Decimal + aggApprvdNonIRRNonPUNFrom: float | Decimal + aggApprvdNonIRRNonPUNTo: float | Decimal + aggRcvdNonIRRNonPUNFrom: float | Decimal + aggRcvdNonIRRNonPUNTo: float | Decimal + IRRFrom: float | Decimal + IRRTo: float | Decimal + aggApprvdIRRFrom: float | Decimal + aggApprvdIRRTo: float | Decimal + aggRcvdIRRFrom: float | Decimal + aggRcvdIRRTo: float | Decimal + ESRFrom: float | Decimal + ESRTo: float | Decimal + aggApprvdESRFrom: float | Decimal + aggApprvdESRTo: float | Decimal + + +NP3_162_CD_7D_AVAIL_RES_POC_MARGIN: Endpoint[ + Np3162Cd7dAvailResPocMargin, Np3162Cd7dAvailResPocMarginFilters +] = Endpoint( + "/np3-162-cd/7d_avail_res_poc_margin", + Np3162Cd7dAvailResPocMargin, + "np3-162-cd--7d_avail_res_poc_margin.json", +) + + +class Np3233CdHourlyResOutageCapFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + operatingDateFrom: date + operatingDateTo: date + hourEndingFrom: int + hourEndingTo: int + totalResourceMWZoneSouthFrom: int + totalResourceMWZoneSouthTo: int + totalResourceMWZoneNorthFrom: int + totalResourceMWZoneNorthTo: int + totalResourceMWZoneWestFrom: int + totalResourceMWZoneWestTo: int + totalResourceMWZoneHoustonFrom: int + totalResourceMWZoneHoustonTo: int + totalIRRMWZoneSouthFrom: int + totalIRRMWZoneSouthTo: int + totalIRRMWZoneNorthFrom: int + totalIRRMWZoneNorthTo: int + totalIRRMWZoneWestFrom: int + totalIRRMWZoneWestTo: int + totalIRRMWZoneHoustonFrom: int + totalIRRMWZoneHoustonTo: int + totalNewEquipResourceMWZoneSouthFrom: int + totalNewEquipResourceMWZoneSouthTo: int + totalNewEquipResourceMWZoneNorthFrom: int + totalNewEquipResourceMWZoneNorthTo: int + totalNewEquipResourceMWZoneWestFrom: int + totalNewEquipResourceMWZoneWestTo: int + totalNewEquipResourceMWZoneHoustonFrom: int + totalNewEquipResourceMWZoneHoustonTo: int + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + + +NP3_233_CD_HOURLY_RES_OUTAGE_CAP: Endpoint[ + Np3233CdHourlyResOutageCap, Np3233CdHourlyResOutageCapFilters +] = Endpoint( + "/np3-233-cd/hourly_res_outage_cap", + Np3233CdHourlyResOutageCap, + "np3-233-cd--hourly_res_outage_cap.json", +) + + +class Np3560Cd7dLoadFcastByFznFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + northFrom: float | Decimal + northTo: float | Decimal + southFrom: float | Decimal + southTo: float | Decimal + westFrom: float | Decimal + westTo: float | Decimal + houstonFrom: float | Decimal + houstonTo: float | Decimal + systemTotalFrom: float | Decimal + systemTotalTo: float | Decimal + DSTFlag: bool + + +NP3_560_CD_7D_LOAD_FCAST_BY_FZN: Endpoint[ + Np3560Cd7dLoadFcastByFzn, Np3560Cd7dLoadFcastByFznFilters +] = Endpoint( + "/np3-560-cd/7d_load_fcast_by_fzn", + Np3560Cd7dLoadFcastByFzn, + "np3-560-cd--7d_load_fcast_by_fzn.json", +) + + +class Np3561Cd7dLoadFcastByWznFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + coastFrom: float | Decimal + coastTo: float | Decimal + eastFrom: float | Decimal + eastTo: float | Decimal + farWestFrom: float | Decimal + farWestTo: float | Decimal + northFrom: float | Decimal + northTo: float | Decimal + northCentralFrom: float | Decimal + northCentralTo: float | Decimal + southCentralFrom: float | Decimal + southCentralTo: float | Decimal + southernFrom: float | Decimal + southernTo: float | Decimal + westFrom: float | Decimal + westTo: float | Decimal + systemTotalFrom: float | Decimal + systemTotalTo: float | Decimal + DSTFlag: bool + + +NP3_561_CD_7D_LOAD_FCAST_BY_WZN: Endpoint[ + Np3561Cd7dLoadFcastByWzn, Np3561Cd7dLoadFcastByWznFilters +] = Endpoint( + "/np3-561-cd/7d_load_fcast_by_wzn", + Np3561Cd7dLoadFcastByWzn, + "np3-561-cd--7d_load_fcast_by_wzn.json", +) + + +class Np3562CdIhLoadFcastByWznFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + farWestFrom: float | Decimal + farWestTo: float | Decimal + northFrom: float | Decimal + northTo: float | Decimal + northCentralFrom: float | Decimal + northCentralTo: float | Decimal + southCentralFrom: float | Decimal + southCentralTo: float | Decimal + southernFrom: float | Decimal + southernTo: float | Decimal + westFrom: float | Decimal + westTo: float | Decimal + systemTotalFrom: float | Decimal + systemTotalTo: float | Decimal + model: str + inUseFlag: bool + DSTFlag: bool + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + intervalEndingFrom: datetime + intervalEndingTo: datetime + coastFrom: float | Decimal + coastTo: float | Decimal + eastFrom: float | Decimal + eastTo: float | Decimal + + +NP3_562_CD_IH_LOAD_FCAST_BY_WZN: Endpoint[ + Np3562CdIhLoadFcastByWzn, Np3562CdIhLoadFcastByWznFilters +] = Endpoint( + "/np3-562-cd/ih_load_fcast_by_wzn", + Np3562CdIhLoadFcastByWzn, + "np3-562-cd--ih_load_fcast_by_wzn.json", +) + + +class Np3565CdLfByModelWeatherZoneFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + DSTFlag: bool + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + coastFrom: float | Decimal + coastTo: float | Decimal + eastFrom: float | Decimal + eastTo: float | Decimal + farWestFrom: float | Decimal + farWestTo: float | Decimal + northFrom: float | Decimal + northTo: float | Decimal + northCentralFrom: float | Decimal + northCentralTo: float | Decimal + southCentralFrom: float | Decimal + southCentralTo: float | Decimal + southernFrom: float | Decimal + southernTo: float | Decimal + westFrom: float | Decimal + westTo: float | Decimal + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + systemTotalFrom: float | Decimal + systemTotalTo: float | Decimal + model: str + inUseFlag: bool + + +NP3_565_CD_LF_BY_MODEL_WEATHER_ZONE: Endpoint[ + Np3565CdLfByModelWeatherZone, Np3565CdLfByModelWeatherZoneFilters +] = Endpoint( + "/np3-565-cd/lf_by_model_weather_zone", + Np3565CdLfByModelWeatherZone, + "np3-565-cd--lf_by_model_weather_zone.json", +) + + +class Np4158SgDamEsspsFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + settlementPoint: str + groupIndexFrom: int + groupIndexTo: int + updateTimeFrom: datetime + updateTimeTo: datetime + repeatHourFlag: bool + + +NP4_158_SG_DAM_ESSPS: Endpoint[Np4158SgDamEssps, Np4158SgDamEsspsFilters] = Endpoint( + "/np4-158-sg/dam_essps", Np4158SgDamEssps, "np4-158-sg--dam_essps.json" +) + + +class Np4159CdLoadDistributionFactorsFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + LDFDateFrom: date + LDFDateTo: date + LDFHour: str + substation: str + distributionFactorFrom: float | Decimal + distributionFactorTo: float | Decimal + loadId: str + MVARDistributionFactorFrom: float | Decimal + MVARDistributionFactorTo: float | Decimal + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + MRIDLoad: str + DSTFlag: bool + + +NP4_159_CD_LOAD_DISTRIBUTION_FACTORS: Endpoint[ + Np4159CdLoadDistributionFactors, Np4159CdLoadDistributionFactorsFilters +] = Endpoint( + "/np4-159-cd/load_distribution_factors", + Np4159CdLoadDistributionFactors, + "np4-159-cd--load_distribution_factors.json", +) + + +class Np4183CdDamHourlyLmpFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + DSTFlag: bool + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + busName: str + LMPFrom: float | Decimal + LMPTo: float | Decimal + + +NP4_183_CD_DAM_HOURLY_LMP: Endpoint[ + Np4183CdDamHourlyLmp, Np4183CdDamHourlyLmpFilters +] = Endpoint( + "/np4-183-cd/dam_hourly_lmp", + Np4183CdDamHourlyLmp, + "np4-183-cd--dam_hourly_lmp.json", +) + + +class Np419CdDamAggAsOfferCurveFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + ancillaryType: str + priceFrom: float | Decimal + priceTo: float | Decimal + quantityFrom: float | Decimal + quantityTo: float | Decimal + DSTFlag: bool + + +NP4_19_CD_DAM_AGG_AS_OFFER_CURVE: Endpoint[ + Np419CdDamAggAsOfferCurve, Np419CdDamAggAsOfferCurveFilters +] = Endpoint( + "/np4-19-cd/dam_agg_as_offer_curve", + Np419CdDamAggAsOfferCurve, + "np4-19-cd--dam_agg_as_offer_curve.json", +) + + +class Np4191CdDamShadowPricesFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + constraintIdFrom: int + constraintIdTo: int + constraintName: str + contingencyName: str + constraintLimitFrom: int + constraintLimitTo: int + constraintValueFrom: int + constraintValueTo: int + violationAmountFrom: int + violationAmountTo: int + shadowPriceFrom: float | Decimal + shadowPriceTo: float | Decimal + fromStation: str + toStation: str + fromStationkVFrom: float | Decimal + fromStationkVTo: float | Decimal + toStationkVFrom: float | Decimal + toStationkVTo: float | Decimal + deliveryTimeFrom: datetime + deliveryTimeTo: datetime + DSTFlag: bool + + +NP4_191_CD_DAM_SHADOW_PRICES: Endpoint[ + Np4191CdDamShadowPrices, Np4191CdDamShadowPricesFilters +] = Endpoint( + "/np4-191-cd/dam_shadow_prices", + Np4191CdDamShadowPrices, + "np4-191-cd--dam_shadow_prices.json", +) + + +class Np4192CdDamTotalEnergyPurchasedFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + hourEnding: str + settlementPoint: str + totalDamEnergyBoughtFrom: float | Decimal + totalDamEnergyBoughtTo: float | Decimal + repeatHourFlag: bool + deliveryDateFrom: date + deliveryDateTo: date + + +NP4_192_CD_DAM_TOTAL_ENERGY_PURCHASED: Endpoint[ + Np4192CdDamTotalEnergyPurchased, Np4192CdDamTotalEnergyPurchasedFilters +] = Endpoint( + "/np4-192-cd/dam_total_energy_purchased", + Np4192CdDamTotalEnergyPurchased, + "np4-192-cd--dam_total_energy_purchased.json", +) + + +class Np4193CdTotalDamEnergySoldFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + settlementPoint: str + totalDAMEnergySoldFrom: float | Decimal + totalDAMEnergySoldTo: float | Decimal + repeatHourFlag: bool + + +NP4_193_CD_TOTAL_DAM_ENERGY_SOLD: Endpoint[ + Np4193CdTotalDamEnergySold, Np4193CdTotalDamEnergySoldFilters +] = Endpoint( + "/np4-193-cd/total_dam_energy_sold", + Np4193CdTotalDamEnergySold, + "np4-193-cd--total_dam_energy_sold.json", +) + + +class Np4194CdDamPtpObligationSpResultsFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + stlPnt: str + totalPtpOblAwardedSourceFrom: float | Decimal + totalPtpOblAwardedSourceTo: float | Decimal + totalPtpOblAwardedSinkFrom: float | Decimal + totalPtpOblAwardedSinkTo: float | Decimal + repeatedHourFlag: bool + + +NP4_194_CD_DAM_PTP_OBLIGATION_SP_RESULTS: Endpoint[ + Np4194CdDamPtpObligationSpResults, Np4194CdDamPtpObligationSpResultsFilters +] = Endpoint( + "/np4-194-cd/dam_ptp_obligation_sp_results", + Np4194CdDamPtpObligationSpResults, + "np4-194-cd--dam_ptp_obligation_sp_results.json", +) + + +class Np4196MDamPriceCorrectionsEblmpFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + electricalBus: str + LMPOriginalFrom: float | Decimal + LMPOriginalTo: float | Decimal + LMPCorrectedFrom: float | Decimal + LMPCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + DSTFlag: bool + + +NP4_196_M_DAM_PRICE_CORRECTIONS_EBLMP: Endpoint[ + Np4196MDamPriceCorrectionsEblmp, Np4196MDamPriceCorrectionsEblmpFilters +] = Endpoint( + "/np4-196-m/dam_price_corrections_eblmp", + Np4196MDamPriceCorrectionsEblmp, + "np4-196-m--dam_price_corrections_eblmp.json", +) + + +class Np4196MDamPriceCorrectionsMcpcFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + ASType: str + MCPCOriginalFrom: float | Decimal + MCPCOriginalTo: float | Decimal + MCPCCorrectedFrom: float | Decimal + MCPCCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + DSTFlag: bool + + +NP4_196_M_DAM_PRICE_CORRECTIONS_MCPC: Endpoint[ + Np4196MDamPriceCorrectionsMcpc, Np4196MDamPriceCorrectionsMcpcFilters +] = Endpoint( + "/np4-196-m/dam_price_corrections_mcpc", + Np4196MDamPriceCorrectionsMcpc, + "np4-196-m--dam_price_corrections_mcpc.json", +) + + +class Np4196MDamPriceCorrectionsSppFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + DSTFlag: bool + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + settlementPoint: str + SPPOriginalFrom: float | Decimal + SPPOriginalTo: float | Decimal + SPPCorrectedFrom: float | Decimal + SPPCorrectedTo: float | Decimal + + +NP4_196_M_DAM_PRICE_CORRECTIONS_SPP: Endpoint[ + Np4196MDamPriceCorrectionsSpp, Np4196MDamPriceCorrectionsSppFilters +] = Endpoint( + "/np4-196-m/dam_price_corrections_spp", + Np4196MDamPriceCorrectionsSpp, + "np4-196-m--dam_price_corrections_spp.json", +) + + +class Np4197MRtmPriceCorrectionsEblmpFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + cappedLMPOriginalFrom: float | Decimal + cappedLMPOriginalTo: float | Decimal + uncappedLMPOriginalFrom: float | Decimal + uncappedLMPOriginalTo: float | Decimal + cappedLMPCorrectedFrom: float | Decimal + cappedLMPCorrectedTo: float | Decimal + uncappedLMPCorrectedFrom: float | Decimal + uncappedLMPCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + repeatedHourFlag: bool + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + electricalBus: str + + +NP4_197_M_RTM_PRICE_CORRECTIONS_EBLMP: Endpoint[ + Np4197MRtmPriceCorrectionsEblmp, Np4197MRtmPriceCorrectionsEblmpFilters +] = Endpoint( + "/np4-197-m/rtm_price_corrections_eblmp", + Np4197MRtmPriceCorrectionsEblmp, + "np4-197-m--rtm_price_corrections_eblmp.json", +) + + +class Np4197MRtmPriceCorrectionsMcpcScedFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + ASType: str + cappedMCPCOriginalFrom: float | Decimal + cappedMCPCOriginalTo: float | Decimal + uncappedMCPCOriginalFrom: float | Decimal + uncappedMCPCOriginalTo: float | Decimal + cappedMCPCCorrectedFrom: float | Decimal + cappedMCPCCorrectedTo: float | Decimal + uncappedMCPCCorrectedFrom: float | Decimal + uncappedMCPCCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + repeatedHourFlag: bool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SCED: Endpoint[ + Np4197MRtmPriceCorrectionsMcpcSced, Np4197MRtmPriceCorrectionsMcpcScedFilters +] = Endpoint( + "/np4-197-m/rtm_price_corrections_mcpc_sced", + Np4197MRtmPriceCorrectionsMcpcSced, + "np4-197-m--rtm_price_corrections_mcpc_sced.json", +) + + +class Np4197MRtmPriceCorrectionsMcpcSppFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + ASType: str + MCPCOriginalFrom: float | Decimal + MCPCOriginalTo: float | Decimal + MCPCCorrectedFrom: float | Decimal + MCPCCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + repeatHourFlag: bool + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + deliveryIntervalFrom: int + deliveryIntervalTo: int + + +NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SPP: Endpoint[ + Np4197MRtmPriceCorrectionsMcpcSpp, Np4197MRtmPriceCorrectionsMcpcSppFilters +] = Endpoint( + "/np4-197-m/rtm_price_corrections_mcpc_spp", + Np4197MRtmPriceCorrectionsMcpcSpp, + "np4-197-m--rtm_price_corrections_mcpc_spp.json", +) + + +class Np4197MRtmPriceCorrectionsShadowFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + constraintIdFrom: int + constraintIdTo: int + constraintName: str + contingencyName: str + shadowPriceOriginalFrom: float | Decimal + shadowPriceOriginalTo: float | Decimal + shadowPriceCorrectedFrom: float | Decimal + shadowPriceCorrectedTo: float | Decimal + limitOriginalFrom: float | Decimal + limitOriginalTo: float | Decimal + limitCorrectedFrom: float | Decimal + limitCorrectedTo: float | Decimal + valueOriginalFrom: float | Decimal + valueOriginalTo: float | Decimal + valueCorrectedFrom: float | Decimal + valueCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + DSTFlag: bool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SHADOW: Endpoint[ + Np4197MRtmPriceCorrectionsShadow, Np4197MRtmPriceCorrectionsShadowFilters +] = Endpoint( + "/np4-197-m/rtm_price_corrections_shadow", + Np4197MRtmPriceCorrectionsShadow, + "np4-197-m--rtm_price_corrections_shadow.json", +) + + +class Np4197MRtmPriceCorrectionsSoglmpFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + resourceType: str + resourceName: str + meterName: str + meterLMPOriginalFrom: float | Decimal + meterLMPOriginalTo: float | Decimal + meterLMPCorrectedFrom: float | Decimal + meterLMPCorrectedTo: float | Decimal + RTRDPAOriginalFrom: float | Decimal + RTRDPAOriginalTo: float | Decimal + RTRDPACorrectedFrom: float | Decimal + RTRDPACorrectedTo: float | Decimal + finalLMPOriginalFrom: float | Decimal + finalLMPOriginalTo: float | Decimal + finalLMPCorrectedFrom: float | Decimal + finalLMPCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + repeatHourFlag: bool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SOGLMP: Endpoint[ + Np4197MRtmPriceCorrectionsSoglmp, Np4197MRtmPriceCorrectionsSoglmpFilters +] = Endpoint( + "/np4-197-m/rtm_price_corrections_soglmp", + Np4197MRtmPriceCorrectionsSoglmp, + "np4-197-m--rtm_price_corrections_soglmp.json", +) + + +class Np4197MRtmPriceCorrectionsSogpriceFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + deliveryIntervalFrom: int + deliveryIntervalTo: int + resourceType: str + resourceName: str + meterName: str + priceOriginalFrom: float | Decimal + priceOriginalTo: float | Decimal + priceCorrectedFrom: float | Decimal + priceCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + DSTFlag: bool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SOGPRICE: Endpoint[ + Np4197MRtmPriceCorrectionsSogprice, Np4197MRtmPriceCorrectionsSogpriceFilters +] = Endpoint( + "/np4-197-m/rtm_price_corrections_sogprice", + Np4197MRtmPriceCorrectionsSogprice, + "np4-197-m--rtm_price_corrections_sogprice.json", +) + + +class Np4197MRtmPriceCorrectionsSplmpFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + settlementPointName: str + LMPOriginalFrom: float | Decimal + LMPOriginalTo: float | Decimal + LMPCorrectedFrom: float | Decimal + LMPCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + DSTFlag: bool + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SPLMP: Endpoint[ + Np4197MRtmPriceCorrectionsSplmp, Np4197MRtmPriceCorrectionsSplmpFilters +] = Endpoint( + "/np4-197-m/rtm_price_corrections_splmp", + Np4197MRtmPriceCorrectionsSplmp, + "np4-197-m--rtm_price_corrections_splmp.json", +) + + +class Np4197MRtmPriceCorrectionsSppFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + deliveryIntervalFrom: int + deliveryIntervalTo: int + settlementPointName: str + settlementPointType: str + SPPOriginalFrom: float | Decimal + SPPOriginalTo: float | Decimal + SPPCorrectedFrom: float | Decimal + SPPCorrectedTo: float | Decimal + priceCorrectionTimeFrom: datetime + priceCorrectionTimeTo: datetime + DSTFlag: bool + + +NP4_197_M_RTM_PRICE_CORRECTIONS_SPP: Endpoint[ + Np4197MRtmPriceCorrectionsSpp, Np4197MRtmPriceCorrectionsSppFilters +] = Endpoint( + "/np4-197-m/rtm_price_corrections_spp", + Np4197MRtmPriceCorrectionsSpp, + "np4-197-m--rtm_price_corrections_spp.json", +) + + +class Np4200CdDamDeEnergizedSpbcFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + settlementPoint: str + repeatedHourFlag: bool + + +NP4_200_CD_DAM_DE_ENERGIZED_SPBC: Endpoint[ + Np4200CdDamDeEnergizedSpbc, Np4200CdDamDeEnergizedSpbcFilters +] = Endpoint( + "/np4-200-cd/dam_de_energized_spbc", + Np4200CdDamDeEnergizedSpbc, + "np4-200-cd--dam_de_energized_spbc.json", +) + + +class Np4212CdDamScedAsDemandCurvesFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + quantityFrom: float | Decimal + quantityTo: float | Decimal + priceFrom: float | Decimal + priceTo: float | Decimal + repeatHourFlag: bool + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + ASType: str + demandCurvePointFrom: float | Decimal + demandCurvePointTo: float | Decimal + + +NP4_212_CD_DAM_SCED_AS_DEMAND_CURVES: Endpoint[ + Np4212CdDamScedAsDemandCurves, Np4212CdDamScedAsDemandCurvesFilters +] = Endpoint( + "/np4-212-cd/dam_sced_as_demand_curves", + Np4212CdDamScedAsDemandCurves, + "np4-212-cd--dam_sced_as_demand_curves.json", +) + + +class Np4213CdHrucAsDemandCurvesFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + quantityFrom: float | Decimal + quantityTo: float | Decimal + priceFrom: float | Decimal + priceTo: float | Decimal + repeatHourFlag: bool + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + RUCTimestampFrom: datetime + RUCTimestampTo: datetime + ASType: str + demandCurvePointFrom: float | Decimal + demandCurvePointTo: float | Decimal + + +NP4_213_CD_HRUC_AS_DEMAND_CURVES: Endpoint[ + Np4213CdHrucAsDemandCurves, Np4213CdHrucAsDemandCurvesFilters +] = Endpoint( + "/np4-213-cd/hruc_as_demand_curves", + Np4213CdHrucAsDemandCurves, + "np4-213-cd--hruc_as_demand_curves.json", +) + + +class Np4214CdDrucAsDemandCurvesFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + RUCTimestampFrom: datetime + RUCTimestampTo: datetime + ASType: str + demandCurvePointFrom: float | Decimal + demandCurvePointTo: float | Decimal + quantityFrom: float | Decimal + quantityTo: float | Decimal + priceFrom: float | Decimal + priceTo: float | Decimal + repeatHourFlag: bool + + +NP4_214_CD_DRUC_AS_DEMAND_CURVES: Endpoint[ + Np4214CdDrucAsDemandCurves, Np4214CdDrucAsDemandCurvesFilters +] = Endpoint( + "/np4-214-cd/druc_as_demand_curves", + Np4214CdDrucAsDemandCurves, + "np4-214-cd--druc_as_demand_curves.json", +) + + +class Np4215CdWrucAsDemandCurvesFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + quantityFrom: float | Decimal + quantityTo: float | Decimal + priceFrom: float | Decimal + priceTo: float | Decimal + repeatHourFlag: bool + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + RUCTimestampFrom: datetime + RUCTimestampTo: datetime + ASType: str + demandCurvePointFrom: float | Decimal + demandCurvePointTo: float | Decimal + + +NP4_215_CD_WRUC_AS_DEMAND_CURVES: Endpoint[ + Np4215CdWrucAsDemandCurves, Np4215CdWrucAsDemandCurvesFilters +] = Endpoint( + "/np4-215-cd/wruc_as_demand_curves", + Np4215CdWrucAsDemandCurves, + "np4-215-cd--wruc_as_demand_curves.json", +) + + +class Np4231CdElectricalBusMapHeurPriceFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + toEBName: str + type: str + priorityFrom: float | Decimal + priorityTo: float | Decimal + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + marketType: str + fromEBName: str + + +NP4_231_CD_ELECTRICAL_BUS_MAP_HEUR_PRICE: Endpoint[ + Np4231CdElectricalBusMapHeurPrice, Np4231CdElectricalBusMapHeurPriceFilters +] = Endpoint( + "/np4-231-cd/electrical_bus_map_heur_price", + Np4231CdElectricalBusMapHeurPrice, + "np4-231-cd--electrical_bus_map_heur_price.json", +) + + +class Np433CdDamAsPlanFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + ancillaryType: str + quantityFrom: int + quantityTo: int + DSTFlag: bool + postedDatetimeFrom: datetime + postedDatetimeTo: datetime + + +NP4_33_CD_DAM_AS_PLAN: Endpoint[Np433CdDamAsPlan, Np433CdDamAsPlanFilters] = Endpoint( + "/np4-33-cd/dam_as_plan", Np433CdDamAsPlan, "np4-33-cd--dam_as_plan.json" +) + + +class Np4523CdDamSystemLambdaFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + hourEnding: str + systemLambdaFrom: float | Decimal + systemLambdaTo: float | Decimal + DSTFlag: bool + + +NP4_523_CD_DAM_SYSTEM_LAMBDA: Endpoint[ + Np4523CdDamSystemLambda, Np4523CdDamSystemLambdaFilters +] = Endpoint( + "/np4-523-cd/dam_system_lambda", + Np4523CdDamSystemLambda, + "np4-523-cd--dam_system_lambda.json", +) + + +class Np6322CdScedSystemLambdaFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatedHourFlag: bool + cappedSystemLambdaFrom: float | Decimal + cappedSystemLambdaTo: float | Decimal + uncappedSystemLambdaFrom: float | Decimal + uncappedSystemLambdaTo: float | Decimal + + +NP6_322_CD_SCED_SYSTEM_LAMBDA: Endpoint[ + Np6322CdScedSystemLambda, Np6322CdScedSystemLambdaFilters +] = Endpoint( + "/np6-322-cd/sced_system_lambda", + Np6322CdScedSystemLambda, + "np6-322-cd--sced_system_lambda.json", +) + + +class Np6323CdRtPriceAdderScedFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatHourFlag: bool + systemLambdaFrom: float | Decimal + systemLambdaTo: float | Decimal + RTRDPAFrom: float | Decimal + RTRDPATo: float | Decimal + RTRDPARUSFrom: float | Decimal + RTRDPARUSTo: float | Decimal + RTRDPARDSFrom: float | Decimal + RTRDPARDSTo: float | Decimal + RTRDPARRSFrom: float | Decimal + RTRDPARRSTo: float | Decimal + RTRDPAECRSFrom: float | Decimal + RTRDPAECRSTo: float | Decimal + RTRDPANSSFrom: float | Decimal + RTRDPANSSTo: float | Decimal + RTRRUCFrom: float | Decimal + RTRRUCTo: float | Decimal + RTRRMRFrom: float | Decimal + RTRRMRTo: float | Decimal + RTDNCLRFrom: float | Decimal + RTDNCLRTo: float | Decimal + RTDERSFrom: float | Decimal + RTDERSTo: float | Decimal + RTDCTIEIMPORTFrom: float | Decimal + RTDCTIEIMPORTTo: float | Decimal + RTDCTIEEXPORTFrom: float | Decimal + RTDCTIEEXPORTTo: float | Decimal + RTBLTIMPORTFrom: float | Decimal + RTBLTIMPORTTo: float | Decimal + RTBLTEXPORTFrom: float | Decimal + RTBLTEXPORTTo: float | Decimal + RTOLLSLFrom: float | Decimal + RTOLLSLTo: float | Decimal + RTOLHSLFrom: float | Decimal + RTOLHSLTo: float | Decimal + RTDLLFrom: float | Decimal + RTDLLTo: float | Decimal + + +NP6_323_CD_RT_PRICE_ADDER_SCED: Endpoint[ + Np6323CdRtPriceAdderSced, Np6323CdRtPriceAdderScedFilters +] = Endpoint( + "/np6-323-cd/rt_price_adder_sced", + Np6323CdRtPriceAdderSced, + "np6-323-cd--rt_price_adder_sced.json", +) + + +class Np6324CdRt15minPriceAddersFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + deliveryIntervalFrom: int + deliveryIntervalTo: int + RTRDPAFrom: float | Decimal + RTRDPATo: float | Decimal + RTRDPRUFrom: float | Decimal + RTRDPRUTo: float | Decimal + RTRDPRDFrom: float | Decimal + RTRDPRDTo: float | Decimal + RTRDPRRSFrom: float | Decimal + RTRDPRRSTo: float | Decimal + RTRDPECRSFrom: float | Decimal + RTRDPECRSTo: float | Decimal + RTRDPNSFrom: float | Decimal + RTRDPNSTo: float | Decimal + repeatHourFlag: bool + + +NP6_324_CD_RT_15MIN_PRICE_ADDERS: Endpoint[ + Np6324CdRt15minPriceAdders, Np6324CdRt15minPriceAddersFilters +] = Endpoint( + "/np6-324-cd/rt_15min_price_adders", + Np6324CdRt15minPriceAdders, + "np6-324-cd--rt_15min_price_adders.json", +) + + +class Np6325CdRtdPriceAddersFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + RTDTimestampFrom: datetime + RTDTimestampTo: datetime + repeatHourFlag: bool + intervalIDFrom: int + intervalIDTo: int + intervalEndingFrom: datetime + intervalEndingTo: datetime + IERepeatHourFlag: bool + systemLambdaFrom: float | Decimal + systemLambdaTo: float | Decimal + RTRDPAFrom: float | Decimal + RTRDPATo: float | Decimal + RTRDPARUSFrom: float | Decimal + RTRDPARUSTo: float | Decimal + RTRDPARDSFrom: float | Decimal + RTRDPARDSTo: float | Decimal + RTRDPARRSFrom: float | Decimal + RTRDPARRSTo: float | Decimal + RTRDPAECRSFrom: float | Decimal + RTRDPAECRSTo: float | Decimal + RTRDPANSSFrom: float | Decimal + RTRDPANSSTo: float | Decimal + RTRRUCFrom: float | Decimal + RTRRUCTo: float | Decimal + RTRRMRFrom: float | Decimal + RTRRMRTo: float | Decimal + RTDNCLRFrom: float | Decimal + RTDNCLRTo: float | Decimal + RTDERSFrom: float | Decimal + RTDERSTo: float | Decimal + RTDCTIEImportFrom: float | Decimal + RTDCTIEImportTo: float | Decimal + RTDCTIEExportFrom: float | Decimal + RTDCTIEExportTo: float | Decimal + RTBLTImportFrom: float | Decimal + RTBLTImportTo: float | Decimal + RTBLTExportFrom: float | Decimal + RTBLTExportTo: float | Decimal + RTOLLSLFrom: float | Decimal + RTOLLSLTo: float | Decimal + RTOLHSLFrom: float | Decimal + RTOLHSLTo: float | Decimal + RTDLLFrom: float | Decimal + RTDLLTo: float | Decimal + + +NP6_325_CD_RTD_PRICE_ADDERS: Endpoint[ + Np6325CdRtdPriceAdders, Np6325CdRtdPriceAddersFilters +] = Endpoint( + "/np6-325-cd/rtd_price_adders", + Np6325CdRtdPriceAdders, + "np6-325-cd--rtd_price_adders.json", +) + + +class Np6326CdRtPriceSogFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + deliveryIntervalFrom: int + deliveryIntervalTo: int + resourceType: str + resourceName: str + meterName: str + meterPriceFrom: float | Decimal + meterPriceTo: float | Decimal + DSTFlag: bool + + +NP6_326_CD_RT_PRICE_SOG: Endpoint[Np6326CdRtPriceSog, Np6326CdRtPriceSogFilters] = ( + Endpoint( + "/np6-326-cd/rt_price_sog", Np6326CdRtPriceSog, "np6-326-cd--rt_price_sog.json" + ) +) + + +class Np6327CdLmpSogPriceAddersFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + resourceType: str + resourceName: str + stationName: str + voltageLevelFrom: float | Decimal + voltageLevelTo: float | Decimal + meterName: str + meterLMPFrom: float | Decimal + meterLMPTo: float | Decimal + RTRDPAFrom: float | Decimal + RTRDPATo: float | Decimal + finalLMPFrom: float | Decimal + finalLMPTo: float | Decimal + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatHourFlag: bool + + +NP6_327_CD_LMP_SOG_PRICE_ADDERS: Endpoint[ + Np6327CdLmpSogPriceAdders, Np6327CdLmpSogPriceAddersFilters +] = Endpoint( + "/np6-327-cd/lmp_sog_price_adders", + Np6327CdLmpSogPriceAdders, + "np6-327-cd--lmp_sog_price_adders.json", +) + + +class Np6328CdTotAsResCapFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + capREGDNFrom: float | Decimal + capREGDNTo: float | Decimal + capRRSFrom: float | Decimal + capRRSTo: float | Decimal + capECRSFrom: float | Decimal + capECRSTo: float | Decimal + capNSPINFrom: float | Decimal + capNSPINTo: float | Decimal + capREGUPRRSFrom: float | Decimal + capREGUPRRSTo: float | Decimal + capREGUPRRSECRSFrom: float | Decimal + capREGUPRRSECRSTo: float | Decimal + capREGUPRRSECRSNSPINFrom: float | Decimal + capREGUPRRSECRSNSPINTo: float | Decimal + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatHourFlag: bool + capREGUPFrom: float | Decimal + capREGUPTo: float | Decimal + + +NP6_328_CD_TOT_AS_RES_CAP: Endpoint[Np6328CdTotAsResCap, Np6328CdTotAsResCapFilters] = ( + Endpoint( + "/np6-328-cd/tot_as_res_cap", + Np6328CdTotAsResCap, + "np6-328-cd--tot_as_res_cap.json", + ) +) + + +class Np6329CdRtdIndMcpcFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + RRSFrom: float | Decimal + RRSTo: float | Decimal + ECRSFrom: float | Decimal + ECRSTo: float | Decimal + NSPINFrom: float | Decimal + NSPINTo: float | Decimal + RTDTimestampFrom: datetime + RTDTimestampTo: datetime + repeatHourFlag: bool + intervalIdFrom: int + intervalIdTo: int + intervalEndingFrom: datetime + intervalEndingTo: datetime + intervalRepeatHourFlag: bool + REGUPFrom: float | Decimal + REGUPTo: float | Decimal + REGDNFrom: float | Decimal + REGDNTo: float | Decimal + + +NP6_329_CD_RTD_IND_MCPC: Endpoint[Np6329CdRtdIndMcpc, Np6329CdRtdIndMcpcFilters] = ( + Endpoint( + "/np6-329-cd/rtd_ind_mcpc", Np6329CdRtdIndMcpc, "np6-329-cd--rtd_ind_mcpc.json" + ) +) + + +class Np6331CdRtClearPriceCapFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + deliveryDateFrom: date + deliveryDateTo: date + deliveryHourFrom: int + deliveryHourTo: int + deliveryIntFrom: int + deliveryIntTo: int + repeatHourFlag: bool + ASType: str + MCPCFrom: float | Decimal + MCPCTo: float | Decimal + + +NP6_331_CD_RT_CLEAR_PRICE_CAP: Endpoint[ + Np6331CdRtClearPriceCap, Np6331CdRtClearPriceCapFilters +] = Endpoint( + "/np6-331-cd/rt_clear_price_cap", + Np6331CdRtClearPriceCap, + "np6-331-cd--rt_clear_price_cap.json", +) + + +class Np6332CdRtClearPriceCapScedFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatedHourFlag: bool + ASType: str + cappedMCPCFrom: float | Decimal + cappedMCPCTo: float | Decimal + uncappedMCPCFrom: float | Decimal + uncappedMCPCTo: float | Decimal + + +NP6_332_CD_RT_CLEAR_PRICE_CAP_SCED: Endpoint[ + Np6332CdRtClearPriceCapSced, Np6332CdRtClearPriceCapScedFilters +] = Endpoint( + "/np6-332-cd/rt_clear_price_cap_sced", + Np6332CdRtClearPriceCapSced, + "np6-332-cd--rt_clear_price_cap_sced.json", +) + + +class Np6346CdActSysLoadByFznFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + operatingDayFrom: date + operatingDayTo: date + hourEnding: str + northFrom: float | Decimal + northTo: float | Decimal + southFrom: float | Decimal + southTo: float | Decimal + westFrom: float | Decimal + westTo: float | Decimal + houstonFrom: float | Decimal + houstonTo: float | Decimal + totalFrom: float | Decimal + totalTo: float | Decimal + DSTFlag: bool + + +NP6_346_CD_ACT_SYS_LOAD_BY_FZN: Endpoint[ + Np6346CdActSysLoadByFzn, Np6346CdActSysLoadByFznFilters +] = Endpoint( + "/np6-346-cd/act_sys_load_by_fzn", + Np6346CdActSysLoadByFzn, + "np6-346-cd--act_sys_load_by_fzn.json", +) + + +class Np6787CdLmpElectricalBusFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatedHourFlag: bool + electricalBus: str + cappedLMPFrom: float | Decimal + cappedLMPTo: float | Decimal + uncappedLMPFrom: float | Decimal + uncappedLMPTo: float | Decimal + + +NP6_787_CD_LMP_ELECTRICAL_BUS: Endpoint[ + Np6787CdLmpElectricalBus, Np6787CdLmpElectricalBusFilters +] = Endpoint( + "/np6-787-cd/lmp_electrical_bus", + Np6787CdLmpElectricalBus, + "np6-787-cd--lmp_electrical_bus.json", +) + + +class Np6788CdLmpNodeZoneHubFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatHourFlag: bool + settlementPoint: str + LMPFrom: float | Decimal + LMPTo: float | Decimal + + +NP6_788_CD_LMP_NODE_ZONE_HUB: Endpoint[ + Np6788CdLmpNodeZoneHub, Np6788CdLmpNodeZoneHubFilters +] = Endpoint( + "/np6-788-cd/lmp_node_zone_hub", + Np6788CdLmpNodeZoneHub, + "np6-788-cd--lmp_node_zone_hub.json", +) + + +class Np686CdShdwPricesBndTrnsConstFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + fromStation: str + toStation: str + fromStationkVFrom: float | Decimal + fromStationkVTo: float | Decimal + toStationkVFrom: float | Decimal + toStationkVTo: float | Decimal + CCTStatus: str + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatedHourFlag: bool + constraintIDFrom: int + constraintIDTo: int + constraintName: str + contingencyName: str + shadowPriceFrom: float | Decimal + shadowPriceTo: float | Decimal + maxShadowPriceFrom: float | Decimal + maxShadowPriceTo: float | Decimal + limitFrom: float | Decimal + limitTo: float | Decimal + valueFrom: float | Decimal + valueTo: float | Decimal + violatedMWFrom: float | Decimal + violatedMWTo: float | Decimal + + +NP6_86_CD_SHDW_PRICES_BND_TRNS_CONST: Endpoint[ + Np686CdShdwPricesBndTrnsConst, Np686CdShdwPricesBndTrnsConstFilters +] = Endpoint( + "/np6-86-cd/shdw_prices_bnd_trns_const", + Np686CdShdwPricesBndTrnsConst, + "np6-86-cd--shdw_prices_bnd_trns_const.json", +) + + +class Np6915CdSumHdlLdlFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + SCEDTimestampFrom: datetime + SCEDTimestampTo: datetime + repeatHourFlag: bool + GTBDFrom: float | Decimal + GTBDTo: float | Decimal + sumHDLFrom: float | Decimal + sumHDLTo: float | Decimal + sumLDLFrom: float | Decimal + sumLDLTo: float | Decimal + + +NP6_915_CD_SUM_HDL_LDL: Endpoint[Np6915CdSumHdlLdl, Np6915CdSumHdlLdlFilters] = ( + Endpoint( + "/np6-915-cd/sum_hdl_ldl", Np6915CdSumHdlLdl, "np6-915-cd--sum_hdl_ldl.json" + ) +) + + +class Np6970CdRtdLmpNodeZoneHubFilters(TypedDict, total=False): + """Optional filters from the pinned current query specification.""" + + RTDTimestampFrom: datetime + RTDTimestampTo: datetime + repeatHourFlag: bool + intervalIdFrom: int + intervalIdTo: int + intervalEndingFrom: datetime + intervalEndingTo: datetime + intervalRepeatHourFlag: bool + settlementPoint: str + settlementPointType: str + LMPFrom: float | Decimal + LMPTo: float | Decimal + + +NP6_970_CD_RTD_LMP_NODE_ZONE_HUB: Endpoint[ + Np6970CdRtdLmpNodeZoneHub, Np6970CdRtdLmpNodeZoneHubFilters +] = Endpoint( + "/np6-970-cd/rtd_lmp_node_zone_hub", + Np6970CdRtdLmpNodeZoneHub, + "np6-970-cd--rtd_lmp_node_zone_hub.json", +) + + ENDPOINTS = ( DAM_PRICES, DAM_CAPACITY_PRICES, RT_PRICES, SYSTEM_LOAD, + GEN_55_CD_HRLY_RT_LOAD_FCAST_ACTUAL, + NP1_302_AS_OBLIGATION, + NP3_161_CD_7D_PLUS_AVAIL_RES_POC_MARGIN, + NP3_162_CD_7D_AVAIL_RES_POC_MARGIN, + NP3_233_CD_HOURLY_RES_OUTAGE_CAP, + NP3_560_CD_7D_LOAD_FCAST_BY_FZN, + NP3_561_CD_7D_LOAD_FCAST_BY_WZN, + NP3_562_CD_IH_LOAD_FCAST_BY_WZN, + NP3_565_CD_LF_BY_MODEL_WEATHER_ZONE, + NP4_158_SG_DAM_ESSPS, + NP4_159_CD_LOAD_DISTRIBUTION_FACTORS, + NP4_183_CD_DAM_HOURLY_LMP, + NP4_19_CD_DAM_AGG_AS_OFFER_CURVE, + NP4_191_CD_DAM_SHADOW_PRICES, + NP4_192_CD_DAM_TOTAL_ENERGY_PURCHASED, + NP4_193_CD_TOTAL_DAM_ENERGY_SOLD, + NP4_194_CD_DAM_PTP_OBLIGATION_SP_RESULTS, + NP4_196_M_DAM_PRICE_CORRECTIONS_EBLMP, + NP4_196_M_DAM_PRICE_CORRECTIONS_MCPC, + NP4_196_M_DAM_PRICE_CORRECTIONS_SPP, + NP4_197_M_RTM_PRICE_CORRECTIONS_EBLMP, + NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SCED, + NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SPP, + NP4_197_M_RTM_PRICE_CORRECTIONS_SHADOW, + NP4_197_M_RTM_PRICE_CORRECTIONS_SOGLMP, + NP4_197_M_RTM_PRICE_CORRECTIONS_SOGPRICE, + NP4_197_M_RTM_PRICE_CORRECTIONS_SPLMP, + NP4_197_M_RTM_PRICE_CORRECTIONS_SPP, + NP4_200_CD_DAM_DE_ENERGIZED_SPBC, + NP4_212_CD_DAM_SCED_AS_DEMAND_CURVES, + NP4_213_CD_HRUC_AS_DEMAND_CURVES, + NP4_214_CD_DRUC_AS_DEMAND_CURVES, + NP4_215_CD_WRUC_AS_DEMAND_CURVES, + NP4_231_CD_ELECTRICAL_BUS_MAP_HEUR_PRICE, + NP4_33_CD_DAM_AS_PLAN, + NP4_523_CD_DAM_SYSTEM_LAMBDA, + NP6_322_CD_SCED_SYSTEM_LAMBDA, + NP6_323_CD_RT_PRICE_ADDER_SCED, + NP6_324_CD_RT_15MIN_PRICE_ADDERS, + NP6_325_CD_RTD_PRICE_ADDERS, + NP6_326_CD_RT_PRICE_SOG, + NP6_327_CD_LMP_SOG_PRICE_ADDERS, + NP6_328_CD_TOT_AS_RES_CAP, + NP6_329_CD_RTD_IND_MCPC, + NP6_331_CD_RT_CLEAR_PRICE_CAP, + NP6_332_CD_RT_CLEAR_PRICE_CAP_SCED, + NP6_346_CD_ACT_SYS_LOAD_BY_FZN, + NP6_787_CD_LMP_ELECTRICAL_BUS, + NP6_788_CD_LMP_NODE_ZONE_HUB, + NP6_86_CD_SHDW_PRICES_BND_TRNS_CONST, + NP6_915_CD_SUM_HDL_LDL, + NP6_970_CD_RTD_LMP_NODE_ZONE_HUB, ) diff --git a/tinyercot/public/aggregate_dashboards.py b/tinyercot/public/aggregate_dashboards.py new file mode 100644 index 00000000..e95a72c2 --- /dev/null +++ b/tinyercot/public/aggregate_dashboards.py @@ -0,0 +1,313 @@ +"""Anonymous generation-outage and DC-tie aggregate dashboard captures. + +These models cover observed public website payloads only. Rolling prior rows +are part of one capture and do not provide a historical retrieval contract. +Primary routes and source limitations are recorded in docs/public-aggregates.md. +""" + +import datetime +from dataclasses import dataclass +from decimal import Decimal + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, field_validator + +from ._http import Payload, SchemaMismatchError +from .dashboards import DashboardClient, DashboardSnapshot, _source_time + +GENERATION_OUTAGES_URL = ( + "https://www.ercot.com/api/1/services/read/dashboards/generation-outages.json" +) +DC_TIE_FLOWS_URL = ( + "https://www.ercot.com/api/1/services/read/dashboards/dc-tie-flows.json" +) + + +class OutageAmounts(BaseModel): + """Source outage capability reductions in MW without recalculated totals. + + Attributes: + unplanned: Source unplanned outage MW. + planned: Source planned outage MW. + total: Source total outage MW. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + unplanned: StrictInt + planned: StrictInt + total: StrictInt + + +class GenerationOutageRow(BaseModel): + """One source outage observation with resource categories kept separate. + + Attributes: + deliveryTime: Unchanged source local time and UTC offset. + dstFlag: Source DST label, without inferred meaning. + combined: Source Combined outage values. + dispatchable: Source Dispatchable outage values. + renewable: Source Renewable outage values. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + deliveryTime: StrictStr + dstFlag: StrictStr + combined: OutageAmounts = Field(alias="Combined") + dispatchable: OutageAmounts = Field(alias="Dispatchable") + renewable: OutageAmounts = Field(alias="Renewable") + + +@dataclass(frozen=True) +class OutageObservation: + """One row plus its original epoch key and verified observation instant. + + Attributes: + source_epoch: Unchanged object key containing source epoch milliseconds. + timestamp: Instant and offset established by deliveryTime and epoch. + row: Original time labels and typed source outage values. + """ + + source_epoch: str + timestamp: datetime.datetime + row: GenerationOutageRow + + +class OutageDays(BaseModel): + """Source day labels, which describe this capture's sections only. + + Attributes: + previous: Ordered source labels for the previous section. + current: Ordered source labels for the current section. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + previous: tuple[StrictStr, ...] + current: tuple[StrictStr, ...] + + +@dataclass(frozen=True) +class GenerationOutagesSnapshot(DashboardSnapshot): + """One rolling public outage capture with all returned sections retained. + + Attributes: + current_outages: Source currentOutages MW, not a recomputed aggregate. + days: Source section date labels, without a retention guarantee. + resource_types: Original source type labels and order. + current: Ordered observations from the source current section. + previous: Ordered observations from the source previous section. + """ + + current_outages: int + days: OutageDays + resource_types: tuple[str, ...] + current: tuple[OutageObservation, ...] + previous: tuple[OutageObservation, ...] + + +class DcTieRow(BaseModel): + """One public aggregate DC-tie observation with the source sign convention. + + Attributes: + currentFrequency: Source system frequency in Hz, preserved as Decimal. + currentSystemInertia: Source aggregate inertia integer, without conversion. + dcE: Source east DC-tie MW; negative is import and positive is export. + dcN: Source north DC-tie MW with the same sign convention. + dcL: Source Laredo DC-tie MW with the same sign convention. + dcR: Source Railroad DC-tie MW with the same sign convention. + timestamp: Original source local timestamp with explicit offset. + epoch: Source epoch milliseconds, checked against timestamp. + interval: Original source interval text, checked against timestamp. + dstFlag: Raw source DST label, without inferred meaning. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + currentFrequency: Decimal + currentSystemInertia: StrictInt + dcE: StrictInt + dcN: StrictInt + dcL: StrictInt + dcR: StrictInt + timestamp: StrictStr + epoch: StrictInt + interval: StrictStr + dstFlag: StrictStr + + @field_validator("currentFrequency", mode="before") + @classmethod + def finite_frequency(cls, value: object) -> Decimal: + """Require finite JSON numbers without boolean or string coercion. + + Args: + value: Original numeric source value, parsed losslessly from JSON. + + Returns: + The exact source frequency as a Decimal. + + Raises: + ValueError: The source type is unknown or its value is nonfinite. + """ + if type(value) not in (int, float, Decimal): + raise ValueError("Expected a JSON number") + result = Decimal(str(value)) + if not result.is_finite(): + raise ValueError("Expected finite frequency") + return result + + +@dataclass(frozen=True) +class DcTieSnapshot(DashboardSnapshot): + """One public DC-tie capture without schedules or historical availability. + + Attributes: + rows: All returned aggregate observations in original source order. + """ + + rows: tuple[DcTieRow, ...] + + +def decode_generation_outages(payload: Payload) -> GenerationOutagesSnapshot: + """Decode one rolling outage payload and validate section/time evidence. + + Args: + payload: Bounded public source bytes and retrieval receipt. + + Returns: + Typed current and previous observations with original labels and bytes. + + Raises: + SchemaMismatchError: Shape, source type, section, or time evidence differs. + """ + body = payload.json() + try: + if set(body) != { + "lastUpdated", + "currentOutages", + "days", + "types", + "current", + "previous", + }: + raise ValueError + updated = _source_time(body["lastUpdated"]) + if type(body["currentOutages"]) is not int: + raise TypeError + if not isinstance(body["types"], list) or sorted(body["types"]) != [ + "Dispatchable", + "Renewable", + ]: + raise ValueError + days = OutageDays.model_validate(body["days"]) + labels = days.previous + days.current + if len(labels) != len(set(labels)): + raise ValueError + for label in labels: + if datetime.date.fromisoformat(label).isoformat() != label: + raise ValueError + sections = [] + for name in ("current", "previous"): + observations = [] + previous_epoch = None + for key, value in body[name].items(): + if not isinstance(key, str) or not key.isascii() or not key.isdecimal(): + raise ValueError + row = GenerationOutageRow.model_validate(value) + stamp = _source_time(row.deliveryTime) + epoch = int(key) + if ( + epoch != int(stamp.timestamp() * 1000) + or stamp > updated + or stamp.date().isoformat() not in getattr(days, name) + or (previous_epoch is not None and epoch <= previous_epoch) + ): + raise ValueError + observations.append(OutageObservation(key, stamp, row)) + previous_epoch = epoch + sections.append(tuple(observations)) + return GenerationOutagesSnapshot( + body["lastUpdated"], + updated, + payload.receipt, + payload.body, + body["currentOutages"], + days, + tuple(body["types"]), + *sections, + ) + except (AttributeError, KeyError, TypeError, ValueError): + pass + raise SchemaMismatchError("Generation outages differ from the observed contract") + + +def decode_dc_tie_flows(payload: Payload) -> DcTieSnapshot: + """Decode one aggregate DC-tie capture with its signed source values. + + Args: + payload: Bounded public source bytes and retrieval receipt. + + Returns: + Typed aggregate rows, original time labels and bytes, and receipt. + + Raises: + SchemaMismatchError: Fields, types, ordering, or time evidence differs. + """ + body = payload.json() + try: + if set(body) != {"lastUpdated", "data"}: + raise ValueError + updated = _source_time(body["lastUpdated"]) + if not isinstance(body["data"], list): + raise TypeError + rows = tuple(DcTieRow.model_validate(value) for value in body["data"]) + previous = None + for row in rows: + stamp = _source_time(row.timestamp) + if ( + row.epoch != int(stamp.timestamp() * 1000) + or row.interval != stamp.strftime("%H:%M:%S") + or stamp > updated + or (previous is not None and row.epoch <= previous) + ): + raise ValueError + previous = row.epoch + return DcTieSnapshot( + body["lastUpdated"], + updated, + payload.receipt, + payload.body, + rows, + ) + except (KeyError, TypeError, ValueError): + pass + raise SchemaMismatchError("DC-tie flows differ from the observed contract") + + +class AggregateDashboardClient(DashboardClient): + """Anonymous outage and DC-tie captures using existing dashboard safeguards. + + Inherits connection lifetime, limits, and the two existing capture methods. + No credentials, private telemetry, schedule data, or historical date queries + are used. Returned prior rows belong to the source's single rolling capture. + """ + + def generation_outages(self) -> GenerationOutagesSnapshot: + """Capture current and rolling previous public generation outages once. + + Returns: + Typed resource aggregates, source time evidence, and raw receipt. + + Raises: + PublicDataError: Bounded transport or observed schema checks fail. + """ + return decode_generation_outages( + self._http.request("GET", GENERATION_OUTAGES_URL) + ) + + def dc_tie_flows(self) -> DcTieSnapshot: + """Capture public DC-tie aggregate flows once without polling. + + Returns: + Typed signed flows, frequency, inertia, time evidence, and receipt. + + Raises: + PublicDataError: Bounded transport or observed schema checks fail. + """ + return decode_dc_tie_flows(self._http.request("GET", DC_TIE_FLOWS_URL)) diff --git a/tinyercot/public/api.py b/tinyercot/public/api.py index fd3abb68..4c989155 100644 --- a/tinyercot/public/api.py +++ b/tinyercot/public/api.py @@ -393,12 +393,21 @@ def _price_payload(self, path: str, params: dict) -> Payload: raise ValueError("Unsupported price path") return self._authenticated_payload(path, params) - def _authenticated_payload(self, path: str, params: dict) -> Payload: + def _authenticated_payload( + self, + path: str, + params: dict, + *, + method: str = "GET", + json_body: dict | None = None, + ) -> Payload: """Fetch a route already checked by an opt-in public adapter. Args: path: Adapter-verified relative public report path. params: Validated public query parameters. + method: Adapter-verified GET or selected archive download POST. + json_body: Explicit public document selection, if required. Returns: Public bytes after bounded token acquisition and transport retries. @@ -412,9 +421,10 @@ def _authenticated_payload(self, path: str, params: dict) -> Payload: self.refresh_token() try: return self._http.request( - "GET", + method, BASE + path, params=params, + json_body=json_body, headers={ "Authorization": f"Bearer {self._token}", "Ocp-Apim-Subscription-Key": self._credentials.subscription_key, diff --git a/tinyercot/public/api_archives.py b/tinyercot/public/api_archives.py new file mode 100644 index 00000000..bf0f12d2 --- /dev/null +++ b/tinyercot/public/api_archives.py @@ -0,0 +1,387 @@ +"""Public Reports archive metadata and one explicitly selected ZIP download. + +Source: https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview +Only archive metadata is typed here. Binary file row schemas remain unknown. +""" + +import datetime +import re +import zipfile +import zlib +from dataclasses import dataclass, field +from typing import Literal, cast + +from tinyercot.catalog import Access + +from ._http import ( + AccessDeniedError, + Receipt, + SchemaMismatchError, +) +from .api import BASE +from .archives import checked_zip +from .metadata import MetadataClient, Product + +# Retirement is lifecycle evidence, not an entitlement or history-availability gate. +_RETIRED = frozenset( + {"np4-179-cd", "np3-990-ex", "np6-569-cd", "np6-655-cd", "np6-913-cd"} +) + + +@dataclass(frozen=True) +class APIArchive: + """One publicly listed archive document, without an inferred file schema. + + Attributes: + emil_id: Normalized public product identifier. + document_id: Source integer document identity. + friendly_name: Source document label, never interpreted as a local path. + post_datetime: Original publication text. A missing offset stays missing. + """ + + emil_id: str + document_id: int + friendly_name: str + post_datetime: str + + +@dataclass(frozen=True) +class APIArchivePage: + """A source archive listing page with explicit pagination evidence. + + Attributes: + documents: Public archive identities in source order. + total_records: Source-advertised document count, not row count. + page_size: Source-advertised listing page size. + total_pages: Source-advertised listing page count. + current_page: Source-advertised current page number. + receipt: Exact metadata response identity. + lifecycle: Root/audit lifecycle evidence, independent of public history access. + """ + + documents: tuple[APIArchive, ...] + total_records: int + page_size: int + total_pages: int + current_page: int + receipt: Receipt + lifecycle: Literal["active", "retired-or-inactive", "unknown"] = "unknown" + + +@dataclass(frozen=True) +class APIBundle(APIArchive): + """A separately listed historical bundle with a source signed document ID. + + Attributes: + emil_id: Normalized public product identifier. + document_id: Source signed bundle identity; observed IDs are negative. + friendly_name: Original historical-bundle label. + post_datetime: Original publication text, without inferred timezone. + """ + + +@dataclass(frozen=True) +class APIBundlePage(APIArchivePage): + """A historical bundle page with the archive-page pagination attributes. + + Attributes: + documents: Source-order bundle identities requiring download_bundle(). + """ + + documents: tuple[APIBundle, ...] + + +@dataclass(frozen=True) +class APIArchiveFile: + """One bounded ZIP with no asserted typed file-row coverage. + + Attributes: + document: Explicitly selected source archive identity. + receipt: Download URL, retrieval time, exact hash and received byte count. + members: Validated ZIP member names; nothing is extracted to disk. + body: Complete bounded ZIP bytes, excluded from the object representation. + row_schema: Always unknown; this adapter does not decode member rows. + """ + + document: APIArchive + receipt: Receipt + members: tuple[str, ...] + body: bytes = field(repr=False) + row_schema: Literal["unknown"] = "unknown" + + +class APIArchiveClient(MetadataClient): + """A public archive client gated by this instance's fetched product metadata. + + Call products() before archives(). Each metadata refresh invalidates previous + download selections. Public historical files remain selectable for inactive + or retired products when the current listing verifies their availability. + """ + + def products(self) -> tuple[tuple[Product, ...], Receipt]: + """Fetch root metadata and reset this instance's public archive gate. + + Returns: + Source product metadata and its public response receipt. Restricted + and unknown entries remain visible but cannot authorize downloads. + + Raises: + PublicDataError: Root retrieval or metadata validation fails. + """ + self._archive_products: dict[str, Product] = {} + self._archive_documents: dict[tuple[str, int], APIArchive] = {} + self._bundle_documents: dict[tuple[str, int], APIArchive] = {} + products, receipt = super().products() + self._archive_products = { + product.emil_id.lower(): product for product in products + } + return products, receipt + + def archives(self, emil_id: str) -> APIArchivePage: + """Fetch one archive metadata page for an explicitly public root product. + + Args: + emil_id: Product present in this instance's prior products() result. + + Returns: + Typed document metadata with the source's pagination counters. + Further pages are not followed. + + Raises: + ValueError: The identifier is malformed or absent from fetched metadata. + PublicDataError: Access, transport, or source shape fails. + """ + return cast(APIArchivePage, self._history(emil_id, "archive")) + + def bundles(self, emil_id: str) -> APIBundlePage: + """Fetch one historical bundle page for a verified public product. + + Args: + emil_id: Product present in this instance's prior products() result. + + Returns: + Typed bundle identities and source pagination counters. Bundle IDs + are distinct from archive IDs and may be negative. + + Raises: + ValueError: The identifier is malformed or absent from fetched metadata. + PublicDataError: Access, transport, or source shape fails. + """ + return cast(APIBundlePage, self._history(emil_id, "bundle")) + + def _history( + self, emil_id: str, kind: Literal["archive", "bundle"] + ) -> APIArchivePage | APIBundlePage: + """Validate one explicitly selected listing route and its document IDs. + + Args: + emil_id: Caller-selected public product identifier. + kind: Exact listing route; never inferred from a failed request. + + Returns: + A typed page matching the selected source route. + + Raises: + ValueError: The public product identifier is unsupported. + PublicDataError: Access, transport, or listing validation fails. + """ + product_id = emil_id.lower() + if not re.fullmatch(r"[a-z0-9]+(?:-[a-z0-9]+)+", product_id): + raise ValueError("Malformed public product identifier") + products = getattr(self, "_archive_products", {}) + if product_id not in products: + raise ValueError("Call products() and select an observed public product") + product = products[product_id] + if product.access is not Access.PUBLIC: + raise AccessDeniedError("Archive product is not explicitly Public") + lifecycle: Literal["active", "retired-or-inactive", "unknown"] = "unknown" + if product_id in _RETIRED or product.status.casefold() in { + "inactive", + "retired", + }: + lifecycle = "retired-or-inactive" + elif product.status.casefold() == "active": + lifecycle = "active" + cache = self._archive_documents if kind == "archive" else self._bundle_documents + retained = {key: value for key, value in cache.items() if key[0] != product_id} + cache.clear() + cache.update(retained) + payload = self._authenticated_payload(f"/{kind}/" + product_id, {}) + try: + body = payload.json() + if body["product"]["emilId"].lower() != product_id: + raise ValueError + if type(body["product"]["reportTypeId"]) is not int: + raise ValueError + meta = body["_meta"] + counters = tuple( + meta[name] + for name in ("totalRecords", "pageSize", "totalPages", "currentPage") + ) + if any(type(value) is not int or value < 0 for value in counters): + raise ValueError + total, size, pages, current = counters + raw = body[kind + "s"] + if ( + not isinstance(raw, list) + or size < 1 + or current != 1 + or pages != (total + size - 1) // size + or len(raw) != min(total, size) + or body["_links"]["self"]["href"] != BASE + f"/{kind}/" + product_id + ): + raise ValueError + documents = {} + for item in raw: + identity = item["docId"] + name = item["friendlyName"] + posted = item["postDatetime"] + if ( + type(identity) is not int + or not -(2**63) <= identity < 2**63 + or identity == 0 + or (kind == "archive" and identity < 0) + or identity in documents + or not isinstance(name, str) + or not name + or not isinstance(posted, str) + or not posted + ): + raise ValueError + datetime.datetime.fromisoformat(posted) + expected = BASE + f"/{kind}/{product_id}?download={identity}" + if item["_links"]["endpoint"]["href"] != expected: + raise ValueError + model = APIArchive if kind == "archive" else APIBundle + documents[identity] = model(product_id, identity, name, posted) + cache.update({(product_id, key): value for key, value in documents.items()}) + if kind == "bundle": + return APIBundlePage( + cast(tuple[APIBundle, ...], tuple(documents.values())), + total, + size, + pages, + current, + payload.receipt, + lifecycle, + ) + return APIArchivePage( + tuple(documents.values()), + total, + size, + pages, + current, + payload.receipt, + lifecycle, + ) + except (KeyError, TypeError, ValueError, AttributeError): + pass + raise SchemaMismatchError( + "Public archive metadata differs from the observed contract" + ) + + def download( + self, + document: APIArchive, + *, + max_members: int = 64, + max_expanded_bytes: int = 32_000_000, + ) -> APIArchiveFile: + """Download exactly one unchanged listed document as a validated ZIP. + + Args: + document: An unchanged public archive from this instance's listing. + max_members: Maximum ZIP member count, including directories. + max_expanded_bytes: Maximum combined advertised expanded byte count. + + Returns: + Raw ZIP bytes, member names, selection identity and a receipt. Member + row schemas remain unknown and no typed data coverage is asserted. + + Raises: + ValueError: A ZIP structure budget is invalid. + PublicDataError: Selection, transport, ZIP, or byte checks fail. + """ + return self._download(document, "archive", max_members, max_expanded_bytes) + + def download_bundle( + self, + document: APIBundle, + *, + max_members: int = 512, + max_expanded_bytes: int = 256_000_000, + ) -> APIArchiveFile: + """Download one explicitly selected historical bundle using its own route. + + Args: + document: Unchanged public bundle from this instance's bundles() call. + max_members: Maximum ZIP member count, including directories. + max_expanded_bytes: Maximum combined advertised ZIP expansion. + + Returns: + Selected bundle bytes, ZIP member metadata, and a bound receipt. + Member row schemas remain unknown unless a separate decoder verifies them. + + Raises: + ValueError: A ZIP structure budget is invalid. + PublicDataError: Selection, transport, ZIP, or byte checks fail. + """ + return self._download(document, "bundle", max_members, max_expanded_bytes) + + def _download( + self, + document: APIArchive, + kind: Literal["archive", "bundle"], + max_members: int, + max_expanded_bytes: int, + ) -> APIArchiveFile: + """Transfer one document through its explicitly selected source route. + + Args: + document: Unchanged document selected from this route's listing. + kind: Exact download route; no fallback is attempted. + max_members: Maximum ZIP member count. + max_expanded_bytes: Maximum advertised expanded bytes. + + Returns: + Complete bounded ZIP bytes and their selection/receipt identity. + + Raises: + ValueError: A structure budget is invalid. + PublicDataError: Selection, transport, or ZIP validation fails. + """ + if any( + type(value) is not int or value < 1 + for value in (max_members, max_expanded_bytes) + ): + raise ValueError("ZIP structure budgets must be positive") + key = (document.emil_id, document.document_id) + cache_name = "_archive_documents" if kind == "archive" else "_bundle_documents" + if getattr(self, cache_name, {}).get(key) != document: + raise AccessDeniedError( + "Download requires this client's public archive listing" + ) + payload = self._authenticated_payload( + f"/{kind}/{document.emil_id}/download", + {}, + method="POST", + json_body={"docIds": [document.document_id]}, + ) + with checked_zip( + payload.body, max_members=max_members, max_expanded_bytes=max_expanded_bytes + ) as archive: + members = tuple( + item.filename for item in archive.infolist() if not item.is_dir() + ) + if not members: + raise SchemaMismatchError("Public archive ZIP contains no files") + try: + if archive.testzip() is not None: + raise SchemaMismatchError( + "Public archive ZIP member checksum failed" + ) + except (zipfile.BadZipFile, zlib.error, NotImplementedError): + raise SchemaMismatchError( + "Public archive ZIP member decoding failed" + ) from None + return APIArchiveFile(document, payload.receipt, members, payload.body) diff --git a/tinyercot/public/archive_reports.py b/tinyercot/public/archive_reports.py new file mode 100644 index 00000000..63d76760 --- /dev/null +++ b/tinyercot/public/archive_reports.py @@ -0,0 +1,399 @@ +"""Anonymous RT annual archives from ERCOT public report 13061. + +Source: https://www.ercot.com/mp/data-products/data-product-details?id=np6-785-er +The seven-column schema was observed in 2010 and 2026 workbooks. Other schema +epochs fail closed; matching headers do not establish complete annual coverage. +""" + +import datetime +import hashlib +import io +import json +import os +import re +import zipfile +from collections.abc import Generator, Sequence +from dataclasses import asdict, dataclass +from decimal import Decimal +from pathlib import Path +from typing import Self + +import httpx +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr + +from ._http import ( + _HTTP, + AccessDeniedError, + LimitError, + Limits, + Receipt, + SchemaMismatchError, +) +from .archives import ArchiveDocument, Download, checked_zip + +_LIST_URL = "https://www.ercot.com/misapp/servlets/IceDocListJsonWS" +_DOWNLOAD_URL = "https://www.ercot.com/misdownload/servlets/mirDownload" +_HEADER = ( + "Delivery Date", + "Delivery Hour", + "Delivery Interval", + "Repeated Hour Flag", + "Settlement Point Name", + "Settlement Point Type", + "Settlement Point Price", +) + + +class RTArchivePrice(BaseModel): + """Observed public RT workbook fields without an inferred UTC interval. + + Attributes: + delivery_date: Local source delivery date. + delivery_hour: Source delivery hour, from 1 through 24. + delivery_interval: Source quarter-hour interval, from 1 through 4. + repeated_hour_flag: Original flag, without inferred timezone semantics. + settlement_point_name: Original public hub or load-zone identifier. + settlement_point_type: Original source point type. + settlement_point_price: Decimal conversion of the numeric workbook cell. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + delivery_date: datetime.date + delivery_hour: StrictInt = Field(ge=1, le=24) + delivery_interval: StrictInt = Field(ge=1, le=4) + repeated_hour_flag: StrictStr + settlement_point_name: StrictStr + settlement_point_type: StrictStr + settlement_point_price: Decimal = Field(allow_inf_nan=False) + + +@dataclass(frozen=True) +class RTArchiveRecord: + """A typed RT price and its physical source location. + + Attributes: + row: Source price fields. + sheet: Source worksheet name. + row_number: One-based physical row including the header. + member: XLSX member name in the downloaded ZIP. + source_sha256: Exact downloaded ZIP hash. + """ + + row: RTArchivePrice + sheet: str + row_number: int + member: str + source_sha256: str + + +class RTArchiveClient: + """Anonymous, bounded listing and downloads for public RT report 13061.""" + + def __init__( + self, + *, + limits: Limits | None = None, + transport: httpx.BaseTransport | None = None, + ) -> None: + """Create an adapter without making a request. + + Args: + limits: HTTP budgets; defaults allow a 16 MB annual ZIP. + transport: Optional mocked transport for offline verification. + """ + self._http = _HTTP(limits or Limits(max_bytes=16_000_000), transport) + self._listed: dict[str, ArchiveDocument] = {} + + def __enter__(self) -> Self: + """Enter a scope that releases connections on exit. + + Returns: + This client instance. + """ + return self + + def __exit__(self, *exc: object) -> None: + """Release connections without suppressing a caller's exception. + + Args: + *exc: Exception details supplied by the context manager protocol. + """ + self.close() + + def close(self) -> None: + """Release connections and prevent future requests.""" + self._http.close() + + def archives(self) -> tuple[tuple[ArchiveDocument, ...], Receipt]: + """List public annual files, preserving source order and publication time. + + Returns: + Public documents and a listing receipt, without downloading history. + + Raises: + PublicDataError: The source is nonpublic, unavailable, or malformed. + """ + self._listed = {} + payload = self._http.request("GET", _LIST_URL, params={"reportTypeId": 13061}) + try: + entries = payload.json()["ListDocsByRptTypeRes"]["DocumentList"] + if not isinstance(entries, list) or len(entries) > 100: + raise ValueError + documents: dict[str, ArchiveDocument] = {} + for entry in entries: + item = entry["Document"] + if item["SecurityStatus"] != "P": + raise AccessDeniedError( + "RT archive listing contains nonpublic data" + ) + identity = item["DocID"] + name = item["FriendlyName"] + if ( + not isinstance(identity, str) + or not re.fullmatch(r"[0-9]{1,24}", identity) + or not isinstance(name, str) + or not re.fullmatch(r"RTMLZHBSPP_[0-9]{4}", name) + or item["Extension"].lower() != "zip" + or int(item["ReportTypeID"]) != 13061 + or identity in documents + ): + raise ValueError + published = datetime.datetime.fromisoformat(item["PublishDate"]) + size = int(item["ContentSize"]) + if published.tzinfo is None or size < 1: + raise ValueError + documents[identity] = ArchiveDocument( + identity, 13061, name, published, size, "P" + ) + self._listed = documents + return tuple(documents.values()), payload.receipt + except (KeyError, TypeError, ValueError, AttributeError): + pass + raise SchemaMismatchError("RT annual listing differs from the public contract") + + def download(self, document: ArchiveDocument, *, cache: Path) -> Download: + """Download one listed ZIP or reuse its unchanged, hash-verified receipt. + + Args: + document: An unchanged entry from this instance's public listing. + cache: Directory for exclusive, identity-based file and receipt writes. + + Returns: + One complete ZIP with original publication and retrieval evidence. + + Raises: + PublicDataError: Access, transfer, ZIP, or cache validation fails. + OSError: Local cache storage fails. Partial caches require repair. + """ + if ( + document.security != "P" + or document.report_type_id != 13061 + or self._listed.get(document.document_id) != document + ): + raise AccessDeniedError("RT download requires this client's public listing") + if document.byte_count > self._http.limits.max_bytes: + raise LimitError("Advertised RT archive exceeds the download budget") + cache = Path(cache) + if cache.is_symlink(): + raise SchemaMismatchError("RT receipt cache cannot be a symlink") + cache.mkdir(parents=True, exist_ok=True) + path = cache / f"13061-{document.document_id}.zip" + receipt_path = path.with_suffix(".json") + temporary = path.with_suffix(".part") + if ( + any(p.is_symlink() for p in (path, receipt_path, temporary)) + or temporary.exists() + ): + raise SchemaMismatchError("RT cache requires explicit repair") + url = str( + httpx.URL( + _DOWNLOAD_URL, + params={"doclookupId": document.document_id, "reportTypeId": 13061}, + ) + ) + identity = asdict(document) + identity["published_at"] = document.published_at.isoformat() + if path.exists() or receipt_path.exists(): + try: + if ( + path.stat().st_size != document.byte_count + or receipt_path.stat().st_size > 16_000 + ): + raise ValueError + raw = path.read_bytes() + saved = json.loads(receipt_path.read_text()) + record = saved["receipt"] + receipt = Receipt( + record["source_url"], + datetime.datetime.fromisoformat(record["retrieved_at"]), + record["sha256"], + record["byte_count"], + record["status"], + ) + if ( + saved["document"] != identity + or receipt.source_url != url + or receipt.retrieved_at.tzinfo is None + or receipt.status != 200 + or receipt.byte_count != len(raw) + or receipt.sha256 != hashlib.sha256(raw).hexdigest() + ): + raise ValueError + return Download(document, path, receipt, True) + except (OSError, KeyError, TypeError, ValueError): + pass + raise SchemaMismatchError( + "RT cache changed or is incomplete; repair explicitly" + ) + payload = self._http.request("GET", url) + if payload.receipt.byte_count != document.byte_count: + raise SchemaMismatchError("RT download size differs from the listing") + with checked_zip( + payload.body, max_members=24, max_expanded_bytes=64_000_000 + ) as archive: + members = [item for item in archive.infolist() if not item.is_dir()] + if len(members) != 1 or not members[0].filename.lower().endswith(".xlsx"): + raise SchemaMismatchError("RT annual ZIP must contain one XLSX") + descriptor = os.open( + temporary, os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW, 0o600 + ) + try: + with os.fdopen(descriptor, "wb") as stream: + stream.write(payload.body) + stream.flush() + os.fsync(stream.fileno()) + os.link(temporary, path) + finally: + temporary.unlink(missing_ok=True) + record = asdict(payload.receipt) + record["retrieved_at"] = payload.receipt.retrieved_at.isoformat() + descriptor = os.open( + receipt_path, os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW, 0o600 + ) + with os.fdopen(descriptor, "w") as stream: + json.dump({"document": identity, "receipt": record}, stream, indent=2) + stream.write("\n") + return Download(document, path, payload.receipt) + + +def iter_rt_archive( + download: Download, + *, + sheets: Sequence[str] | None = None, + max_rows: int | None = 1000, + max_scan_rows: int | None = 100_000, + max_expanded_bytes: int = 256_000_000, + max_members: int = 512, +) -> Generator[RTArchiveRecord, None, None]: + """Stream public RT workbook rows, rejecting unknown columns and cell types. + + Args: + download: Receipt-verified public report-13061 ZIP. + sheets: Exact worksheet names, or None for every sheet in source order. + max_rows: Yield budget; None permits complete selected-file iteration. + max_scan_rows: Physical row budget; None scans every selected row. + max_expanded_bytes: Maximum expanded bytes in each ZIP layer. + max_members: Maximum members in each ZIP layer. + + Yields: + Typed records preserving duplicates and physical row identities. Close the + generator when stopping early. Budget exhaustion raises before completion. + + Raises: + ValueError: A caller-selected bound or worksheet selection is invalid. + ImportError: The optional files extra is missing. + PublicDataError: Access, receipt, schema, or archive budget checks fail. + OSError: The local file cannot be read. + """ + for value in (max_rows, max_scan_rows): + if value is not None and (type(value) is not int or value < 1): + raise ValueError("Row budgets must be positive or None") + if any(type(v) is not int or v < 1 for v in (max_expanded_bytes, max_members)): + raise ValueError("Archive structure budgets must be positive") + if isinstance(sheets, str) or ( + sheets is not None and (not sheets or len(set(sheets)) != len(sheets)) + ): + raise ValueError("sheets must contain distinct worksheet names") + document = download.document + if document.security != "P" or document.report_type_id != 13061: + raise AccessDeniedError("Only public RT annual files are supported") + if ( + download.path.is_symlink() + or download.path.stat().st_size != download.receipt.byte_count + or download.receipt.byte_count != document.byte_count + or not re.fullmatch(r"RTMLZHBSPP_[0-9]{4}", document.friendly_name) + ): + raise SchemaMismatchError( + "RT archive identity or size differs from its receipt" + ) + raw = download.path.read_bytes() + digest = hashlib.sha256(raw).hexdigest() + if digest != download.receipt.sha256: + raise SchemaMismatchError("RT archive differs from its receipt hash") + from openpyxl import load_workbook + + try: + with checked_zip( + raw, max_members=max_members, max_expanded_bytes=max_expanded_bytes + ) as archive: + members = [item for item in archive.infolist() if not item.is_dir()] + if len(members) != 1 or not members[0].filename.lower().endswith(".xlsx"): + raise SchemaMismatchError("Unsupported RT annual container") + member = members[0].filename + inner = archive.read(members[0]) + with checked_zip( + inner, max_members=max_members, max_expanded_bytes=max_expanded_bytes + ): + pass + workbook = load_workbook( + io.BytesIO(inner), read_only=True, data_only=True, keep_links=False + ) + try: + selected = list(workbook.sheetnames if sheets is None else sheets) + if any(name not in workbook.sheetnames for name in selected): + raise SchemaMismatchError("Requested RT worksheet is absent") + count = scanned = 0 + for name in selected: + iterator = workbook[name].iter_rows(values_only=True) + if tuple(next(iterator, ())) != _HEADER: + raise SchemaMismatchError("Unknown RT annual schema epoch") + for number, cells in enumerate(iterator, start=2): + scanned += 1 + if max_scan_rows is not None and scanned > max_scan_rows: + raise LimitError("RT scan budget reached before completion") + if all(value is None for value in cells): + continue + if max_rows is not None and count >= max_rows: + raise LimitError("RT row budget reached before completion") + if len(cells) != 7: + raise SchemaMismatchError("RT annual columns changed") + day, hour, interval, repeated, point, kind, price = cells + if ( + not isinstance(day, str) + or not re.fullmatch(r"[0-9]{2}/[0-9]{2}/[0-9]{4}", day) + or type(price) not in (int, float) + ): + raise SchemaMismatchError("RT annual cell types changed") + date = datetime.date(int(day[6:]), int(day[:2]), int(day[3:5])) + if date.year != int(document.friendly_name[-4:]): + raise SchemaMismatchError( + "RT row date differs from the listed year" + ) + row = RTArchivePrice( + delivery_date=date, + delivery_hour=hour, + delivery_interval=interval, + repeated_hour_flag=repeated, + settlement_point_name=point, + settlement_point_type=kind, + settlement_point_price=Decimal(str(price)), + ) + count += 1 + yield RTArchiveRecord(row, name, number, member, digest) + finally: + workbook.close() + except (zipfile.BadZipFile, KeyError, TypeError, ValueError): + pass + else: + return + raise SchemaMismatchError("RT workbook differs from the observed contract") diff --git a/tinyercot/public/coverage.py b/tinyercot/public/coverage.py index a36f828d..e56d88e7 100644 --- a/tinyercot/public/coverage.py +++ b/tinyercot/public/coverage.py @@ -17,7 +17,7 @@ class Coverage: Attributes: key: Stable source or operation identity, including service and verb. title: Human-readable family or implemented capability. - status: Covered bounded scope, deferred work, restricted, or unavailable. + status: Covered scope, pending work, retirement, or access boundary. scope: What the status covers and what it does not establish. source_urls: Primary ERCOT references for this entry. product_ids: Relevant source product identifiers, where established. @@ -25,7 +25,9 @@ class Coverage: key: str title: str - status: Literal["covered", "deferred", "restricted", "unavailable"] + status: Literal[ + "covered", "pending", "deferred", "retired", "restricted", "unavailable" + ] scope: str source_urls: tuple[str, ...] product_ids: tuple[str, ...] = () @@ -36,7 +38,7 @@ def coverage() -> tuple[Coverage, ...]: Returns: Immutable scope records. A covered endpoint or web subset does not mark - its entire family covered. Deferred or unknown schemas grant no access. + its entire family covered. Pending or unknown schemas grant no access. The Stage-0 metadata catalog remains an unchanged observation snapshot. """ snapshot = json.loads( @@ -51,6 +53,15 @@ def coverage() -> tuple[Coverage, ...]: for row in snapshot["families"] ] for operation in operations(): + metadata_scope = ( + { + "/": "Installed product-root retrieval: 116 metadata identities with independent public-access and lifecycle checks; no row schema inferred.", + "/archive/{emilId}": "Installed public archive listings for DME and two retired products. First-page listings preserve source totals; no claim of all documents fetched.", + "/bundle/{emilId}": "Installed DAM monthly bundle listing: 103 file identities. Bundle transfer remains unverified after one unsuccessful bounded attempt.", + }.get(operation.path) + if operation.service == "public-reports" and operation.method == "GET" + else None + ) supported = (operation.service, operation.method, operation.path) in { ("public-reports", "GET", endpoint.path) for endpoint in ENDPOINTS } @@ -58,10 +69,13 @@ def coverage() -> tuple[Coverage, ...]: Coverage( f"api:{operation.service}:{operation.method}:{operation.path}", operation.path, - "covered" if supported else "deferred", - "Observed non-null row schema and generated query filters; opt-in complete page/row iteration with explicit budgets. Current and oldest-first samples verified; no full-history, as-of, or schema-epoch guarantee." - if supported - else "No opt-in retrieval implementation or verified current row contract.", + "covered" if supported or metadata_scope else "pending", + metadata_scope + or ( + "Observed required fields, explicitly observed nullability, and generated query filters; opt-in complete page/row iteration with explicit budgets. Two bounded source selections verified through the installed wheel; oldest chronology requires a temporal sort. No full-history, as-of, or schema-epoch guarantee." + if supported + else "Active public coverage work. No verified typed row contract for this operation; missing schemas remain unsupported. Retirement and document/history access are tracked separately." + ), (operation.source_url,), ) ) @@ -89,4 +103,51 @@ def coverage() -> tuple[Coverage, ...]: ), ) ) + for key, title, scope, url, product in ( + ( + "resource-dme", + "Public Resource DME CSV documents", + "Exact seven-column string schema decoded from two verified current/oldest listed source ZIPs through the installed wheel. Document transfers observed during discovery; installed decoding reused captures. Generic archive files remain row-schema unknown.", + "https://www.ercot.com/mp/data-products/data-product-details?id=np3-988-er", + "NP3-988-ER", + ), + ( + "rt-annual", + "Public RT annual ZIP/XLSX retrieval", + "Report 13061 listing and bounded streaming worksheet iteration. Installed-client listing and cached 2010/2026 source decoding verified. Complete requested file iteration is opt-in; no full-year extraction occurred.", + "https://www.ercot.com/mp/data-products/data-product-details?id=np6-785-er", + "NP6-785-ER", + ), + ( + "fuel-mix", + "Public rolling fuel mix", + "Typed source fuel values and timestamps from one bounded installed-client snapshot; no historical API or automatic polling.", + "https://www.ercot.com/api/1/services/read/dashboards/fuel-mix.json", + "GEN-544-UI", + ), + ( + "grid-conditions", + "Public rolling grid conditions and PRC", + "Typed condition and PRC rows with source freshness from one bounded installed-client snapshot; no historical API or automatic polling.", + "https://www.ercot.com/api/1/services/read/dashboards/daily-prc.json", + "GEN-543-UI", + ), + ( + "generation-outages", + "Public generation outage aggregates", + "Typed current/previous day outage aggregates, source timestamps and freshness from one bounded installed-client snapshot; no unit-private telemetry.", + "https://www.ercot.com/api/1/services/read/dashboards/generation-outages.json", + "GEN-546-UI", + ), + ( + "dc-tie-flows", + "Public rolling DC tie aggregates", + "Typed signed public flow series with source epoch/offset validation from one bounded installed-client snapshot; no private telemetry or historical API.", + "https://www.ercot.com/api/1/services/read/dashboards/dc-tie-flows.json", + "GEN-538-UI", + ), + ): + entries.append( + Coverage(f"web:{key}", title, "covered", scope, (url,), (product,)) + ) return tuple(entries) diff --git a/tinyercot/public/dashboards.py b/tinyercot/public/dashboards.py new file mode 100644 index 00000000..9539ec6c --- /dev/null +++ b/tinyercot/public/dashboards.py @@ -0,0 +1,372 @@ +"""Anonymous fuel-mix and Daily PRC snapshots from ERCOT's public dashboards. + +The source pages link these JSON routes directly. Explicit models describe the +observed payloads, not a guaranteed service schema or historical availability. +See docs/public-dashboards.md for primary sources and fixture provenance. +""" + +import datetime +from dataclasses import dataclass, field +from decimal import Decimal +from typing import Self +from zoneinfo import ZoneInfo + +import httpx +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, field_validator + +from ._http import _HTTP, Limits, Payload, Receipt, SchemaMismatchError + +FUEL_MIX_URL = "https://www.ercot.com/api/1/services/read/dashboards/fuel-mix.json" +DAILY_PRC_URL = "https://www.ercot.com/api/1/services/read/dashboards/daily-prc.json" + + +def _source_time(value: str) -> datetime.datetime: + """Validate an observed source timestamp against the Texas UTC offset. + + Args: + value: Original timestamp with its explicit offset. + + Returns: + The same instant and source offset, without interpreting DST flags. + + Raises: + ValueError: Text or offset is outside the observed source contract. + """ + stamp = datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S%z") + texas = stamp.astimezone(ZoneInfo("America/Chicago")) + if stamp.utcoffset() != texas.utcoffset(): + raise ValueError("Source offset does not match Texas time") + return stamp + + +class FuelMixValues(BaseModel): + """Eight observed fuel categories in source MW, including signed storage. + + Attributes: + coal_and_lignite: Coal and Lignite source value. + hydro: Hydro source value. + nuclear: Nuclear source value. + other: Other source value. + power_storage: Power Storage source value; negative values are retained. + solar: Solar source value. + wind: Wind source value. + natural_gas: Natural Gas source value. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + coal_and_lignite: Decimal = Field(alias="Coal and Lignite") + hydro: Decimal = Field(alias="Hydro") + nuclear: Decimal = Field(alias="Nuclear") + other: Decimal = Field(alias="Other") + power_storage: Decimal = Field(alias="Power Storage") + solar: Decimal = Field(alias="Solar") + wind: Decimal = Field(alias="Wind") + natural_gas: Decimal = Field(alias="Natural Gas") + + @field_validator("*", mode="before") + @classmethod + def numeric_source(cls, value: object) -> Decimal: + """Require finite JSON numbers without string or boolean coercion. + + Args: + value: One source number, parsed losslessly from JSON. + + Returns: + The exact numeric value as a Decimal. + + Raises: + ValueError: The value is nonnumeric or nonfinite. + """ + if type(value) not in (int, float, Decimal): + raise ValueError("Expected a JSON number") + result = Decimal(str(value)) + if not result.is_finite(): + raise ValueError("Expected a finite number") + return result + + +@dataclass(frozen=True) +class FuelMixRow: + """One generation observation, retaining original day and time labels. + + Attributes: + source_day: Unchanged source day-section key. + source_timestamp: Unchanged source time key, including its offset. + timestamp: Validated observation instant with the source offset. + generation: Source generation MW by fuel; no rounding or aggregation. + """ + + source_day: str + source_timestamp: str + timestamp: datetime.datetime + generation: FuelMixValues + + +@dataclass(frozen=True) +class DashboardSnapshot: + """Common retrieval and freshness evidence for one dashboard capture. + + Attributes: + source_last_updated: Original source update text, including its offset. + last_updated: Validated source update instant. + receipt: Retrieval time, public URL, HTTP status, and response hash. + raw: Original response bytes, preserving source fields and labels. + """ + + source_last_updated: str + last_updated: datetime.datetime + receipt: Receipt + raw: bytes = field(repr=False) + + def is_stale( + self, *, max_age: datetime.timedelta = datetime.timedelta(minutes=10) + ) -> bool: + """Compare source update time against this capture's retrieval time. + + Args: + max_age: Acceptable age selected by the caller, not a source SLA. + + Returns: + True when the source update is too old or is in the future. + + Raises: + ValueError: max_age is negative. + """ + if max_age < datetime.timedelta(0): + raise ValueError("max_age must be nonnegative") + age = self.receipt.retrieved_at - self.last_updated + return age < datetime.timedelta(0) or age > max_age + + +@dataclass(frozen=True) +class FuelMixSnapshot(DashboardSnapshot): + """One rolling fuel-mix capture with source capacity kept separate. + + Attributes: + monthly_capacity: Source monthlyCapacity MW, not per-interval generation. + rows: Observations in source day/time order, without history guarantees. + """ + + monthly_capacity: FuelMixValues + rows: tuple[FuelMixRow, ...] + + +class GridCondition(BaseModel): + """Unchanged source status fields from the Daily PRC dashboard. + + Strings remain source labels, not a client-defined emergency-state enum. + + Attributes: + condition_note: Source explanatory status text. + eea_level: Raw source EEA level integer. + energy_level_value: Raw source energy level integer. + state: Raw source condition state. + title: Raw source condition title. + prc_value: Source display value, including thousands separators. + index: Raw source index, not a pagination cursor. + datetime: Source epoch seconds for the condition. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + condition_note: StrictStr + eea_level: StrictInt + energy_level_value: StrictInt + state: StrictStr + title: StrictStr + prc_value: StrictStr + index: StrictInt + datetime: StrictInt + + +class PrcRow(BaseModel): + """One source Physical Responsive Capability observation in MW. + + Attributes: + timestamp: Original source timestamp, including its UTC offset. + epoch: Source epoch milliseconds, verified against timestamp. + interval: Original local interval text, verified against timestamp. + dstFlag: Raw source DST flag without inferred meaning. + prc: Source PRC MW integer. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + timestamp: StrictStr + epoch: StrictInt + interval: StrictStr + dstFlag: StrictStr + prc: StrictInt + + +@dataclass(frozen=True) +class GridConditionsSnapshot(DashboardSnapshot): + """One Daily PRC capture, including its current grid-condition status. + + Attributes: + current_condition: Unmodified source condition fields. + rows: Source-order PRC observations with verified time evidence. + """ + + current_condition: GridCondition + rows: tuple[PrcRow, ...] + + +def decode_fuel_mix(payload: Payload) -> FuelMixSnapshot: + """Decode the observed eight-fuel rolling feed without inferring history. + + Args: + payload: Bounded public JSON bytes and retrieval receipt. + + Returns: + Typed generation, monthly capacity, original timestamps, and raw bytes. + + Raises: + SchemaMismatchError: Field names, types, or time evidence differ. + """ + body = payload.json() + try: + if set(body) != {"lastUpdated", "monthlyCapacity", "data"}: + raise ValueError + updated = _source_time(body["lastUpdated"]) + capacity = FuelMixValues.model_validate(body["monthlyCapacity"]) + rows = [] + previous = None + for day, observations in body["data"].items(): + if datetime.date.fromisoformat(day).isoformat() != day: + raise ValueError + for text, fuels in observations.items(): + stamp = _source_time(text) + if stamp.date().isoformat() != day or stamp > updated: + raise ValueError + if previous is not None and stamp <= previous: + raise ValueError + values = {} + for name, value in fuels.items(): + if set(value) != {"gen"}: + raise ValueError + values[name] = value["gen"] + rows.append( + FuelMixRow(day, text, stamp, FuelMixValues.model_validate(values)) + ) + previous = stamp + return FuelMixSnapshot( + body["lastUpdated"], + updated, + payload.receipt, + payload.body, + capacity, + tuple(rows), + ) + except (AttributeError, KeyError, TypeError, ValueError): + pass + raise SchemaMismatchError("Fuel mix differs from the observed source contract") + + +def decode_grid_conditions(payload: Payload) -> GridConditionsSnapshot: + """Decode Daily PRC and preserve the current condition status verbatim. + + Args: + payload: Bounded public JSON bytes and retrieval receipt. + + Returns: + Typed PRC rows, source condition, time evidence, and raw response bytes. + + Raises: + SchemaMismatchError: Field names, types, or time evidence differ. + """ + body = payload.json() + try: + if set(body) != {"lastUpdated", "current_condition", "data"}: + raise ValueError + updated = _source_time(body["lastUpdated"]) + condition = GridCondition.model_validate(body["current_condition"]) + if condition.datetime != int(updated.timestamp()): + raise ValueError + if not isinstance(body["data"], list): + raise TypeError + rows = tuple(PrcRow.model_validate(row) for row in body["data"]) + previous = None + for row in rows: + stamp = _source_time(row.timestamp) + if ( + row.epoch != int(stamp.timestamp() * 1000) + or row.interval != stamp.strftime("%H:%M:%S") + or stamp > updated + or (previous is not None and row.epoch <= previous) + ): + raise ValueError + previous = row.epoch + return GridConditionsSnapshot( + body["lastUpdated"], + updated, + payload.receipt, + payload.body, + condition, + rows, + ) + except (KeyError, TypeError, ValueError): + pass + raise SchemaMismatchError("Daily PRC differs from the observed source contract") + + +class DashboardClient: + """Anonymous, bounded captures of two explicitly supported website feeds. + + Methods perform one logical capture with bounded retries. They do not poll, + fetch historical dates, or claim the rolling rows establish retention. + """ + + def __init__( + self, + *, + limits: Limits | None = None, + transport: httpx.BaseTransport | None = None, + ) -> None: + """Create an anonymous dashboard client without making requests. + + Args: + limits: Request, response-size, retry, and pacing safeguards. + transport: Optional mocked HTTPX transport for offline validation. + """ + self._http = _HTTP(limits or Limits(), transport) + + def __enter__(self) -> Self: + """Enter a context that closes HTTP connections on exit. + + Returns: + This client instance. + """ + return self + + def __exit__(self, *exc: object) -> None: + """Close connections when the context ends. + + Args: + *exc: Context exception details; exceptions are not suppressed. + """ + self.close() + + def close(self) -> None: + """Release this instance's HTTP connections.""" + self._http.close() + + def fuel_mix(self) -> FuelMixSnapshot: + """Capture the anonymous rolling fuel-mix feed once. + + Returns: + Typed source values and explicit receipt and freshness evidence. + + Raises: + PublicDataError: Transport, byte budget, or schema validation fails. + """ + return decode_fuel_mix(self._http.request("GET", FUEL_MIX_URL)) + + def grid_conditions(self) -> GridConditionsSnapshot: + """Capture anonymous Daily PRC and its grid-condition status once. + + Returns: + Typed PRC observations and unchanged source status fields. + + Raises: + PublicDataError: Transport, byte budget, or schema validation fails. + """ + return decode_grid_conditions(self._http.request("GET", DAILY_PRC_URL)) diff --git a/tinyercot/public/metadata.py b/tinyercot/public/metadata.py new file mode 100644 index 00000000..3995ccc0 --- /dev/null +++ b/tinyercot/public/metadata.py @@ -0,0 +1,178 @@ +"""Explicit public product and artifact discovery, separate from typed row coverage.""" + +import re +from dataclasses import dataclass, field +from typing import Any +from urllib.parse import urlsplit + +from tinyercot.catalog import Access, classify_access, operations + +from ._http import Receipt, SchemaMismatchError +from .api import BASE, PublicClient + +# Current product metadata still says Active; audited retirement notices prevail. +RETIRED_PRODUCTS = frozenset({"NP4-179-CD", "NP3-990-EX"}) + + +@dataclass(frozen=True) +class Artifact: + """One source artifact link, without an inferred response schema. + + Attributes: + report_type_id: Source report identity. + display_name: Source artifact title. + path: Same-service endpoint path, or None when no endpoint is advertised. + """ + + report_type_id: int + display_name: str + path: str | None + + +@dataclass(frozen=True) +class Product: + """Source product metadata with independent access and lifecycle evidence. + + Attributes: + emil_id: Source product identity, without case conversion. + name: Source product title. + status: Source lifecycle status; does not override retirement notices. + access: Source security classification, independent of authentication. + content_type: DATA or BINARY as advertised by ERCOT. + artifacts: Source artifact links; a link does not verify a row schema. + raw: Original public product metadata, including additional fields. + """ + + emil_id: str + name: str + status: str + access: Access + content_type: str + artifacts: tuple[Artifact, ...] + raw: dict[str, Any] = field(repr=False, compare=False) + + +def decode_product(body: Any) -> Product: + """Validate observed product identities without guessing optional metadata. + + Args: + body: One public product metadata object. + + Returns: + Required identities, access evidence and artifact links with raw metadata. + + Raises: + SchemaMismatchError: Required metadata or same-service links differ. + """ + try: + for name in ("emilId", "name", "status", "contentType"): + if type(body[name]) is not str or not body[name]: + raise ValueError + source = body.get("securityClassification") + if source is not None and type(source) is not str: + raise ValueError + audience = body.get("audience") + if audience is not None and type(audience) is not str: + raise ValueError + access = classify_access(source) + audience_access = classify_access(audience) + if Access.RESTRICTED in (access, audience_access): + access = Access.RESTRICTED + elif access is not Access.PUBLIC or audience_access is not Access.PUBLIC: + access = Access.UNKNOWN + artifacts = [] + for artifact in body["artifacts"]: + if ( + type(artifact["reportTypeId"]) is not int + or type(artifact["displayName"]) is not str + ): + raise ValueError + endpoint = artifact.get("_links", {}).get("endpoint", {}).get("href") + path = None + if endpoint is not None: + url = urlsplit(endpoint) + if ( + url.scheme != "https" + or url.netloc != "api.ercot.com" + or url.query + or url.fragment + or not url.path.startswith( + "/api/public-reports/" + body["emilId"].lower() + "/" + ) + ): + raise ValueError + path = url.path.removeprefix("/api/public-reports") + if not re.fullmatch(r"/[a-z0-9-]+/[a-zA-Z0-9_]+", path): + raise ValueError + artifacts.append( + Artifact(artifact["reportTypeId"], artifact["displayName"], path) + ) + return Product( + body["emilId"], + body["name"], + body["status"], + access, + body["contentType"], + tuple(artifacts), + dict(body), + ) + except (KeyError, TypeError, ValueError, AttributeError): + raise SchemaMismatchError( + "Public product metadata differs from its observed contract" + ) from None + + +class MetadataClient(PublicClient): + """An opt-in Public Reports metadata client; row schemas remain independent.""" + + def products(self) -> tuple[tuple[Product, ...], Receipt]: + """Fetch the public product root without following artifact links. + + Returns: + Source-order product metadata and exact response provenance. + + Raises: + PublicDataError: Access, transport, byte limits, or metadata fail. + """ + payload = self._authenticated_payload("/", {}) + try: + raw = payload.json()["_embedded"]["products"] + if not isinstance(raw, list): + raise TypeError + products = tuple(decode_product(item) for item in raw) + if len({p.emil_id for p in products}) != len(products): + raise ValueError + return products, payload.receipt + except (KeyError, TypeError, ValueError): + raise SchemaMismatchError( + "Public product root differs from its observed contract" + ) from None + + def product(self, emil_id: str) -> tuple[Product, Receipt]: + """Fetch one product already present in the offline public path inventory. + + Args: + emil_id: Case-insensitive observed Public Reports product identity. + + Returns: + Source metadata and its exact public response receipt. + + Raises: + ValueError: The product is outside the observed public inventory. + PublicDataError: Retrieval or metadata validation fails. + """ + known = { + op.path.split("/")[1] + for op in operations(service="public-reports") + if op.kind == "data" + } + if emil_id.lower() not in known: + raise ValueError("Product is outside the observed public inventory") + payload = self._authenticated_payload("/" + emil_id.lower(), {}) + product = decode_product(payload.json()) + if ( + product.emil_id.lower() != emil_id.lower() + or not payload.receipt.source_url.startswith(BASE) + ): + raise SchemaMismatchError("Product identity differs from the request") + return product, payload.receipt diff --git a/tinyercot/public/products.py b/tinyercot/public/products.py new file mode 100644 index 00000000..947bc317 --- /dev/null +++ b/tinyercot/public/products.py @@ -0,0 +1,294 @@ +"""Generated typed public product facades; use with ReportsClient.""" + +from . import _schemas + + +class gen_55_cd: + """Verified operations for public product GEN-55-CD.""" + + hrly_rt_load_fcast_actual = _schemas.GEN_55_CD_HRLY_RT_LOAD_FCAST_ACTUAL + + +class np1_302: + """Verified operations for public product NP1-302.""" + + as_obligation = _schemas.NP1_302_AS_OBLIGATION + + +class np3_161_cd: + """Verified operations for public product NP3-161-CD.""" + + _7d_plus_avail_res_poc_margin = _schemas.NP3_161_CD_7D_PLUS_AVAIL_RES_POC_MARGIN + + +class np3_162_cd: + """Verified operations for public product NP3-162-CD.""" + + _7d_avail_res_poc_margin = _schemas.NP3_162_CD_7D_AVAIL_RES_POC_MARGIN + + +class np3_233_cd: + """Verified operations for public product NP3-233-CD.""" + + hourly_res_outage_cap = _schemas.NP3_233_CD_HOURLY_RES_OUTAGE_CAP + + +class np3_560_cd: + """Verified operations for public product NP3-560-CD.""" + + _7d_load_fcast_by_fzn = _schemas.NP3_560_CD_7D_LOAD_FCAST_BY_FZN + + +class np3_561_cd: + """Verified operations for public product NP3-561-CD.""" + + _7d_load_fcast_by_wzn = _schemas.NP3_561_CD_7D_LOAD_FCAST_BY_WZN + + +class np3_562_cd: + """Verified operations for public product NP3-562-CD.""" + + ih_load_fcast_by_wzn = _schemas.NP3_562_CD_IH_LOAD_FCAST_BY_WZN + + +class np3_565_cd: + """Verified operations for public product NP3-565-CD.""" + + lf_by_model_weather_zone = _schemas.NP3_565_CD_LF_BY_MODEL_WEATHER_ZONE + + +class np4_158_sg: + """Verified operations for public product NP4-158-SG.""" + + dam_essps = _schemas.NP4_158_SG_DAM_ESSPS + + +class np4_159_cd: + """Verified operations for public product NP4-159-CD.""" + + load_distribution_factors = _schemas.NP4_159_CD_LOAD_DISTRIBUTION_FACTORS + + +class np4_183_cd: + """Verified operations for public product NP4-183-CD.""" + + dam_hourly_lmp = _schemas.NP4_183_CD_DAM_HOURLY_LMP + + +class np4_188_cd: + """Verified operations for public product NP4-188-CD.""" + + dam_clear_price_for_cap = _schemas.DAM_CAPACITY_PRICES + + +class np4_19_cd: + """Verified operations for public product NP4-19-CD.""" + + dam_agg_as_offer_curve = _schemas.NP4_19_CD_DAM_AGG_AS_OFFER_CURVE + + +class np4_190_cd: + """Verified operations for public product NP4-190-CD.""" + + dam_stlmnt_pnt_prices = _schemas.DAM_PRICES + + +class np4_191_cd: + """Verified operations for public product NP4-191-CD.""" + + dam_shadow_prices = _schemas.NP4_191_CD_DAM_SHADOW_PRICES + + +class np4_192_cd: + """Verified operations for public product NP4-192-CD.""" + + dam_total_energy_purchased = _schemas.NP4_192_CD_DAM_TOTAL_ENERGY_PURCHASED + + +class np4_193_cd: + """Verified operations for public product NP4-193-CD.""" + + total_dam_energy_sold = _schemas.NP4_193_CD_TOTAL_DAM_ENERGY_SOLD + + +class np4_194_cd: + """Verified operations for public product NP4-194-CD.""" + + dam_ptp_obligation_sp_results = _schemas.NP4_194_CD_DAM_PTP_OBLIGATION_SP_RESULTS + + +class np4_196_m: + """Verified operations for public product NP4-196-M.""" + + dam_price_corrections_eblmp = _schemas.NP4_196_M_DAM_PRICE_CORRECTIONS_EBLMP + dam_price_corrections_mcpc = _schemas.NP4_196_M_DAM_PRICE_CORRECTIONS_MCPC + dam_price_corrections_spp = _schemas.NP4_196_M_DAM_PRICE_CORRECTIONS_SPP + + +class np4_197_m: + """Verified operations for public product NP4-197-M.""" + + rtm_price_corrections_eblmp = _schemas.NP4_197_M_RTM_PRICE_CORRECTIONS_EBLMP + rtm_price_corrections_mcpc_sced = _schemas.NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SCED + rtm_price_corrections_mcpc_spp = _schemas.NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SPP + rtm_price_corrections_shadow = _schemas.NP4_197_M_RTM_PRICE_CORRECTIONS_SHADOW + rtm_price_corrections_soglmp = _schemas.NP4_197_M_RTM_PRICE_CORRECTIONS_SOGLMP + rtm_price_corrections_sogprice = _schemas.NP4_197_M_RTM_PRICE_CORRECTIONS_SOGPRICE + rtm_price_corrections_splmp = _schemas.NP4_197_M_RTM_PRICE_CORRECTIONS_SPLMP + rtm_price_corrections_spp = _schemas.NP4_197_M_RTM_PRICE_CORRECTIONS_SPP + + +class np4_200_cd: + """Verified operations for public product NP4-200-CD.""" + + dam_de_energized_spbc = _schemas.NP4_200_CD_DAM_DE_ENERGIZED_SPBC + + +class np4_212_cd: + """Verified operations for public product NP4-212-CD.""" + + dam_sced_as_demand_curves = _schemas.NP4_212_CD_DAM_SCED_AS_DEMAND_CURVES + + +class np4_213_cd: + """Verified operations for public product NP4-213-CD.""" + + hruc_as_demand_curves = _schemas.NP4_213_CD_HRUC_AS_DEMAND_CURVES + + +class np4_214_cd: + """Verified operations for public product NP4-214-CD.""" + + druc_as_demand_curves = _schemas.NP4_214_CD_DRUC_AS_DEMAND_CURVES + + +class np4_215_cd: + """Verified operations for public product NP4-215-CD.""" + + wruc_as_demand_curves = _schemas.NP4_215_CD_WRUC_AS_DEMAND_CURVES + + +class np4_231_cd: + """Verified operations for public product NP4-231-CD.""" + + electrical_bus_map_heur_price = _schemas.NP4_231_CD_ELECTRICAL_BUS_MAP_HEUR_PRICE + + +class np4_33_cd: + """Verified operations for public product NP4-33-CD.""" + + dam_as_plan = _schemas.NP4_33_CD_DAM_AS_PLAN + + +class np4_523_cd: + """Verified operations for public product NP4-523-CD.""" + + dam_system_lambda = _schemas.NP4_523_CD_DAM_SYSTEM_LAMBDA + + +class np6_322_cd: + """Verified operations for public product NP6-322-CD.""" + + sced_system_lambda = _schemas.NP6_322_CD_SCED_SYSTEM_LAMBDA + + +class np6_323_cd: + """Verified operations for public product NP6-323-CD.""" + + rt_price_adder_sced = _schemas.NP6_323_CD_RT_PRICE_ADDER_SCED + + +class np6_324_cd: + """Verified operations for public product NP6-324-CD.""" + + rt_15min_price_adders = _schemas.NP6_324_CD_RT_15MIN_PRICE_ADDERS + + +class np6_325_cd: + """Verified operations for public product NP6-325-CD.""" + + rtd_price_adders = _schemas.NP6_325_CD_RTD_PRICE_ADDERS + + +class np6_326_cd: + """Verified operations for public product NP6-326-CD.""" + + rt_price_sog = _schemas.NP6_326_CD_RT_PRICE_SOG + + +class np6_327_cd: + """Verified operations for public product NP6-327-CD.""" + + lmp_sog_price_adders = _schemas.NP6_327_CD_LMP_SOG_PRICE_ADDERS + + +class np6_328_cd: + """Verified operations for public product NP6-328-CD.""" + + tot_as_res_cap = _schemas.NP6_328_CD_TOT_AS_RES_CAP + + +class np6_329_cd: + """Verified operations for public product NP6-329-CD.""" + + rtd_ind_mcpc = _schemas.NP6_329_CD_RTD_IND_MCPC + + +class np6_331_cd: + """Verified operations for public product NP6-331-CD.""" + + rt_clear_price_cap = _schemas.NP6_331_CD_RT_CLEAR_PRICE_CAP + + +class np6_332_cd: + """Verified operations for public product NP6-332-CD.""" + + rt_clear_price_cap_sced = _schemas.NP6_332_CD_RT_CLEAR_PRICE_CAP_SCED + + +class np6_345_cd: + """Verified operations for public product NP6-345-CD.""" + + act_sys_load_by_wzn = _schemas.SYSTEM_LOAD + + +class np6_346_cd: + """Verified operations for public product NP6-346-CD.""" + + act_sys_load_by_fzn = _schemas.NP6_346_CD_ACT_SYS_LOAD_BY_FZN + + +class np6_787_cd: + """Verified operations for public product NP6-787-CD.""" + + lmp_electrical_bus = _schemas.NP6_787_CD_LMP_ELECTRICAL_BUS + + +class np6_788_cd: + """Verified operations for public product NP6-788-CD.""" + + lmp_node_zone_hub = _schemas.NP6_788_CD_LMP_NODE_ZONE_HUB + + +class np6_86_cd: + """Verified operations for public product NP6-86-CD.""" + + shdw_prices_bnd_trns_const = _schemas.NP6_86_CD_SHDW_PRICES_BND_TRNS_CONST + + +class np6_905_cd: + """Verified operations for public product NP6-905-CD.""" + + spp_node_zone_hub = _schemas.RT_PRICES + + +class np6_915_cd: + """Verified operations for public product NP6-915-CD.""" + + sum_hdl_ldl = _schemas.NP6_915_CD_SUM_HDL_LDL + + +class np6_970_cd: + """Verified operations for public product NP6-970-CD.""" + + rtd_lmp_node_zone_hub = _schemas.NP6_970_CD_RTD_LMP_NODE_ZONE_HUB diff --git a/tinyercot/public/reports.py b/tinyercot/public/reports.py index bd563b15..b1b4a3b7 100644 --- a/tinyercot/public/reports.py +++ b/tinyercot/public/reports.py @@ -62,6 +62,17 @@ def query_parameters( if kind == "string" and schema.get("format") == "yyyy-MM-dd": valid = type(value) is datetime.date encoded = value.isoformat() if isinstance(value, datetime.date) else "" + elif kind == "string" and schema.get("format") == "yyyy-MM-ddTH24:mm:ss": + valid = ( + type(value) is datetime.datetime + and value.tzinfo is None + and value.microsecond == 0 + ) + encoded = ( + value.isoformat(timespec="seconds") + if isinstance(value, datetime.datetime) + else "" + ) elif kind == "string": valid = type(value) is str and len(value) <= 1024 encoded = str(value) @@ -109,7 +120,7 @@ def decode_page( size: Requested maximum number of rows. Returns: - Non-null typed rows and complete source pagination metadata. + Typed required fields with observed nullability and source pagination. Raises: SchemaMismatchError: Row fields, types, or pagination metadata disagree. @@ -153,6 +164,10 @@ def decode_page( raise ValueError for name, kind in expected.items(): value = values[name] + if value is None and name in endpoint.contract.get( + "observed_nullable_fields", [] + ): + continue if kind in {"DOUBLE", "FLOAT"}: if ( type(value) not in (Decimal, int) diff --git a/tinyercot/public/resource_dme.py b/tinyercot/public/resource_dme.py new file mode 100644 index 00000000..39c45c35 --- /dev/null +++ b/tinyercot/public/resource_dme.py @@ -0,0 +1,159 @@ +"""Optional, source-specific CSV decoding for the public NP3-988-ER archive. + +Source: https://www.ercot.com/mp/data-products/data-product-details?id=np3-988-er +Every field remains source text; identifier zeros, blanks, and flags are retained. +""" + +import csv +import hashlib +import io +import zipfile +import zlib +from collections.abc import Generator +from dataclasses import dataclass + +from pydantic import BaseModel, ConfigDict, StrictStr + +from ._http import AccessDeniedError, LimitError, SchemaMismatchError +from .api import BASE +from .api_archives import APIArchiveFile +from .archives import checked_zip + +_HEADER = ( + "OWNER RE", + "RESOURCE NAME", + "TYPE", + "SPLIT GEN RESOURCE", + "DME", + "DME DUNS", + "RMR", +) + + +class ResourceDmeRow(BaseModel): + """One source-backed public resource decision-making entity CSV row. + + Attributes: + owner_re: Original owner resource-entity text. + resource_name: Original resource identifier. + resource_type: Original TYPE text, without an inferred enumeration. + split_gen_resource: Original split-generation-resource text. + dme: Original decision-making-entity text. + dme_duns: Original identifier text, preserving leading zeros. + rmr: Original RMR flag text, without inferred boolean semantics. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) + owner_re: StrictStr + resource_name: StrictStr + resource_type: StrictStr + split_gen_resource: StrictStr + dme: StrictStr + dme_duns: StrictStr + rmr: StrictStr + + +@dataclass(frozen=True) +class ResourceDmeRecord: + """A public CSV row with its logical record and archive identities. + + Attributes: + row: Source text fields with exact observed header meanings. + record_number: One-based CSV record number, including the header. + member: Original ZIP member name. + source_sha256: Exact selected source ZIP hash. + """ + + row: ResourceDmeRow + record_number: int + member: str + source_sha256: str + + +def iter_resource_dme( + archive_file: APIArchiveFile, + *, + max_rows: int | None = 1000, + max_expanded_bytes: int = 4_000_000, +) -> Generator[ResourceDmeRecord, None, None]: + """Decode the verified seven-column NP3-988-ER CSV as source text. + + Args: + archive_file: One selected public NP3-988-ER ZIP with its matching receipt. + max_rows: Record budget, or None for complete selected-document iteration. + max_expanded_bytes: Maximum combined advertised ZIP expansion in bytes. + + Yields: + Typed rows without trimming, coercing, normalizing identifiers, or changing + source order. Close the generator if stopping early to release ZIP streams. + + Raises: + ValueError: A caller-selected budget is invalid. + PublicDataError: Source identity, receipt, ZIP, encoding, schema, or budget + checks fail. Exhaustion never silently reports a complete result. + """ + if max_rows is not None and (type(max_rows) is not int or max_rows < 1): + raise ValueError("max_rows must be positive or None") + if type(max_expanded_bytes) is not int or max_expanded_bytes < 1: + raise ValueError("max_expanded_bytes must be positive") + document = archive_file.document + if document.emil_id != "np3-988-er": + raise AccessDeniedError("Only public NP3-988-ER resource CSVs are supported") + receipt = archive_file.receipt + if ( + receipt.source_url != BASE + "/archive/np3-988-er/download" + or receipt.byte_count != len(archive_file.body) + or receipt.sha256 != hashlib.sha256(archive_file.body).hexdigest() + ): + raise SchemaMismatchError("Resource CSV archive differs from its receipt") + try: + with checked_zip( + archive_file.body, max_members=4, max_expanded_bytes=max_expanded_bytes + ) as archive: + members = [member for member in archive.infolist() if not member.is_dir()] + if ( + len(members) != 1 + or not members[0].filename.lower().endswith(".csv") + or not members[0].filename.startswith(f"{document.document_id}.") + or tuple(member.filename for member in members) != archive_file.members + ): + raise SchemaMismatchError("Unknown resource CSV archive container") + member = members[0].filename + with ( + archive.open(member) as binary, + io.TextIOWrapper(binary, encoding="utf-8-sig", newline="") as stream, + ): + records = csv.reader(stream, strict=True) + if tuple(next(records, ())) != _HEADER: + raise SchemaMismatchError("Unknown resource CSV schema epoch") + for number, cells in enumerate(records, start=2): + if max_rows is not None and number - 1 > max_rows: + raise LimitError( + "Resource CSV row budget reached before completion" + ) + if len(cells) != len(_HEADER): + raise SchemaMismatchError("Resource CSV column count changed") + yield ResourceDmeRecord( + ResourceDmeRow( + owner_re=cells[0], + resource_name=cells[1], + resource_type=cells[2], + split_gen_resource=cells[3], + dme=cells[4], + dme_duns=cells[5], + rmr=cells[6], + ), + number, + member, + receipt.sha256, + ) + except ( + csv.Error, + UnicodeError, + zipfile.BadZipFile, + zlib.error, + NotImplementedError, + ): + raise SchemaMismatchError( + "Resource CSV decoding differs from the observed contract" + ) from None diff --git a/tinyercot/public/schema.py b/tinyercot/public/schema.py index 9bdd9e8c..3d28cce3 100644 --- a/tinyercot/public/schema.py +++ b/tinyercot/public/schema.py @@ -23,7 +23,7 @@ class Endpoint(Generic[RowT, FiltersT]): Attributes: path: Verified Public Reports data path. - row_model: Generated model for observed non-null rows. + row_model: Required source fields with explicitly observed nullability. contract_name: Bundled compact source projection key. """ diff --git a/tools/check_typing.py b/tools/check_typing.py index dad75728..d4f86389 100644 --- a/tools/check_typing.py +++ b/tools/check_typing.py @@ -2,6 +2,8 @@ import argparse import ast +import json +import keyword import os import re import shutil @@ -13,6 +15,142 @@ ROOT = Path(__file__).resolve().parents[1] +def registry_assertions(source: str, bundle: dict) -> tuple[str, str, dict[str, int]]: + """Build precise static consumers for every installed generated endpoint. + + Args: + source: Installed generated registry source, used only to locate symbols. + bundle: Installed pinned contracts, used for expected field/filter types. + + Returns: + Positive assertions, negative filter uses, and exact proof counts. The + emitted functions are type-checked only and never make data requests. + + Raises: + ValueError: Registry identities or types do not match the pinned contracts. + """ + imports = [ + '"""Installed static assertions; these functions are never executed."""', + "from collections.abc import Iterator", + "from datetime import date, datetime", + "from decimal import Decimal", + "from typing import assert_type", + "from tinyercot import public", + "from tinyercot.public import DataPage, Endpoint, ReportsClient, products", + "from tinyercot.public import _generated as rows, _schemas as schemas", + "", + ] + positive = list(imports) + negative = [ + '"""Every installed endpoint must reject an unknown query filter."""', + "from tinyercot.public import ReportsClient, products", + "", + "def invalid_registry(client: ReportsClient) -> None:", + ] + counts = {"endpoints": 0, "row_fields": 0, "filter_fields": 0, "invalid_uses": 0} + observed_paths = set() + row_types = { + "DATE": "date", + "DATETIME": "datetime", + "VARCHAR": "str", + "INTEGER": "int", + "LONG": "int", + "BOOLEAN": "bool", + "DOUBLE": "Decimal", + "FLOAT": "Decimal", + } + query_types = { + "string": "str", + "integer": "int", + "number": "float | Decimal", + "boolean": "bool", + } + examples = { + "str": '"synthetic"', + "int": "1", + "float | Decimal": 'Decimal("1.25")', + "bool": "False", + "date": "date(2026, 9, 4)", + "datetime": "datetime(2026, 9, 4, 1, 2, 3)", + } + for node in ast.parse(source).body: + if not isinstance(node, ast.AnnAssign) or not isinstance(node.target, ast.Name): + continue + if not isinstance(node.value, ast.Call): + raise TypeError("Unknown generated endpoint declaration") + path, model, contract_name = (ast.unparse(arg) for arg in node.value.args) + path = ast.literal_eval(path) + contract_name = ast.literal_eval(contract_name) + contract = bundle[contract_name] + if contract["path"] != path or path in observed_paths: + raise ValueError("Installed endpoint identity differs from its contract") + observed_paths.add(path) + constant = node.target.id + filter_type = model + "Filters" + product, method = path.strip("/").split("/") + if not method.isidentifier() or keyword.iskeyword(method): + method = "_" + method + facade = "products." + product.replace("-", "_") + "." + method + generic = f"Endpoint[rows.{model}, schemas.{filter_type}]" + positive.extend( + [ + f"def check_{constant}(client: ReportsClient, row: rows.{model}) -> None:", + f" assert_type(schemas.{constant}, {generic})", + f" assert_type({facade}, {generic})", + f" filters: schemas.{filter_type} = {{", + ] + ) + if constant in { + "DAM_PRICES", + "DAM_CAPACITY_PRICES", + "RT_PRICES", + "SYSTEM_LOAD", + }: + positive.insert( + len(positive) - 1, f" assert_type(public.{constant}, {generic})" + ) + filters = [] + for parameter in contract["query_parameters"]: + name, schema = parameter["name"], parameter["schema"] + if name in {"page", "size", "sort", "dir"}: + continue + expected = query_types[schema["type"]] + if schema.get("format") == "yyyy-MM-dd": + expected = "date" + elif schema.get("format") == "yyyy-MM-ddTH24:mm:ss": + expected = "datetime" + positive.append(f" {name!r}: {examples[expected]},") + filters.append((name, expected)) + positive.append(" }") + for name, expected in filters: + positive.append(f" assert_type(filters[{name!r}], {expected})") + positive.extend( + [ + f" assert_type(schemas.{constant}.page(client, filters=filters), DataPage[rows.{model}])", + f" assert_type(client.page(schemas.{constant}, filters=filters).rows, tuple[rows.{model}, ...])", + f" assert_type({facade}.pages(client, filters=filters), Iterator[DataPage[rows.{model}]])", + f" assert_type({facade}.iter_rows(client, filters=filters), Iterator[rows.{model}])", + ] + ) + for descriptor in contract["fields"]: + name = descriptor["name"] + expected = row_types[descriptor["dataType"]] + if name in contract.get("observed_nullable_fields", []): + expected += " | None" + positive.append(f" assert_type(row.{name}, {expected})") + positive.append("") + negative.append( + f" {facade}.page(client, filters={{'not_a_source_filter': 1}})" + ) + counts["endpoints"] += 1 + counts["row_fields"] += len(contract["fields"]) + counts["filter_fields"] += len(filters) + counts["invalid_uses"] += 1 + if observed_paths != {contract["path"] for contract in bundle.values()}: + raise ValueError("Installed registry does not cover every bundled contract") + return "\n".join(positive) + "\n", "\n".join(negative) + "\n", counts + + def legacy_assertions(source: str) -> tuple[str, int]: """Build static calls for every frozen generated legacy method. @@ -93,14 +231,41 @@ def main() -> None: parser.add_argument("--python", required=True, type=Path) args = parser.parse_args() result = subprocess.run( - [str(args.python), "-I", "-c", "import tinyercot; print(tinyercot.__file__)"], + [ + str(args.python), + "-I", + "-c", + ( + "import importlib.metadata,json,sys,tinyercot; " + "dist=importlib.metadata.distribution('tinyercot'); " + "print(json.dumps({'module':tinyercot.__file__,'prefix':sys.prefix," + "'base_prefix':sys.base_prefix,'isolated':sys.flags.isolated," + "'wheel':dist.read_text('WHEEL'),'origin':json.loads(dist.read_text('direct_url.json') or '{}')}))" + ), + ], capture_output=True, text=True, check=True, ) - package = Path(result.stdout.strip()).resolve().parent - if package == ROOT / "tinyercot" or not (package / "py.typed").is_file(): + installation = json.loads(result.stdout) + package = Path(installation["module"]).resolve().parent + if ( + package == ROOT / "tinyercot" + or not (package / "py.typed").is_file() + or not installation["isolated"] + or installation["prefix"] == installation["base_prefix"] + or not package.is_relative_to(Path(installation["prefix"]).resolve()) + or "site-packages" not in package.parts + or not installation["wheel"] + or "archive_info" not in installation["origin"] + ): raise SystemExit("Typing proof requires an installed PEP 561 wheel") + installed_bundle = (package / "public/_contracts.json").read_bytes() + if installed_bundle != (ROOT / "tinyercot/public/_contracts.json").read_bytes(): + raise SystemExit("Installed registry differs from the current pinned contracts") + registry, invalid_registry, registry_counts = registry_assertions( + (package / "public/_schemas.py").read_text(), json.loads(installed_bundle) + ) legacy, count = legacy_assertions((package / "_generated.py").read_text()) if count != 510: raise SystemExit("Installed legacy method inventory changed") @@ -116,6 +281,8 @@ def main() -> None: ROOT / "tests/typing_invalid.py", scratch / "invalid_contracts.py" ) (scratch / "legacy_contracts.py").write_text(legacy) + (scratch / "registry_contracts.py").write_text(registry) + (scratch / "invalid_registry.py").write_text(invalid_registry) environment = { k: v for k, v in os.environ.items() if k not in {"MYPYPATH", "PYTHONPATH"} } @@ -131,7 +298,8 @@ def main() -> None: "--no-incremental", ] positive = subprocess.run( - command + ["public_contracts.py", "legacy_contracts.py"], + command + + ["public_contracts.py", "legacy_contracts.py", "registry_contracts.py"], cwd=scratch, env=environment, capture_output=True, @@ -142,20 +310,27 @@ def main() -> None: print(positive.stdout) raise SystemExit("Installed positive typing proof failed") negative = subprocess.run( - command + ["invalid_contracts.py"], + command + ["invalid_contracts.py", "invalid_registry.py"], cwd=scratch, env=environment, capture_output=True, text=True, check=False, ) - if negative.returncode != 1 or negative.stdout.count(": error:") != 4: + expected_invalid = 8 + registry_counts["invalid_uses"] + if ( + negative.returncode != 1 + or negative.stdout.count(": error:") != expected_invalid + ): print(negative.stdout) raise SystemExit( - "Installed typing proof did not reject exactly four invalid uses" + f"Installed typing proof did not reject exactly {expected_invalid} invalid uses" ) print( - f"Installed PEP 561 proof passed: {count} legacy methods, {field_count} row fields, public surfaces, four rejected invalid uses" + f"Installed PEP 561 proof passed: {count} legacy methods, {field_count} legacy row fields, " + f"{registry_counts['endpoints']} current endpoints and product facades, " + f"{registry_counts['row_fields']} current row fields, {registry_counts['filter_fields']} filters, " + f"live/archive/metadata surfaces, {expected_invalid} rejected invalid uses" ) diff --git a/tools/discover_public.py b/tools/discover_public.py index 020a7442..bc5951e1 100644 --- a/tools/discover_public.py +++ b/tools/discover_public.py @@ -23,7 +23,14 @@ } -def discover(*, spec: Path, response: Path, receipt: Path, path: str) -> dict: +def discover( + *, + spec: Path, + response: Path, + receipt: Path, + path: str, + allow_observed_nulls: bool = False, +) -> dict: """Project query and observed row metadata with exact source identities. Args: @@ -31,10 +38,13 @@ def discover(*, spec: Path, response: Path, receipt: Path, path: str) -> dict: response: Small saved public data response, including fields and rows. receipt: Public-only receipt for those exact response bytes. path: An observed public data GET path from the offline catalog. + allow_observed_nulls: Record explicitly observed nullable fields while + requiring their declared source types; default preserves strict pins. Returns: A compact contract with verified_observed, missing, or unknown row status. - Empty rows, nulls, and unknown field types do not establish typed coverage. + Empty rows and unknown field types do not establish typed coverage. + Nulls require explicit opt-in and retain only their declared source type. Raises: ValueError: Source identity, hash, or public-operation evidence disagrees. @@ -69,6 +79,7 @@ def discover(*, spec: Path, response: Path, receipt: Path, path: str) -> dict: source = urlsplit(record["source_url"]) if ( source.scheme != "https" + or source.fragment or source.netloc != "api.ercot.com" or source.path != "/api/public-reports" + path or record["status"] != 200 @@ -85,7 +96,7 @@ def discover(*, spec: Path, response: Path, receipt: Path, path: str) -> dict: ] query_names = {query["name"] for query in queries} if ( - set(parse_qs(source.query)) - query_names + set(parse_qs(source.query, keep_blank_values=True)) - query_names or set(record.get("query", {})) - query_names ): raise ValueError( @@ -94,6 +105,7 @@ def discover(*, spec: Path, response: Path, receipt: Path, path: str) -> dict: body = json.loads(raw, parse_float=Decimal) fields = body.get("fields", []) status = "verified_observed" + nullable = set() if not fields: status = "missing" elif not isinstance(fields, list): @@ -124,10 +136,13 @@ def discover(*, spec: Path, response: Path, receipt: Path, path: str) -> dict: values = row else: raise ValueError("Response row width differs from fields") - if any(value is None for value in values): + if any(value is None for value in values) and not allow_observed_nulls: status = "unknown" for descriptor, value in zip(fields, values, strict=True): kind = descriptor["dataType"] + if value is None and allow_observed_nulls: + nullable.add(descriptor["name"]) + continue valid = True if kind in {"DOUBLE", "FLOAT"}: valid = ( @@ -164,6 +179,11 @@ def discover(*, spec: Path, response: Path, receipt: Path, path: str) -> dict: "source_url": SOURCE_URL, "query_source_sha256": hashlib.sha256(spec.read_bytes()).hexdigest(), "response_source": record, + **( + {"observed_nullable_fields": sorted(nullable)} + if allow_observed_nulls + else {} + ), } diff --git a/tools/generate_public.py b/tools/generate_public.py index cbc7f055..40b4c774 100644 --- a/tools/generate_public.py +++ b/tools/generate_public.py @@ -14,6 +14,7 @@ MANIFEST = ROOT / "tools/inputs/current/provenance.json" OUTPUT = ROOT / "tinyercot/public/_generated.py" REGISTRY_OUTPUT = ROOT / "tinyercot/public/_schemas.py" +PRODUCTS_OUTPUT = ROOT / "tinyercot/public/products.py" BUNDLE_OUTPUT = ROOT / "tinyercot/public/_contracts.json" TYPES = { "DATE": "date", @@ -72,6 +73,25 @@ def contracts() -> list[tuple[dict, dict]]: if hashlib.sha256(raw).hexdigest() != manifest["inputs"][entry["input"]]: raise ValueError("Unverified current response metadata") contract = json.loads(raw) + evidence = contract.get("product_evidence") + if evidence is None and entry["input"] not in { + "dam-prices.json", + "dam-capacity.json", + "rt-prices.json", + "system-load.json", + }: + raise ValueError("New row contracts require public product evidence") + if evidence is not None and ( + evidence.get("emilId", "").lower() != contract["path"].split("/")[1] + or evidence.get("audience") != "Public" + or evidence.get("securityClassification") != "Public" + or evidence.get("status") != "Active" + or evidence.get("contentType") != "DATA" + or evidence.get("emilId", "").upper() in {"NP4-179-CD", "NP3-990-EX"} + ): + raise ValueError( + "Product evidence does not permit current public row generation" + ) if ( contract["service"] != "public-reports" or contract["path"] not in public_paths @@ -102,6 +122,8 @@ def contracts() -> list[tuple[dict, dict]]: raise ValueError("Unsupported Python field or model name") if any(f["dataType"] not in TYPES for f in fields): raise ValueError("Unsupported response field type") + if set(contract.get("observed_nullable_fields", [])) - set(names): + raise ValueError("Nullable field lacks declared source metadata") declared = [ entry["model"], entry["constant"], @@ -133,7 +155,7 @@ def contracts() -> list[tuple[dict, dict]]: def render() -> str: - """Render all configured, verified non-null public row contracts. + """Render required public row fields with explicitly observed nullability. Returns: Model source for verified endpoints and their ordered fields. @@ -143,7 +165,7 @@ def render() -> str: """ lines = [ "# Generated by tools/generate_public.py from pinned public field metadata.", - '"""Observed non-null public rows; unknown schemas fail decoding."""', + '"""Observed public rows; undeclared fields and nullability fail decoding."""', "", "from datetime import " + ", ".join( @@ -168,7 +190,7 @@ def render() -> str: [ "", f"class {model}(BaseModel):", - ' """A non-null row from the observed public field contract.', + ' """A row from the observed public field contract.', "", " Attributes:", ] @@ -185,7 +207,15 @@ def render() -> str: "", ] ) - lines.extend(f" {f['name']}: {TYPES[f['dataType']]}" for f in fields) + lines.extend( + f" {f['name']}: {TYPES[f['dataType']]}" + + ( + " | None" + if f["name"] in contract.get("observed_nullable_fields", []) + else "" + ) + for f in fields + ) lines.extend(["", "", f"{constant} = {{"]) lines.extend( f" {json.dumps(f['name'])}: {json.dumps(f['dataType'])}," for f in fields @@ -208,7 +238,7 @@ def render_registry() -> str: "# Generated by tools/generate_public.py; do not edit.", '"""Verified public operation identities and complete query filter types."""', "", - "from datetime import date", + "from datetime import date, datetime", "from decimal import Decimal", "from typing import TypedDict", "", @@ -237,7 +267,13 @@ def render_registry() -> str: schema = parameter["schema"] kind = schema["type"] formats = { - "string": {None, "abc123", "yyyy-MM-dd"}, + "string": { + None, + "abc123", + "yyyy-MM-dd", + "yyyy-MM-ddTH24:mm:ss", + "mm:ss", + }, "integer": {None, "###"}, "number": {None, "####.###"}, "boolean": {None, "true | false"}, @@ -252,6 +288,8 @@ def render_registry() -> str: }.get(kind) if kind == "string" and schema.get("format") == "yyyy-MM-dd": query_type = "date" + if kind == "string" and schema.get("format") == "yyyy-MM-ddTH24:mm:ss": + query_type = "datetime" if query_type is None: raise ValueError("Unsupported current query type") lines.append(f" {name}: {query_type}") @@ -268,6 +306,27 @@ def render_registry() -> str: lines.extend( ["", "ENDPOINTS = (", *[f" {e['constant']}," for e, _ in entries], ")", ""] ) + # Imports vary with the current registry; use the pinned formatter/linter. + formatted = subprocess.run( + [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + "F401,I001", + "--fix", + "--config", + str(ROOT / "pyproject.toml"), + "--stdin-filename", + str(REGISTRY_OUTPUT), + "-", + ], + input="\n".join(lines), + capture_output=True, + text=True, + check=True, + ).stdout return subprocess.run( [ sys.executable, @@ -279,13 +338,45 @@ def render_registry() -> str: "--stdin-filename", str(REGISTRY_OUTPUT), ], - input="\n".join(lines), + input=formatted, capture_output=True, text=True, check=True, ).stdout +def render_products() -> str: + """Generate typed product facades for every verified registry operation. + + Returns: + Additive product namespaces; no legacy facade is imported or rewritten. + """ + entries = contracts() + lines = [ + '"""Generated typed public product facades; use with ReportsClient."""', + "", + "from . import _schemas", + "", + ] + for product in sorted({contract["path"].split("/")[1] for _, contract in entries}): + lines.extend( + [ + "", + f"class {product.replace('-', '_')}:", + f' """Verified operations for public product {product.upper()}."""', + "", + ] + ) + for entry, contract in entries: + if contract["path"].split("/")[1] == product: + method = contract["path"].split("/")[2] + if not method.isidentifier() or keyword.iskeyword(method): + method = "_" + method + lines.append(f" {method} = _schemas.{entry['constant']}") + lines.append("") + return "\n".join(lines) + + def main() -> None: """Write or check additive models without changing legacy generation.""" parser = argparse.ArgumentParser(description=__doc__) @@ -294,6 +385,7 @@ def main() -> None: outputs = { OUTPUT: render(), REGISTRY_OUTPUT: render_registry(), + PRODUCTS_OUTPUT: render_products(), BUNDLE_OUTPUT: json.dumps( {entry["input"]: contract for entry, contract in contracts()}, indent=2 ) diff --git a/tools/index_public_evidence.py b/tools/index_public_evidence.py new file mode 100644 index 00000000..7cb47e47 --- /dev/null +++ b/tools/index_public_evidence.py @@ -0,0 +1,162 @@ +"""Build an offline installed-retrieval index from allowlisted public receipts.""" + +import argparse +import hashlib +import json +from pathlib import Path +from urllib.parse import parse_qs, urlsplit + +ROOT = Path(__file__).resolve().parents[1] +RECEIPT_KEYS = {"source_url", "retrieved_at", "sha256", "byte_count", "status"} + + +def build_index(directory: Path) -> dict: + """Reconcile saved installed observations with the pinned generated registry. + + Args: + directory: Directory of receipt-only registry probe JSON records. + + Returns: + Exact unique path counts, source receipts and separate pagination limits. + + Raises: + ValueError: Receipts lack public provenance or duplicate a path identity. + """ + manifest_path = ROOT / "tools/inputs/current/provenance.json" + manifest = json.loads(manifest_path.read_text()) + generated = { + json.loads((manifest_path.parent / entry["input"]).read_text())["path"] + for entry in manifest["contracts"] + } + paths = {} + for name in ("installed-receipts.json", "installed-reports-receipts.json"): + source = json.loads((ROOT / "docs/evidence" / name).read_text()) + for position, record in enumerate(source["receipts"]): + url = urlsplit(record["source_url"]) + path = url.path.removeprefix("/api/public-reports") + if path not in generated: + continue + kind = record["kind"] + period = ( + "current" + if kind.endswith("current") + else "historical" + if kind.endswith("historical") + else None + ) + if period is None: + continue + observation = { + "period": period, + "status": "typed", + "rows": record["rows"], + "sort": parse_qs(url.query).get("sort", [None])[0], + "receipt": {key: record[key] for key in RECEIPT_KEYS}, + "evidence_ref": f"docs/evidence/{name}#/receipts/{position}", + } + paths.setdefault( + path, + { + "path": path, + "installed_module": source["installed_module"], + "records": [], + }, + )["records"].append(observation) + for file in sorted(directory.glob("*.json")): + source = json.loads(file.read_text()) + if set(source) != {"path", "installed_module", "records"}: + raise ValueError("Unexpected installed evidence fields") + path = source["path"] + if path in paths or path not in generated: + raise ValueError("Duplicate or unregistered installed evidence") + for record in source["records"]: + if set(record) - { + "period", + "status", + "rows", + "sort", + "source_time", + "receipt", + }: + raise ValueError("Unexpected observation metadata") + if record["period"] == "latest": + record["period"] = "current" + elif record["period"] == "oldest": + record["period"] = "historical" + paths[path] = source + for path, source in paths.items(): + for record in source["records"]: + receipt = record["receipt"] + url = urlsplit(receipt["source_url"]) + if ( + set(receipt) != RECEIPT_KEYS + or receipt["status"] != 200 + or url.scheme != "https" + or url.netloc != "api.ercot.com" + or url.path != "/api/public-reports" + path + or url.fragment + or record["status"] != "typed" + or record["rows"] < 1 + ): + raise ValueError("Observation lacks successful public typed evidence") + if record["period"] == "historical" and ( + not record["sort"] or parse_qs(url.query).get("dir") != ["asc"] + ): + raise ValueError( + "Historical claim lacks explicit ascending source sort" + ) + records = [record for source in paths.values() for record in source["records"]] + return { + "format_version": 1, + "manifest_sha256": hashlib.sha256(manifest_path.read_bytes()).hexdigest(), + "generated_unique_paths": len(generated), + "installed_unique_paths": len(paths), + "current_unique_paths": sum( + any(r["period"] == "current" for r in source["records"]) + for source in paths.values() + ), + "current_requests": sum(r["period"] == "current" for r in records), + "oldest_first_unique_paths": sum( + any(r["period"] == "historical" for r in source["records"]) + for source in paths.values() + ), + "oldest_first_requests": sum(r["period"] == "historical" for r in records), + "observed_public_data_paths": 243, + "pending_generated_paths": sorted(generated - paths.keys()), + "pagination": { + "live_paginated_unique_paths": 2, + "live_complete_selection_unique_paths": 1, + "partial_selection": { + "path": "/np4-190-cd/dam_stlmnt_pnt_prices", + "pages": [1, 2], + "total_pages": 12, + "evidence": "docs/evidence/installed-receipts.json", + }, + "complete_selection": { + "path": "/np6-905-cd/spp_node_zone_hub", + "pages": [1, 2], + "total_records": 2, + "evidence": "docs/evidence/installed-reports-receipts.json", + }, + "new_batch_pagination_requests": 0, + "complete_history_extraction": False, + "annual_complete_iteration": "Offline synthetic multi-worksheet proof only; live source files sampled from verified cache.", + }, + "limits": "One-row newest/oldest source-directed selections for the 52-path batch. Oldest is scoped to source retention and optional filters, not all historical availability. No cross-epoch schema or full-history completeness claim.", + "authenticated_public_requests": True, + "restricted_requests": False, + "historical_bulk_extraction": False, + "paths": [paths[path] for path in sorted(paths)], + } + + +def main() -> None: + """Print a reviewable index without modifying evidence or making requests.""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--registry", type=Path, required=True) + args = parser.parse_args() + print(json.dumps(build_index(args.registry), indent=2)) + + +if __name__ == "__main__": + main() diff --git a/tools/inputs/current/gen-55-cd--hrly_rt_load_fcast_actual.json b/tools/inputs/current/gen-55-cd--hrly_rt_load_fcast_actual.json new file mode 100644 index 00000000..43be1130 --- /dev/null +++ b/tools/inputs/current/gen-55-cd--hrly_rt_load_fcast_actual.json @@ -0,0 +1,274 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/gen-55-cd/hrly_rt_load_fcast_actual", + "observed_at": "2026-09-06 00:37:12.006183+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEndingFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "hourEndingTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "currentDayFcastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "currentDayFcastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "dayAheadFcastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "dayAheadFcastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "actualLoadFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "actualLoadTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "dayAheadHSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "dayAheadHSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "currentDayHSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "currentDayHSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "currentDayFcast", + "label": "Current Day Forecast", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "dayAheadFcast", + "label": "Day Ahead Forecast", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "actualLoad", + "label": "Actual Load", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "dayAheadHSL", + "label": "Day Ahead HSL", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "currentDayHSL", + "label": "Current Day HSL", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:12.006183+00:00", + "sha256": "1f13194f01aff5b70ffe5ce39239f2e71a2231547b7d927a777827eeacb1ffb6", + "byte_count": 1674, + "status": 200 + }, + "observed_nullable_fields": [ + "actualLoad", + "currentDayHSL" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:12.006183+00:00", + "sha256": "1f13194f01aff5b70ffe5ce39239f2e71a2231547b7d927a777827eeacb1ffb6", + "byte_count": 1674, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/gen-55-cd/hrly_rt_load_fcast_actual?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:37:13.954828+00:00", + "sha256": "8f0155f666c3607327c4bc7d9814d18fcf5e015c6415637434a37fa488692ad0", + "byte_count": 1681, + "status": 200 + } + ], + "product_evidence": { + "emilId": "GEN-55-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13499, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np1-302--as_obligation.json b/tools/inputs/current/np1-302--as_obligation.json new file mode 100644 index 00000000..1c05a026 --- /dev/null +++ b/tools/inputs/current/np1-302--as_obligation.json @@ -0,0 +1,388 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np1-302/as_obligation", + "observed_at": "2026-09-06 00:37:16.668025+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "qseName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "REGUPOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGUPOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSOblAdvisoryFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSOblAdvisoryTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGUPOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGUPOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSOblFinalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSOblFinalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "qseName", + "label": "QSE Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "REGUPOblAdvisory", + "label": "Reg Up Obligation Advisory", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "REGDNOblAdvisory", + "label": "Reg Down Obligation Advisory", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RRSOblAdvisory", + "label": "RRS Obligation Advisory", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "NSPINOblAdvisory", + "label": "NSPIN Obligation Advisory", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ECRSOblAdvisory", + "label": "ECRS Obligation Advisory", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "REGUPOblFinal", + "label": "Reg Up Obligation Final", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "REGDNOblFinal", + "label": "Reg Down Obligation Final", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RRSOblFinal", + "label": "RRS Obligation Final", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "NSPINOblFinal", + "label": "NSPIN Obligation Final", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ECRSOblFinal", + "label": "ECRS Obligation Final", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np1-302/as_obligation?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:16.668025+00:00", + "sha256": "36f971b0020b4186524c7c7e5fa8c7245fd4f3b428d2e2c6e13b43a3cf8672b2", + "byte_count": 2473, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np1-302/as_obligation?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:16.668025+00:00", + "sha256": "36f971b0020b4186524c7c7e5fa8c7245fd4f3b428d2e2c6e13b43a3cf8672b2", + "byte_count": 2473, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np1-302/as_obligation?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:37:18.262190+00:00", + "sha256": "7ea5d9661aa9744d086b052605b815b3eca42c2a4e43d15ba5dc2cd799dc4d5e", + "byte_count": 2455, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP1-302", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 10039, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np3-161-cd--7d_plus_avail_res_poc_margin.json b/tools/inputs/current/np3-161-cd--7d_plus_avail_res_poc_margin.json new file mode 100644 index 00000000..a566f8bd --- /dev/null +++ b/tools/inputs/current/np3-161-cd--7d_plus_avail_res_poc_margin.json @@ -0,0 +1,354 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np3-161-cd/7d_plus_avail_res_poc_margin", + "observed_at": "2026-09-06 00:37:20.328493+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "operatingDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "operatingDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "nonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "nonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdNonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdNonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdNonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdNonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "IRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "IRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdIRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdIRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdIRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdIRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "operatingDate", + "label": "Operating Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "nonIRRNonPUN", + "label": "Resource POL (Non-IRR, Non-PUN)", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ESR", + "label": "Resource POL (ESR)", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdNonIRRNonPUN", + "label": "Aggregate Approved Resource POL (Non-IRR, Non-PUN)", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdNonIRRNonPUN", + "label": "Aggregate Received Resource POL (Non-IRR, Non-PUN)", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "IRR", + "label": "Resource POL (IRR)", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdIRR", + "label": "Aggregate Approved Resource POL (IRR)", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdIRR", + "label": "Aggregate Received Resource POL (IRR)", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdESR", + "label": "Aggregate Approved Resource POL (ESR)", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdESR", + "label": "Aggregate Received Resource POL (ESR)", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:20.328493+00:00", + "sha256": "780f72f2049581f9b4a73de823bcc336d5f653f48a48bc12eb7384805d317d66", + "byte_count": 2320, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:20.328493+00:00", + "sha256": "780f72f2049581f9b4a73de823bcc336d5f653f48a48bc12eb7384805d317d66", + "byte_count": 2320, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-161-cd/7d_plus_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:22.459719+00:00", + "sha256": "abf3829f721bc0e1e9f551a6313a1ff5728732235ecbbd4ed5e808954c6f0954", + "byte_count": 2314, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-161-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 22470, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np3-162-cd--7d_avail_res_poc_margin.json b/tools/inputs/current/np3-162-cd--7d_avail_res_poc_margin.json new file mode 100644 index 00000000..f726af55 --- /dev/null +++ b/tools/inputs/current/np3-162-cd--7d_avail_res_poc_margin.json @@ -0,0 +1,396 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np3-162-cd/7d_avail_res_poc_margin", + "observed_at": "2026-09-06 00:37:24.785394+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "aggRcvdESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "operatingDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "operatingDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEndingFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "hourEndingTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "nonIrrNonPunFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "nonIrrNonPunTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdNonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdNonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdNonIRRNonPUNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdNonIRRNonPUNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "IRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "IRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdIRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdIRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdIRRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggRcvdIRRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdESRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "aggApprvdESRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "operatingDate", + "label": "Operating Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "nonIrrNonPun", + "label": "Maximum Daily Resource POL", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdNonIRRNonPUN", + "label": "Aggregate Approved Resource POL (Non-IRR, Non-PUN)", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdNonIRRNonPUN", + "label": "Aggregate Received Resource POL (Non-IRR, Non-PUN)", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "IRR", + "label": "Maximum Daily Resource POL (IRR)", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdIRR", + "label": "Aggregate Approved Resource POL (IRR)", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdIRR", + "label": "Aggregate Received Resource POL (IRR)", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ESR", + "label": "Maximum Daily Resource POL (ESR)", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggApprvdESR", + "label": "Aggregate Approved Resource POL (ESR)", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "aggRcvdESR", + "label": "Aggregate Received Resource POL (ESR)", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 13, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:24.785394+00:00", + "sha256": "64d6f7d9551479a30d896e51321cae1f06b1def528ad50c8935e79f52e454091", + "byte_count": 2615, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:24.785394+00:00", + "sha256": "64d6f7d9551479a30d896e51321cae1f06b1def528ad50c8935e79f52e454091", + "byte_count": 2615, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-162-cd/7d_avail_res_poc_margin?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:26.641624+00:00", + "sha256": "705b702f2f12a56068efebbb5f9bbe317b600bb6c95281dac95f55d99e6ed3d1", + "byte_count": 2614, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-162-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 22469, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np3-233-cd--hourly_res_outage_cap.json b/tools/inputs/current/np3-233-cd--hourly_res_outage_cap.json new file mode 100644 index 00000000..20c7ede1 --- /dev/null +++ b/tools/inputs/current/np3-233-cd--hourly_res_outage_cap.json @@ -0,0 +1,454 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np3-233-cd/hourly_res_outage_cap", + "observed_at": "2026-09-06 00:37:36.517906+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "operatingDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "operatingDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEndingFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "hourEndingTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneSouthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneSouthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneNorthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneNorthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneWestFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneWestTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneHoustonFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalResourceMWZoneHoustonTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneSouthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneSouthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneNorthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneNorthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneWestFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneWestTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneHoustonFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalIRRMWZoneHoustonTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneSouthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneSouthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneNorthFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneNorthTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneWestFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneWestTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneHoustonFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "totalNewEquipResourceMWZoneHoustonTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "operatingDate", + "label": "Operating Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalResourceMWZoneSouth", + "label": "Total Resource MW Zone South", + "cardinality": 4, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalResourceMWZoneNorth", + "label": "Total Resource MW Zone North", + "cardinality": 5, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalResourceMWZoneWest", + "label": "Total Resource MW Zone West", + "cardinality": 6, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalResourceMWZoneHouston", + "label": "Total Resource MW Zone Houston", + "cardinality": 7, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalIRRMWZoneSouth", + "label": "Total IRR MW Zone South", + "cardinality": 8, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalIRRMWZoneNorth", + "label": "Total IRR MW Zone North", + "cardinality": 9, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalIRRMWZoneWest", + "label": "Total IRR MW Zone West", + "cardinality": 10, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalIRRMWZoneHouston", + "label": "Total IRR MW Zone Houston", + "cardinality": 11, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalNewEquipResourceMWZoneSouth", + "label": "Total New Equipment Resource MW Zone South", + "cardinality": 12, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalNewEquipResourceMWZoneNorth", + "label": "Total New Equipment Resource MW Zone North", + "cardinality": 13, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalNewEquipResourceMWZoneWest", + "label": "Total New Equipment Resource MW Zone West", + "cardinality": 14, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalNewEquipResourceMWZoneHouston", + "label": "Total New Equipment Resource MW Zone Houston", + "cardinality": 15, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap?size=1&page=1&sort=operatingDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:36.517906+00:00", + "sha256": "0d10814cf4976d2530b429563fd684a65d08da0deb8e4cda18a9706d7862fcad", + "byte_count": 3018, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap?size=1&page=1&sort=operatingDate&dir=desc", + "retrieved_at": "2026-09-06 00:37:36.517906+00:00", + "sha256": "0d10814cf4976d2530b429563fd684a65d08da0deb8e4cda18a9706d7862fcad", + "byte_count": 3018, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-233-cd/hourly_res_outage_cap?size=1&page=1&sort=operatingDate&dir=asc", + "retrieved_at": "2026-09-06 00:37:38.432391+00:00", + "sha256": "a616d9597a1dbd1e6d3e979ef4471e8b98a1688cb5d3cb4e6e0b61bff5bf9ee3", + "byte_count": 3024, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-233-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13103, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np3-560-cd--7d_load_fcast_by_fzn.json b/tools/inputs/current/np3-560-cd--7d_load_fcast_by_fzn.json new file mode 100644 index 00000000..2cff7a3c --- /dev/null +++ b/tools/inputs/current/np3-560-cd--7d_load_fcast_by_fzn.json @@ -0,0 +1,288 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np3-560-cd/7d_load_fcast_by_fzn", + "observed_at": "2026-09-06 00:37:38.977492+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "houstonFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "houstonTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "north", + "label": "North", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "south", + "label": "South", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "houston", + "label": "Houston", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "systemTotal", + "label": "System Total", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 9, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:38.977492+00:00", + "sha256": "5e437bd30381b74c0cda614dc74f3e1af0125714b66e21ee7b9f33737000019f", + "byte_count": 1809, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:38.977492+00:00", + "sha256": "5e437bd30381b74c0cda614dc74f3e1af0125714b66e21ee7b9f33737000019f", + "byte_count": 1809, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-560-cd/7d_load_fcast_by_fzn?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:40.987354+00:00", + "sha256": "35354df61beb7ef65de9788a557ca12fb1ae9cd71297a858349679dd53c64be9", + "byte_count": 1805, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-560-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12311, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np3-561-cd--7d_load_fcast_by_wzn.json b/tools/inputs/current/np3-561-cd--7d_load_fcast_by_wzn.json new file mode 100644 index 00000000..2ee3d5c2 --- /dev/null +++ b/tools/inputs/current/np3-561-cd--7d_load_fcast_by_wzn.json @@ -0,0 +1,388 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np3-561-cd/7d_load_fcast_by_wzn", + "observed_at": "2026-09-06 00:37:43.111243+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "coastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "coastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "coast", + "label": "Coast", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "east", + "label": "East", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "farWest", + "label": "Far West", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "north", + "label": "North", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "northCentral", + "label": "North Central", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southCentral", + "label": "South Central", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southern", + "label": "Southern", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "systemTotal", + "label": "System Total", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 13, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:43.111243+00:00", + "sha256": "07b07250cd9ee51044c99e4bb7779d3a13277648e08c23ed0284b4c13920b901", + "byte_count": 2320, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:43.111243+00:00", + "sha256": "07b07250cd9ee51044c99e4bb7779d3a13277648e08c23ed0284b4c13920b901", + "byte_count": 2320, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-561-cd/7d_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:45.445307+00:00", + "sha256": "896f0026fd3affb4d1d9d6f620fc3f111e47544b853da7959f7f6b4518305a5b", + "byte_count": 2309, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-561-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12312, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np3-562-cd--ih_load_fcast_by_wzn.json b/tools/inputs/current/np3-562-cd--ih_load_fcast_by_wzn.json new file mode 100644 index 00000000..8a85d6da --- /dev/null +++ b/tools/inputs/current/np3-562-cd--ih_load_fcast_by_wzn.json @@ -0,0 +1,405 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np3-562-cd/ih_load_fcast_by_wzn", + "observed_at": "2026-09-06 00:37:47.164389+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "farWestFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "model", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "inUseFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "coastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "coastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalEnding", + "label": "Interval Ending", + "cardinality": 2, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "coast", + "label": "Coast", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "east", + "label": "East", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "farWest", + "label": "Far West", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "north", + "label": "North", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "northCentral", + "label": "North Central", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southCentral", + "label": "South Central", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southern", + "label": "Southern", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "systemTotal", + "label": "System Total", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "model", + "label": "Model", + "cardinality": 12, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "inUseFlag", + "label": "In Use Flag", + "cardinality": 13, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 14, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:47.164389+00:00", + "sha256": "d9024dbda3e05168a00a3dea4c9e3dc37883f8675b5446dfd9199d5ede70f788", + "byte_count": 2511, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:37:47.164389+00:00", + "sha256": "d9024dbda3e05168a00a3dea4c9e3dc37883f8675b5446dfd9199d5ede70f788", + "byte_count": 2511, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-562-cd/ih_load_fcast_by_wzn?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:37:49.355980+00:00", + "sha256": "85bc1e3c185465a3c1fe51ec3c3a4c08300dda6204eba6a9d096be51fef10fb8", + "byte_count": 2515, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-562-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 16553, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np3-565-cd--lf_by_model_weather_zone.json b/tools/inputs/current/np3-565-cd--lf_by_model_weather_zone.json new file mode 100644 index 00000000..3eb5ac42 --- /dev/null +++ b/tools/inputs/current/np3-565-cd--lf_by_model_weather_zone.json @@ -0,0 +1,422 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np3-565-cd/lf_by_model_weather_zone", + "observed_at": "2026-09-06 00:38:19.023514+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "coastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "coastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "eastTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "farWestTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southCentralTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southernTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "systemTotalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemTotalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "model", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "inUseFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "coast", + "label": "Coast", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "east", + "label": "East", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "farWest", + "label": "Far West", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "north", + "label": "North", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "northCentral", + "label": "North Central", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southCentral", + "label": "South Central", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "southern", + "label": "Southern", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "systemTotal", + "label": "System Total", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "model", + "label": "Model", + "cardinality": 13, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "inUseFlag", + "label": "In Use Flag", + "cardinality": 14, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 15, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:38:19.023514+00:00", + "sha256": "3ed90e939aa2f4efa0b8427582f09800f41d8e322bcc82f044feb45588380b2c", + "byte_count": 2607, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:38:19.023514+00:00", + "sha256": "3ed90e939aa2f4efa0b8427582f09800f41d8e322bcc82f044feb45588380b2c", + "byte_count": 2607, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np3-565-cd/lf_by_model_weather_zone?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:38:34.171487+00:00", + "sha256": "8704e30812e94377745fa2b5ddc00541b52aeea9f0d53d71f57bdf30b6fc5e93", + "byte_count": 2603, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP3-565-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 14837, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-158-sg--dam_essps.json b/tools/inputs/current/np4-158-sg--dam_essps.json new file mode 100644 index 00000000..a99301b9 --- /dev/null +++ b/tools/inputs/current/np4-158-sg--dam_essps.json @@ -0,0 +1,230 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-158-sg/dam_essps", + "observed_at": "2026-09-06 00:32:07.472297+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "groupIndexFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "groupIndexTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "updateTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "updateTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "groupIndex", + "label": "Group Index", + "cardinality": 5, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "updateTime", + "label": "Update Time", + "cardinality": 6, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 7, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:32:07.472297+00:00", + "sha256": "2ec1865a530ed3acaa47f7b1d47ee0a60bbce036584d2be19ffd318ff5248f61", + "byte_count": 1548, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:32:07.472297+00:00", + "sha256": "2ec1865a530ed3acaa47f7b1d47ee0a60bbce036584d2be19ffd318ff5248f61", + "byte_count": 1548, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-158-sg/dam_essps?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:32:09.483801+00:00", + "sha256": "41062012de7a8e87058091f7228ebfb4e2f43547fd9acf3038cbee9f05d52228", + "byte_count": 1544, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-158-SG", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13058, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-159-cd--load_distribution_factors.json b/tools/inputs/current/np4-159-cd--load_distribution_factors.json new file mode 100644 index 00000000..6214b054 --- /dev/null +++ b/tools/inputs/current/np4-159-cd--load_distribution_factors.json @@ -0,0 +1,264 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-159-cd/load_distribution_factors", + "observed_at": "2026-09-06 00:32:24.910796+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "LDFDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "LDFDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "LDFHour", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "substation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "distributionFactorFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "distributionFactorTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "loadId", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "MVARDistributionFactorFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MVARDistributionFactorTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "MRIDLoad", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "LDFDate", + "label": "LDF Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "LDFHour", + "label": "LDF Hour", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "substation", + "label": "Substation", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "distributionFactor", + "label": "Distribution Factor", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "loadId", + "label": "Load Id", + "cardinality": 6, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "MVARDistributionFactor", + "label": "MVAR Distribution Factor", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "MRIDLoad", + "label": "MRID Load", + "cardinality": 8, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 9, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors?size=1&page=1&sort=LDFDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:24.910796+00:00", + "sha256": "993ab035308e4cf7739bea8d28ffa61e13250f68dd83c949448fe5a73cff892b", + "byte_count": 1835, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors?size=1&page=1&sort=LDFDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:24.910796+00:00", + "sha256": "993ab035308e4cf7739bea8d28ffa61e13250f68dd83c949448fe5a73cff892b", + "byte_count": 1835, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-159-cd/load_distribution_factors?size=1&page=1&sort=LDFDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:34.734047+00:00", + "sha256": "5487238968fdfbff4a8e4afb654371177e1e065c9cea36c3fe83e3d293119b53", + "byte_count": 1847, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-159-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12324, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-183-cd--dam_hourly_lmp.json b/tools/inputs/current/np4-183-cd--dam_hourly_lmp.json new file mode 100644 index 00000000..b409d802 --- /dev/null +++ b/tools/inputs/current/np4-183-cd--dam_hourly_lmp.json @@ -0,0 +1,180 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-183-cd/dam_hourly_lmp", + "observed_at": "2026-09-06 00:32:34.811307+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "busName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "busName", + "label": "Bus Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMP", + "label": "LMP", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:34.811307+00:00", + "sha256": "cfa236240f8622d5755d3c1896af78322e875f9923ab981157181a021e60ef1f", + "byte_count": 1235, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:34.811307+00:00", + "sha256": "cfa236240f8622d5755d3c1896af78322e875f9923ab981157181a021e60ef1f", + "byte_count": 1235, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-183-cd/dam_hourly_lmp?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:36.934518+00:00", + "sha256": "1c9275c26f20a05a4c8386121890e93f4f8685ada25650b4e89f24174650204b", + "byte_count": 1231, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-183-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12328, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-19-cd--dam_agg_as_offer_curve.json b/tools/inputs/current/np4-19-cd--dam_agg_as_offer_curve.json new file mode 100644 index 00000000..befaee84 --- /dev/null +++ b/tools/inputs/current/np4-19-cd--dam_agg_as_offer_curve.json @@ -0,0 +1,205 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-19-cd/dam_agg_as_offer_curve", + "observed_at": "2026-09-06 00:33:54.816697+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "ancillaryType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ancillaryType", + "label": "Ancillary Type", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "price", + "label": "Price", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 6, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:54.816697+00:00", + "sha256": "35716ba50f9690417cb259eb3dd27fd572777906a50ddc14a1ccb1fe1d7efd14", + "byte_count": 1361, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:54.816697+00:00", + "sha256": "35716ba50f9690417cb259eb3dd27fd572777906a50ddc14a1ccb1fe1d7efd14", + "byte_count": 1361, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-19-cd/dam_agg_as_offer_curve?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:56.760091+00:00", + "sha256": "112ed960c283728aa67652f67fa1ecaa134eb41fb10f535af3bbbde2799dc562", + "byte_count": 1359, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-19-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12330, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-191-cd--dam_shadow_prices.json b/tools/inputs/current/np4-191-cd--dam_shadow_prices.json new file mode 100644 index 00000000..4684a617 --- /dev/null +++ b/tools/inputs/current/np4-191-cd--dam_shadow_prices.json @@ -0,0 +1,406 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-191-cd/dam_shadow_prices", + "observed_at": "2026-09-06 00:29:12.188633+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "constraintIdFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintIdTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "contingencyName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "constraintLimitFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintLimitTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintValueFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintValueTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "violationAmountFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "violationAmountTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "shadowPriceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "fromStation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "toStation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "fromStationkVFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "fromStationkVTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "toStationkVFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "toStationkVTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "deliveryTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "constraintId", + "label": "Constraint Id", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintName", + "label": "Constraint Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "contingencyName", + "label": "Contingency Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "constraintLimit", + "label": "Constraint Limit", + "cardinality": 6, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintValue", + "label": "Constraint Value", + "cardinality": 7, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "violationAmount", + "label": "Violation Amount", + "cardinality": 8, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "shadowPrice", + "label": "Shadow Price", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "fromStation", + "label": "From Station", + "cardinality": 10, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "toStation", + "label": "To Station", + "cardinality": 11, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "fromStationkV", + "label": "From Station kV", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "toStationkV", + "label": "To Station kV", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryTime", + "label": "Delivery Time", + "cardinality": 14, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 15, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:29:12.188633+00:00", + "sha256": "db45f1a9cb9f9cd1b1c99e27813b992446bcc029b2a39c4639a4baf4aae652f0", + "byte_count": 2674, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:29:12.188633+00:00", + "sha256": "db45f1a9cb9f9cd1b1c99e27813b992446bcc029b2a39c4639a4baf4aae652f0", + "byte_count": 2674, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-191-cd/dam_shadow_prices?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:29:14.219945+00:00", + "sha256": "de4b4145be0ec6b778a82fdfeb20d4dfbc1d85c1c24c74cef4fc959c1ddebb8b", + "byte_count": 2674, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-191-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12332, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-192-cd--dam_total_energy_purchased.json b/tools/inputs/current/np4-192-cd--dam_total_energy_purchased.json new file mode 100644 index 00000000..da85d80b --- /dev/null +++ b/tools/inputs/current/np4-192-cd--dam_total_energy_purchased.json @@ -0,0 +1,180 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-192-cd/dam_total_energy_purchased", + "observed_at": "2026-09-06 00:32:39.185937+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "totalDamEnergyBoughtFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalDamEnergyBoughtTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "totalDamEnergyBought", + "label": "Total DAM Energy Bought", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:39.185937+00:00", + "sha256": "1c4bf6d563b3e77e988766b08cd083598e37ff0ecb297f65918c09cbce362a66", + "byte_count": 1280, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:39.185937+00:00", + "sha256": "1c4bf6d563b3e77e988766b08cd083598e37ff0ecb297f65918c09cbce362a66", + "byte_count": 1280, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-192-cd/dam_total_energy_purchased?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:41.270109+00:00", + "sha256": "84234f8ad8273961086d9bddab4bbfa5014e2f23d3cf8f370fc59a4be32c5330", + "byte_count": 1274, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-192-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12333, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-193-cd--total_dam_energy_sold.json b/tools/inputs/current/np4-193-cd--total_dam_energy_sold.json new file mode 100644 index 00000000..3b4544b6 --- /dev/null +++ b/tools/inputs/current/np4-193-cd--total_dam_energy_sold.json @@ -0,0 +1,180 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-193-cd/total_dam_energy_sold", + "observed_at": "2026-09-06 00:32:43.447934+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "totalDAMEnergySoldFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalDAMEnergySoldTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "totalDAMEnergySold", + "label": "Total DAM Energy Sold", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:43.447934+00:00", + "sha256": "9a2a56d1bc33f2a79cdb8f2bcdbef7d34ae3ab32fe6d23783d3bbc1e91eff4f9", + "byte_count": 1260, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:43.447934+00:00", + "sha256": "9a2a56d1bc33f2a79cdb8f2bcdbef7d34ae3ab32fe6d23783d3bbc1e91eff4f9", + "byte_count": 1260, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-193-cd/total_dam_energy_sold?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:45.465991+00:00", + "sha256": "da2ce61b6c5bd72f62af5705613c88f28cd7e28c22cde16ccdd76b6ff40e088b", + "byte_count": 1261, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-193-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12334, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-194-cd--dam_ptp_obligation_sp_results.json b/tools/inputs/current/np4-194-cd--dam_ptp_obligation_sp_results.json new file mode 100644 index 00000000..e55c897f --- /dev/null +++ b/tools/inputs/current/np4-194-cd--dam_ptp_obligation_sp_results.json @@ -0,0 +1,205 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-194-cd/dam_ptp_obligation_sp_results", + "observed_at": "2026-09-06 00:32:47.519937+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "stlPnt", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "totalPtpOblAwardedSourceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalPtpOblAwardedSourceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalPtpOblAwardedSinkFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalPtpOblAwardedSinkTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "DELIVERY DATE", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "HOUR ENDING", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "stlPnt", + "label": "STL_PNT", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "totalPtpOblAwardedSource", + "label": "TOTAL_PTP_OBL_AWARDED_SOURCE", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "totalPtpOblAwardedSink", + "label": "TOTAL_PTP_OBL_AWARDED_SINK", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 6, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:47.519937+00:00", + "sha256": "9fa2ba5a6579c6187dd44163d5bf9a1659b681843d697cde4cbbdc00380adf55", + "byte_count": 1463, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:47.519937+00:00", + "sha256": "9fa2ba5a6579c6187dd44163d5bf9a1659b681843d697cde4cbbdc00380adf55", + "byte_count": 1463, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-194-cd/dam_ptp_obligation_sp_results?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:49.575911+00:00", + "sha256": "8b9cc5740cc0f00497248a284bdef1a929a0e3cce8627df32adb97a9b9470d4f", + "byte_count": 1459, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-194-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13042, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-196-m--dam_price_corrections_eblmp.json b/tools/inputs/current/np4-196-m--dam_price_corrections_eblmp.json new file mode 100644 index 00000000..26dbb6f3 --- /dev/null +++ b/tools/inputs/current/np4-196-m--dam_price_corrections_eblmp.json @@ -0,0 +1,238 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-196-m/dam_price_corrections_eblmp", + "observed_at": "2026-09-06 00:33:00.514846+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "electricalBus", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "electricalBus", + "label": "Electric Bus Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMPOriginal", + "label": "LMP Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "LMPCorrected", + "label": "LMP Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 6, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 7, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:00.514846+00:00", + "sha256": "73a38d542e10bee603ef8d7957332b7a977ff806dff171eafa3727c9e4a5c656", + "byte_count": 1550, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:00.514846+00:00", + "sha256": "73a38d542e10bee603ef8d7957332b7a977ff806dff171eafa3727c9e4a5c656", + "byte_count": 1550, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_eblmp?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:02.338482+00:00", + "sha256": "c48c8ec1db8c625acb254116d4760d2b18323bb500ebda873e39bcd319863500", + "byte_count": 1553, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-196-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13044, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-196-m--dam_price_corrections_mcpc.json b/tools/inputs/current/np4-196-m--dam_price_corrections_mcpc.json new file mode 100644 index 00000000..0a848eb1 --- /dev/null +++ b/tools/inputs/current/np4-196-m--dam_price_corrections_mcpc.json @@ -0,0 +1,238 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-196-m/dam_price_corrections_mcpc", + "observed_at": "2026-09-06 00:32:55.870063+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "MCPCOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "MCPCOriginal", + "label": "MCPC Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "MCPCCorrected", + "label": "MCPC Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 6, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 7, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:55.870063+00:00", + "sha256": "3c0814c609efe98095dc5f475e84760b80dac09c9a528b1566fb428fc4579091", + "byte_count": 1525, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:32:55.870063+00:00", + "sha256": "3c0814c609efe98095dc5f475e84760b80dac09c9a528b1566fb428fc4579091", + "byte_count": 1525, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_mcpc?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:32:57.945622+00:00", + "sha256": "b8e89ccaf67a683bf2498a7d7e17dedc5aeb09e4727904945410a7b131bdcca7", + "byte_count": 1524, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-196-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13044, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-196-m--dam_price_corrections_spp.json b/tools/inputs/current/np4-196-m--dam_price_corrections_spp.json new file mode 100644 index 00000000..99b245e6 --- /dev/null +++ b/tools/inputs/current/np4-196-m--dam_price_corrections_spp.json @@ -0,0 +1,238 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-196-m/dam_price_corrections_spp", + "observed_at": "2026-09-06 00:32:51.747752+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "SPPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "SPPOriginal", + "label": "Settlement Point Price Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "SPPCorrected", + "label": "Settlement Point Price Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 6, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 7, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:32:51.747752+00:00", + "sha256": "33a23a8c07f56dc4a9d7f4c3bfdaab8df7c8418f2b44de5332c79f1210acfb37", + "byte_count": 1594, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:32:51.747752+00:00", + "sha256": "33a23a8c07f56dc4a9d7f4c3bfdaab8df7c8418f2b44de5332c79f1210acfb37", + "byte_count": 1594, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-196-m/dam_price_corrections_spp?size=1&page=1&sort=priceCorrectionTime&dir=asc", + "retrieved_at": "2026-09-06 00:32:53.837804+00:00", + "sha256": "4a39145ee09ff92fdbaf3368e91fc714315e635a89d95cb241a8c4bc7af44326", + "byte_count": 1595, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-196-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13044, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-197-m--rtm_price_corrections_eblmp.json b/tools/inputs/current/np4-197-m--rtm_price_corrections_eblmp.json new file mode 100644 index 00000000..65dd2759 --- /dev/null +++ b/tools/inputs/current/np4-197-m--rtm_price_corrections_eblmp.json @@ -0,0 +1,266 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_eblmp", + "observed_at": "2026-09-06 00:33:31.287166+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "cappedLMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedLMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedLMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedLMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "electricalBus", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "electricalBus", + "label": "Electrical Bus", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedLMPOriginal", + "label": "Capped LMP Original", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedLMPOriginal", + "label": "Uncapped LMP Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "cappedLMPCorrected", + "label": "Capped LMP Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedLMPCorrected", + "label": "Uncapped LMP Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 7, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:31.287166+00:00", + "sha256": "daacde6c38a38f0390c4e12f1879f77d4e3e2d7c1939317941a315b4c86c8ba1", + "byte_count": 1793, + "status": 200 + }, + "observed_nullable_fields": [ + "uncappedLMPCorrected", + "uncappedLMPOriginal" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:31.287166+00:00", + "sha256": "daacde6c38a38f0390c4e12f1879f77d4e3e2d7c1939317941a315b4c86c8ba1", + "byte_count": 1793, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_eblmp?size=1&page=1&sort=priceCorrectionTime&dir=asc", + "retrieved_at": "2026-09-06 00:33:39.121693+00:00", + "sha256": "e9d5a54a787f4d787a6b41c2012df438800bfcc7b0c6bbaea2ae64192d9caf98", + "byte_count": 1795, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-197-m--rtm_price_corrections_mcpc_sced.json b/tools/inputs/current/np4-197-m--rtm_price_corrections_mcpc_sced.json new file mode 100644 index 00000000..e183aa3d --- /dev/null +++ b/tools/inputs/current/np4-197-m--rtm_price_corrections_mcpc_sced.json @@ -0,0 +1,266 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_mcpc_sced", + "observed_at": "2026-09-06 00:33:16.884297+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "cappedMCPCOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedMCPCOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedMCPCCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedMCPCCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedMCPCOriginal", + "label": "Capped MCPC Original", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedMCPCOriginal", + "label": "Uncapped MCPC Original", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "cappedMCPCCorrected", + "label": "Capped MCPC Corrected", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedMCPCCorrected", + "label": "Uncapped MCPC Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 7, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:16.884297+00:00", + "sha256": "f603f64a418ba88a5a92de01e1929e5ff768c905916f37e346127877195386dd", + "byte_count": 1792, + "status": 200 + }, + "observed_nullable_fields": [ + "uncappedMCPCCorrected", + "uncappedMCPCOriginal" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:16.884297+00:00", + "sha256": "f603f64a418ba88a5a92de01e1929e5ff768c905916f37e346127877195386dd", + "byte_count": 1792, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_sced?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:33:18.980553+00:00", + "sha256": "6307e492749c04525fe05cac1dbf51edd82a98f29ed0735f0194f8bde2e7f26c", + "byte_count": 1791, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-197-m--rtm_price_corrections_mcpc_spp.json b/tools/inputs/current/np4-197-m--rtm_price_corrections_mcpc_spp.json new file mode 100644 index 00000000..6680d9ac --- /dev/null +++ b/tools/inputs/current/np4-197-m--rtm_price_corrections_mcpc_spp.json @@ -0,0 +1,263 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_mcpc_spp", + "observed_at": "2026-09-06 00:33:47.743460+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "MCPCOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "MCPCOriginal", + "label": "MCPC Original", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "MCPCCorrected", + "label": "MCPC Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 7, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:47.743460+00:00", + "sha256": "93c4dde4dc74c14fd8978f9328bafba61c5367c460f7f15756a09c010ba254aa", + "byte_count": 1732, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:47.743460+00:00", + "sha256": "93c4dde4dc74c14fd8978f9328bafba61c5367c460f7f15756a09c010ba254aa", + "byte_count": 1732, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_mcpc_spp?size=1&page=1&sort=priceCorrectionTime&dir=asc", + "retrieved_at": "2026-09-06 00:33:49.686029+00:00", + "sha256": "2976690ee5ff354be239bc94b1ed5a05be957b48406e869888c2ba9f53110ffd", + "byte_count": 1730, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-197-m--rtm_price_corrections_shadow.json b/tools/inputs/current/np4-197-m--rtm_price_corrections_shadow.json new file mode 100644 index 00000000..4e0c8185 --- /dev/null +++ b/tools/inputs/current/np4-197-m--rtm_price_corrections_shadow.json @@ -0,0 +1,355 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_shadow", + "observed_at": "2026-09-06 00:33:04.452226+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "constraintIdFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintIdTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "contingencyName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "shadowPriceOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintId", + "label": "Constraint Id", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintName", + "label": "Constraint Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "contingencyName", + "label": "Contingency Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "shadowPriceOriginal", + "label": "Shadow Price Original", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "shadowPriceCorrected", + "label": "Shadow Price Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "limitOriginal", + "label": "Limit Original", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "limitCorrected", + "label": "Limit Corrected", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "valueOriginal", + "label": "Value Original", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "valueCorrected", + "label": "Value Corrected", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 11, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 12, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:04.452226+00:00", + "sha256": "f5606e297fb1d959006e4768e4c05ef868dd0868e122e278f69d3a0791543601", + "byte_count": 2340, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:04.452226+00:00", + "sha256": "f5606e297fb1d959006e4768e4c05ef868dd0868e122e278f69d3a0791543601", + "byte_count": 2340, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_shadow?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:33:06.383626+00:00", + "sha256": "0dd9440b9b6a75387286287f289543aa1361c71e7d0baf894f4f3e3cf7ee4b72", + "byte_count": 2332, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-197-m--rtm_price_corrections_soglmp.json b/tools/inputs/current/np4-197-m--rtm_price_corrections_soglmp.json new file mode 100644 index 00000000..27dfe60b --- /dev/null +++ b/tools/inputs/current/np4-197-m--rtm_price_corrections_soglmp.json @@ -0,0 +1,368 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_soglmp", + "observed_at": "2026-09-06 00:33:08.878850+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "resourceType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "resourceName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterLMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterLMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterLMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterLMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPACorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPACorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "resourceType", + "label": "Resource Type", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceName", + "label": "Resource Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterName", + "label": "Meter Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterLMPOriginal", + "label": "Meter LMP Original", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "meterLMPCorrected", + "label": "Meter LMP Corrected", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPAOriginal", + "label": "RTRDPA Original", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPACorrected", + "label": "RTRDPA Corrected", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "finalLMPOriginal", + "label": "Final LMP Original", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "finalLMPCorrected", + "label": "Final LMP Corrected", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 11, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": " Repeat Hour Flag", + "cardinality": 12, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "RTORPAOriginal", + "label": "RTORPA Original", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": false, + "sortable": false, + "hasRange": true + }, + { + "name": "RTORPACorrected", + "label": "RTORPA Corrected", + "cardinality": 14, + "dataType": "DOUBLE", + "searchable": false, + "sortable": false, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:08.878850+00:00", + "sha256": "6e44a667ea8adf224d6516c9df931bbd0ad9b4d80d26c51573d19af1af278dce", + "byte_count": 2650, + "status": 200 + }, + "observed_nullable_fields": [ + "RTORPACorrected", + "RTORPAOriginal" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:33:08.878850+00:00", + "sha256": "6e44a667ea8adf224d6516c9df931bbd0ad9b4d80d26c51573d19af1af278dce", + "byte_count": 2650, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_soglmp?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:33:10.793701+00:00", + "sha256": "c8629403994867e0335a4e0ed090b7ce75a66b8b118d490b3bc58ba0e72703c4", + "byte_count": 2647, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-197-m--rtm_price_corrections_sogprice.json b/tools/inputs/current/np4-197-m--rtm_price_corrections_sogprice.json new file mode 100644 index 00000000..b828f773 --- /dev/null +++ b/tools/inputs/current/np4-197-m--rtm_price_corrections_sogprice.json @@ -0,0 +1,297 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_sogprice", + "observed_at": "2026-09-06 00:33:12.873257+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "resourceType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "resourceName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "priceOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "resourceType", + "label": "Resource Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceName", + "label": "Resource Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterName", + "label": "Meter Name", + "cardinality": 6, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "priceOriginal", + "label": "Price Original", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrected", + "label": "Price Corrected", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 9, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 10, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:12.873257+00:00", + "sha256": "3ec799b42a7f5dbbcf928e22341229aa28202ec7a04bd68208059f2e72a9f67b", + "byte_count": 2013, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:12.873257+00:00", + "sha256": "3ec799b42a7f5dbbcf928e22341229aa28202ec7a04bd68208059f2e72a9f67b", + "byte_count": 2013, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_sogprice?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:14.885150+00:00", + "sha256": "40515fc1bb929fababb59e5838b2f4f3ef6a7c86abfe59e6258dc1644392f601", + "byte_count": 2008, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-197-m--rtm_price_corrections_splmp.json b/tools/inputs/current/np4-197-m--rtm_price_corrections_splmp.json new file mode 100644 index 00000000..ff82b154 --- /dev/null +++ b/tools/inputs/current/np4-197-m--rtm_price_corrections_splmp.json @@ -0,0 +1,213 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_splmp", + "observed_at": "2026-09-06 00:33:44.512474+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "settlementPointName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "settlementPointName", + "label": "Settlement Point", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMPOriginal", + "label": "LMP Original", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "LMPCorrected", + "label": "LMP Corrected", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 5, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 6, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:44.512474+00:00", + "sha256": "0b8df9d51b38f9aec09a77e6ceb9a72d9cf5b7b2222c1dd66b586d4227085eeb", + "byte_count": 1438, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp?size=1&page=1&sort=priceCorrectionTime&dir=desc", + "retrieved_at": "2026-09-06 00:33:44.512474+00:00", + "sha256": "0b8df9d51b38f9aec09a77e6ceb9a72d9cf5b7b2222c1dd66b586d4227085eeb", + "byte_count": 1438, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_splmp?size=1&page=1&sort=priceCorrectionTime&dir=asc", + "retrieved_at": "2026-09-06 00:33:46.181612+00:00", + "sha256": "227429807fb2d95fb881a2830ea38b1f78c35ff78b1c89c695f02bedcc105a14", + "byte_count": 1437, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-197-m--rtm_price_corrections_spp.json b/tools/inputs/current/np4-197-m--rtm_price_corrections_spp.json new file mode 100644 index 00000000..b787d052 --- /dev/null +++ b/tools/inputs/current/np4-197-m--rtm_price_corrections_spp.json @@ -0,0 +1,280 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-197-m/rtm_price_corrections_spp", + "observed_at": "2026-09-06 00:33:39.282719+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "settlementPointName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPointType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "SPPOriginalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPOriginalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPCorrectedFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SPPCorrectedTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceCorrectionTimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "priceCorrectionTimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "settlementPointName", + "label": "Settlement Point Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPointType", + "label": "Settlement Point Type", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "SPPOriginal", + "label": "SPP Original", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "SPPCorrected", + "label": "SPP Corrected", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "priceCorrectionTime", + "label": "Price Correction Time", + "cardinality": 8, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 9, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:39.282719+00:00", + "sha256": "058496e9703c6dc9381b788dab58a8551638f06cb4be13efc354e3e62020033e", + "byte_count": 1865, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:39.282719+00:00", + "sha256": "058496e9703c6dc9381b788dab58a8551638f06cb4be13efc354e3e62020033e", + "byte_count": 1865, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-197-m/rtm_price_corrections_spp?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:41.343686+00:00", + "sha256": "9a7592136c8c0179bc1f114a33c326ec8c5ebc848b8a9b3cd4dd8115c7c1ab3a", + "byte_count": 1863, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-197-M", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13045, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-200-cd--dam_de_energized_spbc.json b/tools/inputs/current/np4-200-cd--dam_de_energized_spbc.json new file mode 100644 index 00000000..296b8ede --- /dev/null +++ b/tools/inputs/current/np4-200-cd--dam_de_energized_spbc.json @@ -0,0 +1,155 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-200-cd/dam_de_energized_spbc", + "observed_at": "2026-09-06 00:33:57.003317+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 4, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:57.003317+00:00", + "sha256": "04fce1756dcf0732ef9aae79179c8d0f8cff83f7f313931584c0a4c094df7361", + "byte_count": 1133, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:33:57.003317+00:00", + "sha256": "04fce1756dcf0732ef9aae79179c8d0f8cff83f7f313931584c0a4c094df7361", + "byte_count": 1133, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-200-cd/dam_de_energized_spbc?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:33:59.081259+00:00", + "sha256": "08ac3b070979f0acf986d284df465112be8b6ebce528458e1a2be3e7d2034a68", + "byte_count": 1132, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-200-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13063, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-212-cd--dam_sced_as_demand_curves.json b/tools/inputs/current/np4-212-cd--dam_sced_as_demand_curves.json new file mode 100644 index 00000000..ba2d1ed5 --- /dev/null +++ b/tools/inputs/current/np4-212-cd--dam_sced_as_demand_curves.json @@ -0,0 +1,255 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-212-cd/dam_sced_as_demand_curves", + "observed_at": "2026-09-06 00:34:08.261581+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "demandCurvePointFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "demandCurvePointTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "demandCurvePoint", + "label": "Demand Curve Point", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "price", + "label": "Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:08.261581+00:00", + "sha256": "c0f4e123289450c5181d49b4355075216ffd9546820726a9e95b684b8809e7c0", + "byte_count": 1681, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:08.261581+00:00", + "sha256": "c0f4e123289450c5181d49b4355075216ffd9546820726a9e95b684b8809e7c0", + "byte_count": 1681, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-212-cd/dam_sced_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:34:14.051951+00:00", + "sha256": "fdf0c6af9faa4867820233b305d59d0acfcafbb12d74a14a6918bad439d24ca1", + "byte_count": 1682, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-212-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24893, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-213-cd--hruc_as_demand_curves.json b/tools/inputs/current/np4-213-cd--hruc_as_demand_curves.json new file mode 100644 index 00000000..a8bfbc64 --- /dev/null +++ b/tools/inputs/current/np4-213-cd--hruc_as_demand_curves.json @@ -0,0 +1,255 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-213-cd/hruc_as_demand_curves", + "observed_at": "2026-09-06 00:34:24.741049+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "RUCTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RUCTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "demandCurvePointFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "demandCurvePointTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "RUCTimestamp", + "label": "RUC Timestamp", + "cardinality": 3, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "demandCurvePoint", + "label": "Demand Curve Point", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "price", + "label": "Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:24.741049+00:00", + "sha256": "4a4d5f8551c941d5c9978cb435f4c90a3bfd8ce77052c17127df3bfdb75b349b", + "byte_count": 1674, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:24.741049+00:00", + "sha256": "4a4d5f8551c941d5c9978cb435f4c90a3bfd8ce77052c17127df3bfdb75b349b", + "byte_count": 1674, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-213-cd/hruc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:34:31.094636+00:00", + "sha256": "66d52d07fc7ac60680f5722ecb8a41f0b4e2c927043c91e3a89385bb64558367", + "byte_count": 1673, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-213-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 26382, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-214-cd--druc_as_demand_curves.json b/tools/inputs/current/np4-214-cd--druc_as_demand_curves.json new file mode 100644 index 00000000..a706bc2b --- /dev/null +++ b/tools/inputs/current/np4-214-cd--druc_as_demand_curves.json @@ -0,0 +1,255 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-214-cd/druc_as_demand_curves", + "observed_at": "2026-09-06 00:34:31.620370+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "RUCTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RUCTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "demandCurvePointFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "demandCurvePointTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "RUCTimestamp", + "label": "RUC Timestamp", + "cardinality": 3, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "demandCurvePoint", + "label": "Demand Curve Point", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "price", + "label": "Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:31.620370+00:00", + "sha256": "70e2be03bae063a1228ad564f4ee5ca9a5ed120580867da6158bbaaa1f063626", + "byte_count": 1670, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:31.620370+00:00", + "sha256": "70e2be03bae063a1228ad564f4ee5ca9a5ed120580867da6158bbaaa1f063626", + "byte_count": 1670, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-214-cd/druc_as_demand_curves?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:34:33.531743+00:00", + "sha256": "8c9352a6467b5e4692f5ccea9aeb38f2cb68e02d25a8e845f056a16ad056aa15", + "byte_count": 1672, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-214-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 26383, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-215-cd--wruc_as_demand_curves.json b/tools/inputs/current/np4-215-cd--wruc_as_demand_curves.json new file mode 100644 index 00000000..f4ff6927 --- /dev/null +++ b/tools/inputs/current/np4-215-cd--wruc_as_demand_curves.json @@ -0,0 +1,280 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-215-cd/wruc_as_demand_curves", + "observed_at": "2026-09-06 00:34:37.568075+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "RUCTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RUCTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "demandCurvePointFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "demandCurvePointTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "RUCTimestamp", + "label": "RUC Timestamp", + "cardinality": 4, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "demandCurvePoint", + "label": "Demand Curve Point", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "price", + "label": "Price", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 9, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:37.568075+00:00", + "sha256": "ed7433735b66b8920357ad1770c025117b8c4f3fae2c0f174e1a9d5d28013e62", + "byte_count": 1825, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:37.568075+00:00", + "sha256": "ed7433735b66b8920357ad1770c025117b8c4f3fae2c0f174e1a9d5d28013e62", + "byte_count": 1825, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-215-cd/wruc_as_demand_curves?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:34:39.851515+00:00", + "sha256": "e8e396838ccf075c55dd8a8077550334c56b0f07f65b738cc1a77ab4da90e157", + "byte_count": 1826, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-215-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 26384, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-231-cd--electrical_bus_map_heur_price.json b/tools/inputs/current/np4-231-cd--electrical_bus_map_heur_price.json new file mode 100644 index 00000000..86b06841 --- /dev/null +++ b/tools/inputs/current/np4-231-cd--electrical_bus_map_heur_price.json @@ -0,0 +1,197 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-231-cd/electrical_bus_map_heur_price", + "observed_at": "2026-09-06 00:34:40.026782+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "toEBName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "type", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "priorityFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "priorityTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "marketType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "fromEBName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "marketType", + "label": "Market Type", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "fromEBName", + "label": "From EB Name", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "toEBName", + "label": "To EB Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "type", + "label": "Type", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "priority", + "label": "Prioirty", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:40.026782+00:00", + "sha256": "0757c36af7899c97591b482f4f7e9380dc03c393078d36b2b59c9c940196e2bc", + "byte_count": 1393, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price?size=1&page=1&sort=postedDatetime&dir=desc", + "retrieved_at": "2026-09-06 00:34:40.026782+00:00", + "sha256": "0757c36af7899c97591b482f4f7e9380dc03c393078d36b2b59c9c940196e2bc", + "byte_count": 1393, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-231-cd/electrical_bus_map_heur_price?size=1&page=1&sort=postedDatetime&dir=asc", + "retrieved_at": "2026-09-06 00:34:42.053902+00:00", + "sha256": "14f185bca4e7364790b212ec7d5d5a6ccf79d3e9edf533e2d1ce4e6b06527d64", + "byte_count": 1389, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-231-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13098, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-33-cd--dam_as_plan.json b/tools/inputs/current/np4-33-cd--dam_as_plan.json new file mode 100644 index 00000000..32bccfbf --- /dev/null +++ b/tools/inputs/current/np4-33-cd--dam_as_plan.json @@ -0,0 +1,205 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-33-cd/dam_as_plan", + "observed_at": "2026-09-06 00:34:44.828813+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "ancillaryType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "quantityFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "quantityTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "postedDatetimeFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "postedDatetimeTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "postedDatetime", + "label": "Posted", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 2, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ancillaryType", + "label": "Ancillary Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "quantity", + "label": "Quantity", + "cardinality": 5, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 6, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:44.828813+00:00", + "sha256": "a29dd5a759f3a1c85ebcaed9d13b20fb56ab0f7d7acf3af32f486b72d0062795", + "byte_count": 1345, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:34:44.828813+00:00", + "sha256": "a29dd5a759f3a1c85ebcaed9d13b20fb56ab0f7d7acf3af32f486b72d0062795", + "byte_count": 1345, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-33-cd/dam_as_plan?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:34:46.453380+00:00", + "sha256": "38abe96b4545df12a03b1e7956435cfbd3bdd6009408fdb3944ea61e56f9874a", + "byte_count": 1344, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-33-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12316, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np4-523-cd--dam_system_lambda.json b/tools/inputs/current/np4-523-cd--dam_system_lambda.json new file mode 100644 index 00000000..5ad15640 --- /dev/null +++ b/tools/inputs/current/np4-523-cd--dam_system_lambda.json @@ -0,0 +1,163 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np4-523-cd/dam_system_lambda", + "observed_at": "2026-09-06 00:29:07.797208+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "systemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "systemLambda", + "label": "System Lambda", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 4, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:29:07.797208+00:00", + "sha256": "766feac4c56955e0a17ad211f1591588f375f40e8da86206d748897b66bdb7a0", + "byte_count": 1061, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:29:07.797208+00:00", + "sha256": "766feac4c56955e0a17ad211f1591588f375f40e8da86206d748897b66bdb7a0", + "byte_count": 1061, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np4-523-cd/dam_system_lambda?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:29:09.895072+00:00", + "sha256": "2b988b1c0c75b3a7aa1eea3c6658c0237f22cae1870eaaf8e6f17879bb0e02b8", + "byte_count": 1059, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP4-523-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13113, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-322-cd--sced_system_lambda.json b/tools/inputs/current/np6-322-cd--sced_system_lambda.json new file mode 100644 index 00000000..50f2ea2a --- /dev/null +++ b/tools/inputs/current/np6-322-cd--sced_system_lambda.json @@ -0,0 +1,173 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-322-cd/sced_system_lambda", + "observed_at": "2026-09-06 00:28:59.474426+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "cappedSystemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedSystemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedSystemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedSystemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedSystemLambda", + "label": "Capped System Lambda", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedSystemLambda", + "label": "Uncapped System Lambda", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:28:59.474426+00:00", + "sha256": "77ca7de176a6e8b5054e003fbefb544c5a9708d7e0afd78e1586bb640a10f374", + "byte_count": 1136, + "status": 200 + }, + "observed_nullable_fields": [ + "uncappedSystemLambda" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:28:59.474426+00:00", + "sha256": "77ca7de176a6e8b5054e003fbefb544c5a9708d7e0afd78e1586bb640a10f374", + "byte_count": 1136, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-322-cd/sced_system_lambda?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:01.567657+00:00", + "sha256": "4971a333900c56d988835c3b8bcceaded74a110cecfd7376c6c98d08e78ddb74", + "byte_count": 1139, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-322-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13114, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-323-cd--rt_price_adder_sced.json b/tools/inputs/current/np6-323-cd--rt_price_adder_sced.json new file mode 100644 index 00000000..90d687c6 --- /dev/null +++ b/tools/inputs/current/np6-323-cd--rt_price_adder_sced.json @@ -0,0 +1,573 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-323-cd/rt_price_adder_sced", + "observed_at": "2026-09-06 00:31:12.153704+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "systemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPATo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARUSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARUSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARDSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARDSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPANSSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPANSSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRUCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRUCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRMRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRMRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDNCLRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDNCLRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDERSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDERSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEIMPORTFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEIMPORTTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEEXPORTFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEEXPORTTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTIMPORTFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTIMPORTTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTEXPORTFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTEXPORTTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLLSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLLSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLHSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLHSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDLLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDLLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "systemLambda", + "label": "System Lambda", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPA", + "label": "RTRDPA", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARUS", + "label": "RTRDPARUS", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARDS", + "label": "RTRDPARDS", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARRS", + "label": "RTRDPARRS", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPAECRS", + "label": "RTRDPAECRS", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPANSS", + "label": "RTRDPANSS", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRRUC", + "label": "RTRRUC", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRRMR", + "label": "RTRRMR", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDNCLR", + "label": "RTDNCLR", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDERS", + "label": "RTDERS", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDCTIEIMPORT", + "label": "RTDCTIEIMPORT", + "cardinality": 14, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDCTIEEXPORT", + "label": "RTDCTIEEXPORT", + "cardinality": 15, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTBLTIMPORT", + "label": "RTBLTIMPORT", + "cardinality": 16, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTBLTEXPORT", + "label": "RTBLTEXPORT", + "cardinality": 17, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTOLLSL", + "label": "RTOLLSL", + "cardinality": 18, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTOLHSL", + "label": "RTOLHSL", + "cardinality": 19, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDLL", + "label": "RTDLL", + "cardinality": 20, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:12.153704+00:00", + "sha256": "67f0d42818fe6f977d738a0926e7cf04cde4ff4ac290cc65d27d5c8365f822fc", + "byte_count": 3211, + "status": 200 + }, + "observed_nullable_fields": [ + "RTDLL" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:12.153704+00:00", + "sha256": "67f0d42818fe6f977d738a0926e7cf04cde4ff4ac290cc65d27d5c8365f822fc", + "byte_count": 3211, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-323-cd/rt_price_adder_sced?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:14.300100+00:00", + "sha256": "fbbf89da188814d6615ee7f0a5cebde1d105e68c4e33d2561ea4919e1c5f46d4", + "byte_count": 3211, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-323-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13221, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-324-cd--rt_15min_price_adders.json b/tools/inputs/current/np6-324-cd--rt_15min_price_adders.json new file mode 100644 index 00000000..b08ad85d --- /dev/null +++ b/tools/inputs/current/np6-324-cd--rt_15min_price_adders.json @@ -0,0 +1,321 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-324-cd/rt_15min_price_adders", + "observed_at": "2026-09-06 00:31:16.353390+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "RTRDPAFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPATo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRUFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRUTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRDFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRDTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPRRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPNSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPNSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPA", + "label": "RTRDPA", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPRU", + "label": "RTRDPRU", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPRD", + "label": "RTRDPRD", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPRRS", + "label": "RTRDPRRS", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPECRS", + "label": "RTRDPECRS", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPNS", + "label": "RTRDPNS", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 10, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:16.353390+00:00", + "sha256": "961eefa8a4a711a38d900384dd3b42a4ab0367b39ee6ddd292c3cc1e649d846f", + "byte_count": 1891, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:16.353390+00:00", + "sha256": "961eefa8a4a711a38d900384dd3b42a4ab0367b39ee6ddd292c3cc1e649d846f", + "byte_count": 1891, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-324-cd/rt_15min_price_adders?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:31:18.428695+00:00", + "sha256": "027c9a2300ba7911c754f8eebe6175b0051016fb4d8d58c9e5c66960737db055", + "byte_count": 1890, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-324-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13220, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-325-cd--rtd_price_adders.json b/tools/inputs/current/np6-325-cd--rtd_price_adders.json new file mode 100644 index 00000000..8ed9c645 --- /dev/null +++ b/tools/inputs/current/np6-325-cd--rtd_price_adders.json @@ -0,0 +1,640 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-325-cd/rtd_price_adders", + "observed_at": "2026-09-06 00:31:04.471292+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "RTDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RTDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "intervalIDFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalIDTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalEndingFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "IERepeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "systemLambdaFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "systemLambdaTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPATo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARUSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARUSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARDSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARDSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPARRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPANSSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPANSSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRUCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRUCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRMRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRRMRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDNCLRFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDNCLRTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDERSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDERSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEImportFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEImportTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEExportFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDCTIEExportTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTImportFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTImportTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTExportFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTBLTExportTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLLSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLLSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLHSLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTOLHSLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDLLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDLLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "RTDTimestamp", + "label": "RTD Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "intervalID", + "label": "Interval ID", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalEnding", + "label": "Interval Ending", + "cardinality": 4, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "IERepeatHourFlag", + "label": "IE Repeated Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "systemLambda", + "label": "System Lambda", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPA", + "label": "RTRDPA", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARUS", + "label": "RTRDPARUS", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARDS", + "label": "RTRDPARDS", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPARRS", + "label": "RTRDPARRS", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPAECRS", + "label": "RTRDPAECRS", + "cardinality": 11, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPANSS", + "label": "RTRDPANSS", + "cardinality": 12, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRRUC", + "label": "RTRRUC", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRRMR", + "label": "RTRRMR", + "cardinality": 14, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDNCLR", + "label": "RTDNCLR", + "cardinality": 15, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDERS", + "label": "RTDERS", + "cardinality": 16, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDCTIEImport", + "label": "RTDCTIEIMPORT", + "cardinality": 17, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDCTIEExport", + "label": "RTDCTIEEXPORT", + "cardinality": 18, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTBLTImport", + "label": "RTBLTIMPORT", + "cardinality": 19, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTBLTExport", + "label": "RTBLTEXPORT", + "cardinality": 20, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTOLLSL", + "label": "RTOLLSL", + "cardinality": 21, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTOLHSL", + "label": "RTOLHSL", + "cardinality": 22, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTDLL", + "label": "RTDLL", + "cardinality": 23, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:04.471292+00:00", + "sha256": "c4d02b98f78e09bb85eda102da98765be19e8e495cd048205d670beb4453ab1c", + "byte_count": 3644, + "status": 200 + }, + "observed_nullable_fields": [ + "RTDLL" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:04.471292+00:00", + "sha256": "c4d02b98f78e09bb85eda102da98765be19e8e495cd048205d670beb4453ab1c", + "byte_count": 3644, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-325-cd/rtd_price_adders?size=1&page=1&sort=RTDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:06.552442+00:00", + "sha256": "7bd2b55b3c121038863a74f93a27948cb857d3d7fb0e0e7b419913b24a7d1445", + "byte_count": 3635, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-325-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13222, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-326-cd--rt_price_sog.json b/tools/inputs/current/np6-326-cd--rt_price_sog.json new file mode 100644 index 00000000..d8482df6 --- /dev/null +++ b/tools/inputs/current/np6-326-cd--rt_price_sog.json @@ -0,0 +1,247 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-326-cd/rt_price_sog", + "observed_at": "2026-09-06 00:31:20.888518+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntervalTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "resourceType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "resourceName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterPriceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterPriceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInterval", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "resourceType", + "label": "Resource Type", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceName", + "label": "Resource Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterName", + "label": "Meter Name", + "cardinality": 6, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterPrice", + "label": "Meter Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:20.888518+00:00", + "sha256": "a3a54b7424614862ded3f8f302642e3c8dee48515d0961f74a2f02d359421987", + "byte_count": 1646, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:20.888518+00:00", + "sha256": "a3a54b7424614862ded3f8f302642e3c8dee48515d0961f74a2f02d359421987", + "byte_count": 1646, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-326-cd/rt_price_sog?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:31:22.696810+00:00", + "sha256": "cb5ac6745ec658a40d12ccc733cb05a7e01cf8d00a3c070b2f00b2d654dba28c", + "byte_count": 1644, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-326-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 21115, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-327-cd--lmp_sog_price_adders.json b/tools/inputs/current/np6-327-cd--lmp_sog_price_adders.json new file mode 100644 index 00000000..dc884212 --- /dev/null +++ b/tools/inputs/current/np6-327-cd--lmp_sog_price_adders.json @@ -0,0 +1,289 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-327-cd/lmp_sog_price_adders", + "observed_at": "2026-09-06 00:31:26.465076+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "resourceType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "resourceName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "stationName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "voltageLevelFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "voltageLevelTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "meterLMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "meterLMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPAFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTRDPATo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "finalLMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceType", + "label": "Resource Type", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "resourceName", + "label": "Resource Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "stationName", + "label": "Station Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "voltageLevel", + "label": "Voltage Level", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "meterName", + "label": "Meter Name", + "cardinality": 7, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "meterLMP", + "label": "Meter LMP", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RTRDPA", + "label": "RTRDPA", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "finalLMP", + "label": "Final LMP", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:26.465076+00:00", + "sha256": "c216f6148611a494fdc747a0f3dbd0368fe691f9d5df85d4ec73d8982fea3689", + "byte_count": 1957, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:26.465076+00:00", + "sha256": "c216f6148611a494fdc747a0f3dbd0368fe691f9d5df85d4ec73d8982fea3689", + "byte_count": 1957, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-327-cd/lmp_sog_price_adders?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:27.385676+00:00", + "sha256": "f9da8a1192f808af407756e0206aa16b570f58d6051f951fb39a3c237ae40da0", + "byte_count": 1957, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-327-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 21114, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-328-cd--tot_as_res_cap.json b/tools/inputs/current/np6-328-cd--tot_as_res_cap.json new file mode 100644 index 00000000..3cf5d5dc --- /dev/null +++ b/tools/inputs/current/np6-328-cd--tot_as_res_cap.json @@ -0,0 +1,321 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-328-cd/tot_as_res_cap", + "observed_at": "2026-09-06 00:31:28.945447+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "capREGDNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGDNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capRRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capRRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capNSPINFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capNSPINTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSECRSNSPINFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPRRSECRSNSPINTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "capREGUPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "capREGUPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Time Stamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "capREGUP", + "label": "CapREGUPTotal", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capREGDN", + "label": "CapREGDNTotal", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capRRS", + "label": "CapRRSTotal", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capECRS", + "label": "CapECRSTotal", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capNSPIN", + "label": "CapNSPINTotal", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capREGUPRRS", + "label": "CapREGUP_RRSTotal", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capREGUPRRSECRS", + "label": "CapREGUP_RRS_ECRSTotal", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "capREGUPRRSECRSNSPIN", + "label": "CapREGUP_RRS_ECRS_NSPINTotal", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:28.945447+00:00", + "sha256": "076ed447f643c88d3938c9d2a297e30ed7bce5b892429fd402c91be561935711", + "byte_count": 2008, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:28.945447+00:00", + "sha256": "076ed447f643c88d3938c9d2a297e30ed7bce5b892429fd402c91be561935711", + "byte_count": 2008, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-328-cd/tot_as_res_cap?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:31.071131+00:00", + "sha256": "9cdc02f04a7283319b00fdbc0d6ecbce420279022e38dbad7f6d67d1ca114e4c", + "byte_count": 2007, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-328-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24887, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-329-cd--rtd_ind_mcpc.json b/tools/inputs/current/np6-329-cd--rtd_ind_mcpc.json new file mode 100644 index 00000000..9f3db128 --- /dev/null +++ b/tools/inputs/current/np6-329-cd--rtd_ind_mcpc.json @@ -0,0 +1,313 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-329-cd/rtd_ind_mcpc", + "observed_at": "2026-09-06 00:31:08.321837+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "RRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "ECRSTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "NSPINTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "RTDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RTDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "intervalIdFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalIdTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalEndingFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalRepeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "REGUPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGUPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "REGDNTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "RTDTimestamp", + "label": "RTD Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "intervalId", + "label": "Interval ID", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalEnding", + "label": "Interval Ending", + "cardinality": 4, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalRepeatHourFlag", + "label": "Interval Ending Repeat Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "REGUP", + "label": "REGUP", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "REGDN", + "label": "REGDN", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "RRS", + "label": "RRS", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "ECRS", + "label": "ECRS", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "NSPIN", + "label": "NSPIN", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:08.321837+00:00", + "sha256": "5e9e8ba38d87463616136b1463341e8fd78a31fba130693fb0f7ca82f1dfe514", + "byte_count": 1890, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:08.321837+00:00", + "sha256": "5e9e8ba38d87463616136b1463341e8fd78a31fba130693fb0f7ca82f1dfe514", + "byte_count": 1890, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-329-cd/rtd_ind_mcpc?size=1&page=1&sort=RTDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:10.263823+00:00", + "sha256": "8e5d5f24ff6f8e4c3f08b9a4439f12df1ea317dbc2f0fe904ecec1895eefc03b", + "byte_count": 1892, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-329-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24889, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-331-cd--rt_clear_price_cap.json b/tools/inputs/current/np6-331-cd--rt_clear_price_cap.json new file mode 100644 index 00000000..acc196a7 --- /dev/null +++ b/tools/inputs/current/np6-331-cd--rt_clear_price_cap.json @@ -0,0 +1,213 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-331-cd/rt_clear_price_cap", + "observed_at": "2026-09-06 00:31:33.147496+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "deliveryDateFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryDateTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "deliveryHourFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryHourTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "deliveryIntTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "MCPCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "MCPCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "deliveryDate", + "label": "Delivery Date", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryHour", + "label": "Delivery Hour", + "cardinality": 2, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "deliveryInt", + "label": "Delivery Interval", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 4, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "MCPC", + "label": "MCPC", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:33.147496+00:00", + "sha256": "559631ae29eedeab7cccb265d22ca1232686479c4d1d3ede643b8bc298a6b293", + "byte_count": 1386, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap?size=1&page=1&sort=deliveryDate&dir=desc", + "retrieved_at": "2026-09-06 00:31:33.147496+00:00", + "sha256": "559631ae29eedeab7cccb265d22ca1232686479c4d1d3ede643b8bc298a6b293", + "byte_count": 1386, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-331-cd/rt_clear_price_cap?size=1&page=1&sort=deliveryDate&dir=asc", + "retrieved_at": "2026-09-06 00:31:35.294454+00:00", + "sha256": "556c83d4d62051828fac3b17f090e7ecda8aa70001ca42762f47206b476cf5da", + "byte_count": 1385, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-331-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24898, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-332-cd--rt_clear_price_cap_sced.json b/tools/inputs/current/np6-332-cd--rt_clear_price_cap_sced.json new file mode 100644 index 00000000..f3359041 --- /dev/null +++ b/tools/inputs/current/np6-332-cd--rt_clear_price_cap_sced.json @@ -0,0 +1,190 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-332-cd/rt_clear_price_cap_sced", + "observed_at": "2026-09-06 00:31:37.366909+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "ASType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "cappedMCPCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedMCPCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedMCPCTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "ASType", + "label": "AS Type", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedMCPC", + "label": "Capped MCPC", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedMCPC", + "label": "Uncapped MCPC", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:37.366909+00:00", + "sha256": "2902461ca6ba846272b90ba6f7ce31a3e6ea50330fc8ee9bd9295b6e4e6679dc", + "byte_count": 1272, + "status": 200 + }, + "observed_nullable_fields": [ + "uncappedMCPC" + ], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:37.366909+00:00", + "sha256": "2902461ca6ba846272b90ba6f7ce31a3e6ea50330fc8ee9bd9295b6e4e6679dc", + "byte_count": 1272, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-332-cd/rt_clear_price_cap_sced?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:39.594425+00:00", + "sha256": "189dce808819a0c380ac1e5bf34a66c03e4d079a52aa1158f54bf0a1f17a6140", + "byte_count": 1270, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-332-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 24891, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-346-cd--act_sys_load_by_fzn.json b/tools/inputs/current/np6-346-cd--act_sys_load_by_fzn.json new file mode 100644 index 00000000..81ec3756 --- /dev/null +++ b/tools/inputs/current/np6-346-cd--act_sys_load_by_fzn.json @@ -0,0 +1,263 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-346-cd/act_sys_load_by_fzn", + "observed_at": "2026-09-06 00:29:03.588023+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "operatingDayFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "operatingDayTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-dd" + } + }, + { + "name": "hourEnding", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "northFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "northTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "southTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "westTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "houstonFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "houstonTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "totalTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "DSTFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "operatingDay", + "label": "Operating Day", + "cardinality": 1, + "dataType": "DATE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "hourEnding", + "label": "Hour Ending", + "cardinality": 2, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "north", + "label": "North", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "south", + "label": "South", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "west", + "label": "West", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "houston", + "label": "Houston", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "total", + "label": "Total", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "DSTFlag", + "label": "DST Flag", + "cardinality": 8, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn?size=1&page=1&sort=operatingDay&dir=desc", + "retrieved_at": "2026-09-06 00:29:03.588023+00:00", + "sha256": "dc5832d9a14dc3ebf634cad1fcdcb34d7bcf955a102dd40b910cf7e698b31456", + "byte_count": 1584, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn?size=1&page=1&sort=operatingDay&dir=desc", + "retrieved_at": "2026-09-06 00:29:03.588023+00:00", + "sha256": "dc5832d9a14dc3ebf634cad1fcdcb34d7bcf955a102dd40b910cf7e698b31456", + "byte_count": 1584, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-346-cd/act_sys_load_by_fzn?size=1&page=1&sort=operatingDay&dir=asc", + "retrieved_at": "2026-09-06 00:29:05.706607+00:00", + "sha256": "e174bfdd94814df13b850064adaae472f24e4fec341c438300feeb3d5c76dcfb", + "byte_count": 1582, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-346-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 14836, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-787-cd--lmp_electrical_bus.json b/tools/inputs/current/np6-787-cd--lmp_electrical_bus.json new file mode 100644 index 00000000..fb343994 --- /dev/null +++ b/tools/inputs/current/np6-787-cd--lmp_electrical_bus.json @@ -0,0 +1,188 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-787-cd/lmp_electrical_bus", + "observed_at": "2026-09-06 00:29:17.122838+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "electricalBus", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "cappedLMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "cappedLMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "uncappedLMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "electricalBus", + "label": "Electrical Bus", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "cappedLMP", + "label": "Capped LMP", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "uncappedLMP", + "label": "Uncapped LMP", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:17.122838+00:00", + "sha256": "73f21c51e3e9320e361702cc9943651d9008e736a4601ce5edf4b47506bb4c5d", + "byte_count": 1325, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:17.122838+00:00", + "sha256": "73f21c51e3e9320e361702cc9943651d9008e736a4601ce5edf4b47506bb4c5d", + "byte_count": 1325, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-787-cd/lmp_electrical_bus?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:19.237816+00:00", + "sha256": "555fead5e0a803ab327da690c1069bcc10c42bc8fdd9b4fcd4a0b90ffa530142", + "byte_count": 1328, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-787-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 11485, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-788-cd--lmp_node_zone_hub.json b/tools/inputs/current/np6-788-cd--lmp_node_zone_hub.json new file mode 100644 index 00000000..ae437f3e --- /dev/null +++ b/tools/inputs/current/np6-788-cd--lmp_node_zone_hub.json @@ -0,0 +1,163 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-788-cd/lmp_node_zone_hub", + "observed_at": "2026-09-06 00:29:20.538109+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Time Stamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 3, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMP", + "label": "LMP", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:20.538109+00:00", + "sha256": "d6066c77b929984396406f769ba2f0eee5384c3ac7273a88e257e87e0993da9e", + "byte_count": 1207, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:20.538109+00:00", + "sha256": "d6066c77b929984396406f769ba2f0eee5384c3ac7273a88e257e87e0993da9e", + "byte_count": 1207, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-788-cd/lmp_node_zone_hub?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:22.561581+00:00", + "sha256": "d1ee007e7f784e138684d8afab529cb5b4335531f892cf77e929e88a4629b8c6", + "byte_count": 1206, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-788-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12300, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-86-cd--shdw_prices_bnd_trns_const.json b/tools/inputs/current/np6-86-cd--shdw_prices_bnd_trns_const.json new file mode 100644 index 00000000..9b9f3dfc --- /dev/null +++ b/tools/inputs/current/np6-86-cd--shdw_prices_bnd_trns_const.json @@ -0,0 +1,406 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-86-cd/shdw_prices_bnd_trns_const", + "observed_at": "2026-09-06 00:29:24.737003+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "fromStation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "toStation", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "fromStationkVFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "fromStationkVTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "toStationkVFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "toStationkVTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "CCTStatus", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatedHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "constraintIDFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintIDTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "constraintName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "contingencyName", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "shadowPriceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "shadowPriceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "maxShadowPriceFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "maxShadowPriceTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "limitTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "valueTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "violatedMWFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "violatedMWTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatedHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "constraintID", + "label": "Constraint Id", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "constraintName", + "label": "Constraint Name", + "cardinality": 4, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "contingencyName", + "label": "Contingency Name", + "cardinality": 5, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "shadowPrice", + "label": "Shadow Price", + "cardinality": 6, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "maxShadowPrice", + "label": "Max Shadow Price", + "cardinality": 7, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "limit", + "label": "Limit", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "value", + "label": "Value", + "cardinality": 9, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "violatedMW", + "label": "Violated MW", + "cardinality": 10, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "fromStation", + "label": "From Station", + "cardinality": 11, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "toStation", + "label": "To Station", + "cardinality": 12, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "fromStationkV", + "label": "From Station kV", + "cardinality": 13, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "toStationkV", + "label": "To Station kV", + "cardinality": 14, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "CCTStatus", + "label": "CCT Status", + "cardinality": 15, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:24.737003+00:00", + "sha256": "a56d0f58cc9348f746e2a354af30679aa7ed95259a7a9b91e5bb5aabf8c24f35", + "byte_count": 2699, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:24.737003+00:00", + "sha256": "a56d0f58cc9348f746e2a354af30679aa7ed95259a7a9b91e5bb5aabf8c24f35", + "byte_count": 2699, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-86-cd/shdw_prices_bnd_trns_const?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:26.813785+00:00", + "sha256": "890c8e8a29b30d9f42070f7fc64b510f45ce9fb0f53755c2c6ad030b4356996c", + "byte_count": 2676, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-86-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 12302, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-915-cd--sum_hdl_ldl.json b/tools/inputs/current/np6-915-cd--sum_hdl_ldl.json new file mode 100644 index 00000000..ef0adf3f --- /dev/null +++ b/tools/inputs/current/np6-915-cd--sum_hdl_ldl.json @@ -0,0 +1,196 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-915-cd/sum_hdl_ldl", + "observed_at": "2026-09-06 00:31:41.512422+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "SCEDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "SCEDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "GTBDFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "GTBDTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "sumHDLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "sumHDLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "sumLDLFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "sumLDLTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "SCEDTimestamp", + "label": "SCED Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeated Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "GTBD", + "label": "Generation To Be Dispatched", + "cardinality": 3, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "sumHDL", + "label": "Sum Of High Dispatch Limit", + "cardinality": 4, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "sumLDL", + "label": "Sum Of Low Dispatch Limit", + "cardinality": 5, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:41.512422+00:00", + "sha256": "19ed635229753d9f4b64c2ccfba8adaa692f9fc31b73049f3d7cf5492b4321ff", + "byte_count": 1258, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl?size=1&page=1&sort=SCEDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:31:41.512422+00:00", + "sha256": "19ed635229753d9f4b64c2ccfba8adaa692f9fc31b73049f3d7cf5492b4321ff", + "byte_count": 1258, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-915-cd/sum_hdl_ldl?size=1&page=1&sort=SCEDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:31:43.653354+00:00", + "sha256": "ca557c8e50e5bddc431d8432eacc9bae9c7f17b42988a74ed4b6f54f1ca04ab8", + "byte_count": 1257, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-915-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13081, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/np6-970-cd--rtd_lmp_node_zone_hub.json b/tools/inputs/current/np6-970-cd--rtd_lmp_node_zone_hub.json new file mode 100644 index 00000000..8ab58588 --- /dev/null +++ b/tools/inputs/current/np6-970-cd--rtd_lmp_node_zone_hub.json @@ -0,0 +1,247 @@ +{ + "format_version": 1, + "service": "public-reports", + "path": "/np6-970-cd/rtd_lmp_node_zone_hub", + "observed_at": "2026-09-06 00:29:30.095166+00:00", + "row_schema": "verified_observed", + "query_parameters": [ + { + "name": "RTDTimestampFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "RTDTimestampTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "repeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "intervalIdFrom", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalIdTo", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "intervalEndingFrom", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalEndingTo", + "in": "query", + "schema": { + "type": "string", + "format": "yyyy-MM-ddTH24:mm:ss" + } + }, + { + "name": "intervalRepeatHourFlag", + "in": "query", + "schema": { + "type": "boolean", + "format": "true | false" + } + }, + { + "name": "settlementPoint", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "settlementPointType", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "LMPFrom", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "LMPTo", + "in": "query", + "schema": { + "type": "number", + "format": "####.###" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "size", + "in": "query", + "schema": { + "type": "integer", + "format": "###" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + }, + { + "name": "dir", + "in": "query", + "schema": { + "type": "string", + "format": "abc123" + } + } + ], + "fields": [ + { + "name": "RTDTimestamp", + "label": "RTD Timestamp", + "cardinality": 1, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "repeatHourFlag", + "label": "Repeat Hour Flag", + "cardinality": 2, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "intervalId", + "label": "Interval Id", + "cardinality": 3, + "dataType": "INTEGER", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalEnding", + "label": "Interval Ending", + "cardinality": 4, + "dataType": "DATETIME", + "searchable": true, + "sortable": true, + "hasRange": true + }, + { + "name": "intervalRepeatHourFlag", + "label": "Interval Repeat Hour Flag", + "cardinality": 5, + "dataType": "BOOLEAN", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPoint", + "label": "Settlement Point", + "cardinality": 6, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "settlementPointType", + "label": "Settlement Point Type", + "cardinality": 7, + "dataType": "VARCHAR", + "searchable": true, + "sortable": true, + "hasRange": false + }, + { + "name": "LMP", + "label": "LMP", + "cardinality": 8, + "dataType": "DOUBLE", + "searchable": true, + "sortable": true, + "hasRange": true + } + ], + "nullability_policy": "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown.", + "source_url": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api?export=true&api-version=2022-04-01-preview", + "query_source_sha256": "b978bf35fbf9dcb8edca14025d4b5d3108582885a6c1b92a9bf445e69b08a7f8", + "response_source": { + "source_url": "https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:30.095166+00:00", + "sha256": "349ef965fb4e01e6b92959b1bc4a61de24fbcb10f067514efdb90d7a063d6948", + "byte_count": 1836, + "status": 200 + }, + "observed_nullable_fields": [], + "observations": [ + { + "source_url": "https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub?size=1&page=1&sort=RTDTimestamp&dir=desc", + "retrieved_at": "2026-09-06 00:29:30.095166+00:00", + "sha256": "349ef965fb4e01e6b92959b1bc4a61de24fbcb10f067514efdb90d7a063d6948", + "byte_count": 1836, + "status": 200 + }, + { + "source_url": "https://api.ercot.com/api/public-reports/np6-970-cd/rtd_lmp_node_zone_hub?size=1&page=1&sort=RTDTimestamp&dir=asc", + "retrieved_at": "2026-09-06 00:29:31.940579+00:00", + "sha256": "e0085a828a39ea732024407ca067d781af2c2ea2e4202c033ccd57486a6da735", + "byte_count": 1832, + "status": 200 + } + ], + "product_evidence": { + "emilId": "NP6-970-CD", + "status": "Active", + "audience": "Public", + "securityClassification": "Public", + "contentType": "DATA", + "artifactReportTypeId": 13073, + "root_sha256": "b54049717512596a8b0b4f8f35c30dccb4c6273358fe2d25e06fb6f387871a38" + } +} diff --git a/tools/inputs/current/provenance.json b/tools/inputs/current/provenance.json index 9f4f0703..6f22cb4c 100644 --- a/tools/inputs/current/provenance.json +++ b/tools/inputs/current/provenance.json @@ -4,7 +4,59 @@ "dam-prices.json": "ba4ecaa6b1721e233b310e3c76fa5f3cd5ab1aed0057b8a2480f36b2f08df4e8", "dam-capacity.json": "73a04f0a1fd40e2edaaa47d048fd97de999dbbf9a6fedffcf9a49422eddfb1f8", "rt-prices.json": "d4335f720e452150429066e1d3308b2e2ff2762a0fed73580130ea7b07c11de4", - "system-load.json": "11249700b9bbcd6a2741cb657b99b1d5afc147476b86466459fc3b72aed4f020" + "system-load.json": "11249700b9bbcd6a2741cb657b99b1d5afc147476b86466459fc3b72aed4f020", + "gen-55-cd--hrly_rt_load_fcast_actual.json": "a36493a08fa9f97f3fb69e141eeddf15a891ec81a08db3e679c38dd2369bffd7", + "np1-302--as_obligation.json": "cf8fc01214ed47f5a1282fb16cc41bda12d07190853e8bacc16ddd92568f2450", + "np3-161-cd--7d_plus_avail_res_poc_margin.json": "d95a76c3bd71e128639ee6540e7a350078923b7d75c7a4f99d2fa0014122387b", + "np3-162-cd--7d_avail_res_poc_margin.json": "4b8b9de7da4238a2cbdeeecf5c05fa3c5b10e02d740534480bc34721e5aebced", + "np3-233-cd--hourly_res_outage_cap.json": "cb751f5a25c521a657c4fb18c6d99e6e18aeeecdd0c34790d665eec57c620b0c", + "np3-560-cd--7d_load_fcast_by_fzn.json": "7fae167a5c767ce67b7beb28e2e8c9faaa7e393cf1f6b25b604e28d8ab67a8fc", + "np3-561-cd--7d_load_fcast_by_wzn.json": "6c5b4c59810613ee645293a9df95ba81c4eeae38b6a0f53c6963890fb372474a", + "np3-562-cd--ih_load_fcast_by_wzn.json": "1549f5fb9e075c7e35bc9af3856416299cc118025129d8e22282f82414c6840d", + "np3-565-cd--lf_by_model_weather_zone.json": "e59d2f9393b4e7bf42dc2d00c09df1de8e28003135f6f87c7509ab16b8cb1ec7", + "np4-158-sg--dam_essps.json": "320a3a3eb4f0e6372c921ab9b16429a04ed257ec282ba59d1b141ecaa0eb5dc0", + "np4-159-cd--load_distribution_factors.json": "e0d4e263328cb1fb4a4594c0d3657cd5bdcfdaf506ed8552adc05c0df4e30177", + "np4-183-cd--dam_hourly_lmp.json": "455beb1aebaa3ba7c7cd3a95b1795015b0f92b04e8b423a75d2e4c5663dee1a5", + "np4-19-cd--dam_agg_as_offer_curve.json": "27b7194f293c2c79ac05fd988ab883b512fccf913da1cef0d1df78ff4946e97d", + "np4-191-cd--dam_shadow_prices.json": "35ff5eebd8df5aa096709ec33c33a62cc4318f427736cc5fde292671952d93a7", + "np4-192-cd--dam_total_energy_purchased.json": "5c5b93c2fbf9fe0919850a50006133c714a828ad33bd5c8c4ace46a8df0b5e89", + "np4-193-cd--total_dam_energy_sold.json": "597140ca73e2071e410c5ccede106210c2c54e067a8f51cb88911fc6f5f76ad1", + "np4-194-cd--dam_ptp_obligation_sp_results.json": "d7bab3ebf1407053f49e07cc6a49f4d536d969452c5d372374d5ed2ddfa34355", + "np4-196-m--dam_price_corrections_eblmp.json": "bea6b983601129e9e1baad0d76d417fdfce4f62c6fcc28390d79484353fbf6ab", + "np4-196-m--dam_price_corrections_mcpc.json": "c24c2bedc45411016991d3e36f9cfb38da7d492c8ef13230f4a03d80ab966ea7", + "np4-196-m--dam_price_corrections_spp.json": "1b141a2b487105d2bcc21a0dad6a9e440d8ae7ffbafd096a725635820707e336", + "np4-197-m--rtm_price_corrections_eblmp.json": "5797468075ffbefa05127fbffda98e19076fb96926b19404acecf90047e11211", + "np4-197-m--rtm_price_corrections_mcpc_sced.json": "d3b761d06213c23317c8a51fabccdb383274bd2ca8b67ff1ece7f9524ddaf7cc", + "np4-197-m--rtm_price_corrections_mcpc_spp.json": "f8f12c688eef89254d425cafc4452c7022b491487854660f9dd07a55ed60d300", + "np4-197-m--rtm_price_corrections_shadow.json": "1dcfd1fe24b5b2a75a886cbf5eb75ee3c4e9d82fae303a3444dd6e39d5709f9c", + "np4-197-m--rtm_price_corrections_soglmp.json": "dae8743ede862e217766422cdb4019cddd26e18e7b85cc896a39d07ce2347f17", + "np4-197-m--rtm_price_corrections_sogprice.json": "24ce3c3d601244129249079676e5f07b78dcdc3191b0778b0d8803a06bed713e", + "np4-197-m--rtm_price_corrections_splmp.json": "d574e0fcdc686f510e35521b19ceaf5ac6f00a89b2dc7f9664a2aedcf6191e4a", + "np4-197-m--rtm_price_corrections_spp.json": "6649ff7b3485de3d096f112a8df6dda40e79addd7714540869475e2ba4dbd1ef", + "np4-200-cd--dam_de_energized_spbc.json": "e92f6446b5527afba66040556d8f41b058a03a68377722e706d724f1e9b965b1", + "np4-212-cd--dam_sced_as_demand_curves.json": "6f5ebdb62705a93461f133909519114342eb69bae653d83c1aa7114b1417a3fa", + "np4-213-cd--hruc_as_demand_curves.json": "02528af34e818eb083f8653224d0ab4f99e42069b9f385bfb301ddb9b45eeaa7", + "np4-214-cd--druc_as_demand_curves.json": "f7873c89e11e4f481d308cd92011686f1b6bcd996e87693eea64240c34e0d093", + "np4-215-cd--wruc_as_demand_curves.json": "822de35e3b091fadcf32f7740ca567afa13a627fad0334e49b2473974baf3869", + "np4-231-cd--electrical_bus_map_heur_price.json": "6f82d762d7deeda219d6f6ab298ca8804a2ab9e7d51cd05b00c8c7faf8d86795", + "np4-33-cd--dam_as_plan.json": "0ba3796fc54f65e7b73a26061d932803a50873e43751b2f4f8e713f8af682396", + "np4-523-cd--dam_system_lambda.json": "166d8a394320dd4d1c9494bd39209a0816e8abde8c755bacdd351f1984698563", + "np6-322-cd--sced_system_lambda.json": "4268b44221876bedfacab848e76e2c6ed99cdc3efbf3758267f6d9a5c307aceb", + "np6-323-cd--rt_price_adder_sced.json": "2fa3c52a24d6fb117467e8fbea12ecc2007f72f0b8a474e795c8073dce4923e3", + "np6-324-cd--rt_15min_price_adders.json": "4e4b5c3504cdfefebc8abab1fadaf287d9b334dba719c2519d680be699485619", + "np6-325-cd--rtd_price_adders.json": "0faecf0b030a8daa02a946957aaca0b829925d3a154ed97e27c65583b9be72df", + "np6-326-cd--rt_price_sog.json": "267976c75ebe3e159a4c65a855855a6b8f430f0265bffddc35ff6cfc02c075b4", + "np6-327-cd--lmp_sog_price_adders.json": "94393d16e37b292dc50811d7f4088b6a2cccc489c4be69f7d28bc1665dcc084e", + "np6-328-cd--tot_as_res_cap.json": "fe9f9b4c85d4fc127a1ac529b859a5ef12e7145d4230a03dc774800253c7cf29", + "np6-329-cd--rtd_ind_mcpc.json": "b36390a8d299075cb8f2dfe78f02cb5335b25c14182731aa188270d14b5d4905", + "np6-331-cd--rt_clear_price_cap.json": "74fb2ec2922035b0ee9f127d5e7d1eaba5238ba294b07182909e6d4f89673925", + "np6-332-cd--rt_clear_price_cap_sced.json": "6c15910aac0e5e88e5b47b53aff10fe6397da246a3ff379b1728521bade4645e", + "np6-346-cd--act_sys_load_by_fzn.json": "dbd5c25d668e8bf6be801e0db848b9fe16a3ecd96131d3287170eea21e12ae04", + "np6-787-cd--lmp_electrical_bus.json": "dcb413c449852dc89bc8bd2fa93ae8ebd84334bb6d23d6dca0e189760d98ac11", + "np6-788-cd--lmp_node_zone_hub.json": "a4a2120d5e120699748a1495e5317bc6526984bf3a54e85278c7fa08e22eb721", + "np6-86-cd--shdw_prices_bnd_trns_const.json": "430c50cbfd1118dbe14f6bc0e866e8c3df76a6f2d18d3364d261046fba66ec7a", + "np6-915-cd--sum_hdl_ldl.json": "3ed5834e4726fbe632ae40415064ad6b58258081ce534a02618c8e25fd916a95", + "np6-970-cd--rtd_lmp_node_zone_hub.json": "6da39cca8da19f66c95e716708b191d595cbd2449d38d09866113fa0b365f365" }, "contracts": [ { @@ -30,6 +82,318 @@ "model": "SystemLoad", "constant": "SYSTEM_LOAD", "fields_constant": "LOAD_FIELDS" + }, + { + "input": "gen-55-cd--hrly_rt_load_fcast_actual.json", + "model": "Gen55CdHrlyRtLoadFcastActual", + "constant": "GEN_55_CD_HRLY_RT_LOAD_FCAST_ACTUAL", + "fields_constant": "GEN_55_CD_HRLY_RT_LOAD_FCAST_ACTUAL_FIELDS" + }, + { + "input": "np1-302--as_obligation.json", + "model": "Np1302AsObligation", + "constant": "NP1_302_AS_OBLIGATION", + "fields_constant": "NP1_302_AS_OBLIGATION_FIELDS" + }, + { + "input": "np3-161-cd--7d_plus_avail_res_poc_margin.json", + "model": "Np3161Cd7dPlusAvailResPocMargin", + "constant": "NP3_161_CD_7D_PLUS_AVAIL_RES_POC_MARGIN", + "fields_constant": "NP3_161_CD_7D_PLUS_AVAIL_RES_POC_MARGIN_FIELDS" + }, + { + "input": "np3-162-cd--7d_avail_res_poc_margin.json", + "model": "Np3162Cd7dAvailResPocMargin", + "constant": "NP3_162_CD_7D_AVAIL_RES_POC_MARGIN", + "fields_constant": "NP3_162_CD_7D_AVAIL_RES_POC_MARGIN_FIELDS" + }, + { + "input": "np3-233-cd--hourly_res_outage_cap.json", + "model": "Np3233CdHourlyResOutageCap", + "constant": "NP3_233_CD_HOURLY_RES_OUTAGE_CAP", + "fields_constant": "NP3_233_CD_HOURLY_RES_OUTAGE_CAP_FIELDS" + }, + { + "input": "np3-560-cd--7d_load_fcast_by_fzn.json", + "model": "Np3560Cd7dLoadFcastByFzn", + "constant": "NP3_560_CD_7D_LOAD_FCAST_BY_FZN", + "fields_constant": "NP3_560_CD_7D_LOAD_FCAST_BY_FZN_FIELDS" + }, + { + "input": "np3-561-cd--7d_load_fcast_by_wzn.json", + "model": "Np3561Cd7dLoadFcastByWzn", + "constant": "NP3_561_CD_7D_LOAD_FCAST_BY_WZN", + "fields_constant": "NP3_561_CD_7D_LOAD_FCAST_BY_WZN_FIELDS" + }, + { + "input": "np3-562-cd--ih_load_fcast_by_wzn.json", + "model": "Np3562CdIhLoadFcastByWzn", + "constant": "NP3_562_CD_IH_LOAD_FCAST_BY_WZN", + "fields_constant": "NP3_562_CD_IH_LOAD_FCAST_BY_WZN_FIELDS" + }, + { + "input": "np3-565-cd--lf_by_model_weather_zone.json", + "model": "Np3565CdLfByModelWeatherZone", + "constant": "NP3_565_CD_LF_BY_MODEL_WEATHER_ZONE", + "fields_constant": "NP3_565_CD_LF_BY_MODEL_WEATHER_ZONE_FIELDS" + }, + { + "input": "np4-158-sg--dam_essps.json", + "model": "Np4158SgDamEssps", + "constant": "NP4_158_SG_DAM_ESSPS", + "fields_constant": "NP4_158_SG_DAM_ESSPS_FIELDS" + }, + { + "input": "np4-159-cd--load_distribution_factors.json", + "model": "Np4159CdLoadDistributionFactors", + "constant": "NP4_159_CD_LOAD_DISTRIBUTION_FACTORS", + "fields_constant": "NP4_159_CD_LOAD_DISTRIBUTION_FACTORS_FIELDS" + }, + { + "input": "np4-183-cd--dam_hourly_lmp.json", + "model": "Np4183CdDamHourlyLmp", + "constant": "NP4_183_CD_DAM_HOURLY_LMP", + "fields_constant": "NP4_183_CD_DAM_HOURLY_LMP_FIELDS" + }, + { + "input": "np4-19-cd--dam_agg_as_offer_curve.json", + "model": "Np419CdDamAggAsOfferCurve", + "constant": "NP4_19_CD_DAM_AGG_AS_OFFER_CURVE", + "fields_constant": "NP4_19_CD_DAM_AGG_AS_OFFER_CURVE_FIELDS" + }, + { + "input": "np4-191-cd--dam_shadow_prices.json", + "model": "Np4191CdDamShadowPrices", + "constant": "NP4_191_CD_DAM_SHADOW_PRICES", + "fields_constant": "NP4_191_CD_DAM_SHADOW_PRICES_FIELDS" + }, + { + "input": "np4-192-cd--dam_total_energy_purchased.json", + "model": "Np4192CdDamTotalEnergyPurchased", + "constant": "NP4_192_CD_DAM_TOTAL_ENERGY_PURCHASED", + "fields_constant": "NP4_192_CD_DAM_TOTAL_ENERGY_PURCHASED_FIELDS" + }, + { + "input": "np4-193-cd--total_dam_energy_sold.json", + "model": "Np4193CdTotalDamEnergySold", + "constant": "NP4_193_CD_TOTAL_DAM_ENERGY_SOLD", + "fields_constant": "NP4_193_CD_TOTAL_DAM_ENERGY_SOLD_FIELDS" + }, + { + "input": "np4-194-cd--dam_ptp_obligation_sp_results.json", + "model": "Np4194CdDamPtpObligationSpResults", + "constant": "NP4_194_CD_DAM_PTP_OBLIGATION_SP_RESULTS", + "fields_constant": "NP4_194_CD_DAM_PTP_OBLIGATION_SP_RESULTS_FIELDS" + }, + { + "input": "np4-196-m--dam_price_corrections_eblmp.json", + "model": "Np4196MDamPriceCorrectionsEblmp", + "constant": "NP4_196_M_DAM_PRICE_CORRECTIONS_EBLMP", + "fields_constant": "NP4_196_M_DAM_PRICE_CORRECTIONS_EBLMP_FIELDS" + }, + { + "input": "np4-196-m--dam_price_corrections_mcpc.json", + "model": "Np4196MDamPriceCorrectionsMcpc", + "constant": "NP4_196_M_DAM_PRICE_CORRECTIONS_MCPC", + "fields_constant": "NP4_196_M_DAM_PRICE_CORRECTIONS_MCPC_FIELDS" + }, + { + "input": "np4-196-m--dam_price_corrections_spp.json", + "model": "Np4196MDamPriceCorrectionsSpp", + "constant": "NP4_196_M_DAM_PRICE_CORRECTIONS_SPP", + "fields_constant": "NP4_196_M_DAM_PRICE_CORRECTIONS_SPP_FIELDS" + }, + { + "input": "np4-197-m--rtm_price_corrections_eblmp.json", + "model": "Np4197MRtmPriceCorrectionsEblmp", + "constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_EBLMP", + "fields_constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_EBLMP_FIELDS" + }, + { + "input": "np4-197-m--rtm_price_corrections_mcpc_sced.json", + "model": "Np4197MRtmPriceCorrectionsMcpcSced", + "constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SCED", + "fields_constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SCED_FIELDS" + }, + { + "input": "np4-197-m--rtm_price_corrections_mcpc_spp.json", + "model": "Np4197MRtmPriceCorrectionsMcpcSpp", + "constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SPP", + "fields_constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_MCPC_SPP_FIELDS" + }, + { + "input": "np4-197-m--rtm_price_corrections_shadow.json", + "model": "Np4197MRtmPriceCorrectionsShadow", + "constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SHADOW", + "fields_constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SHADOW_FIELDS" + }, + { + "input": "np4-197-m--rtm_price_corrections_soglmp.json", + "model": "Np4197MRtmPriceCorrectionsSoglmp", + "constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SOGLMP", + "fields_constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SOGLMP_FIELDS" + }, + { + "input": "np4-197-m--rtm_price_corrections_sogprice.json", + "model": "Np4197MRtmPriceCorrectionsSogprice", + "constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SOGPRICE", + "fields_constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SOGPRICE_FIELDS" + }, + { + "input": "np4-197-m--rtm_price_corrections_splmp.json", + "model": "Np4197MRtmPriceCorrectionsSplmp", + "constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SPLMP", + "fields_constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SPLMP_FIELDS" + }, + { + "input": "np4-197-m--rtm_price_corrections_spp.json", + "model": "Np4197MRtmPriceCorrectionsSpp", + "constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SPP", + "fields_constant": "NP4_197_M_RTM_PRICE_CORRECTIONS_SPP_FIELDS" + }, + { + "input": "np4-200-cd--dam_de_energized_spbc.json", + "model": "Np4200CdDamDeEnergizedSpbc", + "constant": "NP4_200_CD_DAM_DE_ENERGIZED_SPBC", + "fields_constant": "NP4_200_CD_DAM_DE_ENERGIZED_SPBC_FIELDS" + }, + { + "input": "np4-212-cd--dam_sced_as_demand_curves.json", + "model": "Np4212CdDamScedAsDemandCurves", + "constant": "NP4_212_CD_DAM_SCED_AS_DEMAND_CURVES", + "fields_constant": "NP4_212_CD_DAM_SCED_AS_DEMAND_CURVES_FIELDS" + }, + { + "input": "np4-213-cd--hruc_as_demand_curves.json", + "model": "Np4213CdHrucAsDemandCurves", + "constant": "NP4_213_CD_HRUC_AS_DEMAND_CURVES", + "fields_constant": "NP4_213_CD_HRUC_AS_DEMAND_CURVES_FIELDS" + }, + { + "input": "np4-214-cd--druc_as_demand_curves.json", + "model": "Np4214CdDrucAsDemandCurves", + "constant": "NP4_214_CD_DRUC_AS_DEMAND_CURVES", + "fields_constant": "NP4_214_CD_DRUC_AS_DEMAND_CURVES_FIELDS" + }, + { + "input": "np4-215-cd--wruc_as_demand_curves.json", + "model": "Np4215CdWrucAsDemandCurves", + "constant": "NP4_215_CD_WRUC_AS_DEMAND_CURVES", + "fields_constant": "NP4_215_CD_WRUC_AS_DEMAND_CURVES_FIELDS" + }, + { + "input": "np4-231-cd--electrical_bus_map_heur_price.json", + "model": "Np4231CdElectricalBusMapHeurPrice", + "constant": "NP4_231_CD_ELECTRICAL_BUS_MAP_HEUR_PRICE", + "fields_constant": "NP4_231_CD_ELECTRICAL_BUS_MAP_HEUR_PRICE_FIELDS" + }, + { + "input": "np4-33-cd--dam_as_plan.json", + "model": "Np433CdDamAsPlan", + "constant": "NP4_33_CD_DAM_AS_PLAN", + "fields_constant": "NP4_33_CD_DAM_AS_PLAN_FIELDS" + }, + { + "input": "np4-523-cd--dam_system_lambda.json", + "model": "Np4523CdDamSystemLambda", + "constant": "NP4_523_CD_DAM_SYSTEM_LAMBDA", + "fields_constant": "NP4_523_CD_DAM_SYSTEM_LAMBDA_FIELDS" + }, + { + "input": "np6-322-cd--sced_system_lambda.json", + "model": "Np6322CdScedSystemLambda", + "constant": "NP6_322_CD_SCED_SYSTEM_LAMBDA", + "fields_constant": "NP6_322_CD_SCED_SYSTEM_LAMBDA_FIELDS" + }, + { + "input": "np6-323-cd--rt_price_adder_sced.json", + "model": "Np6323CdRtPriceAdderSced", + "constant": "NP6_323_CD_RT_PRICE_ADDER_SCED", + "fields_constant": "NP6_323_CD_RT_PRICE_ADDER_SCED_FIELDS" + }, + { + "input": "np6-324-cd--rt_15min_price_adders.json", + "model": "Np6324CdRt15minPriceAdders", + "constant": "NP6_324_CD_RT_15MIN_PRICE_ADDERS", + "fields_constant": "NP6_324_CD_RT_15MIN_PRICE_ADDERS_FIELDS" + }, + { + "input": "np6-325-cd--rtd_price_adders.json", + "model": "Np6325CdRtdPriceAdders", + "constant": "NP6_325_CD_RTD_PRICE_ADDERS", + "fields_constant": "NP6_325_CD_RTD_PRICE_ADDERS_FIELDS" + }, + { + "input": "np6-326-cd--rt_price_sog.json", + "model": "Np6326CdRtPriceSog", + "constant": "NP6_326_CD_RT_PRICE_SOG", + "fields_constant": "NP6_326_CD_RT_PRICE_SOG_FIELDS" + }, + { + "input": "np6-327-cd--lmp_sog_price_adders.json", + "model": "Np6327CdLmpSogPriceAdders", + "constant": "NP6_327_CD_LMP_SOG_PRICE_ADDERS", + "fields_constant": "NP6_327_CD_LMP_SOG_PRICE_ADDERS_FIELDS" + }, + { + "input": "np6-328-cd--tot_as_res_cap.json", + "model": "Np6328CdTotAsResCap", + "constant": "NP6_328_CD_TOT_AS_RES_CAP", + "fields_constant": "NP6_328_CD_TOT_AS_RES_CAP_FIELDS" + }, + { + "input": "np6-329-cd--rtd_ind_mcpc.json", + "model": "Np6329CdRtdIndMcpc", + "constant": "NP6_329_CD_RTD_IND_MCPC", + "fields_constant": "NP6_329_CD_RTD_IND_MCPC_FIELDS" + }, + { + "input": "np6-331-cd--rt_clear_price_cap.json", + "model": "Np6331CdRtClearPriceCap", + "constant": "NP6_331_CD_RT_CLEAR_PRICE_CAP", + "fields_constant": "NP6_331_CD_RT_CLEAR_PRICE_CAP_FIELDS" + }, + { + "input": "np6-332-cd--rt_clear_price_cap_sced.json", + "model": "Np6332CdRtClearPriceCapSced", + "constant": "NP6_332_CD_RT_CLEAR_PRICE_CAP_SCED", + "fields_constant": "NP6_332_CD_RT_CLEAR_PRICE_CAP_SCED_FIELDS" + }, + { + "input": "np6-346-cd--act_sys_load_by_fzn.json", + "model": "Np6346CdActSysLoadByFzn", + "constant": "NP6_346_CD_ACT_SYS_LOAD_BY_FZN", + "fields_constant": "NP6_346_CD_ACT_SYS_LOAD_BY_FZN_FIELDS" + }, + { + "input": "np6-787-cd--lmp_electrical_bus.json", + "model": "Np6787CdLmpElectricalBus", + "constant": "NP6_787_CD_LMP_ELECTRICAL_BUS", + "fields_constant": "NP6_787_CD_LMP_ELECTRICAL_BUS_FIELDS" + }, + { + "input": "np6-788-cd--lmp_node_zone_hub.json", + "model": "Np6788CdLmpNodeZoneHub", + "constant": "NP6_788_CD_LMP_NODE_ZONE_HUB", + "fields_constant": "NP6_788_CD_LMP_NODE_ZONE_HUB_FIELDS" + }, + { + "input": "np6-86-cd--shdw_prices_bnd_trns_const.json", + "model": "Np686CdShdwPricesBndTrnsConst", + "constant": "NP6_86_CD_SHDW_PRICES_BND_TRNS_CONST", + "fields_constant": "NP6_86_CD_SHDW_PRICES_BND_TRNS_CONST_FIELDS" + }, + { + "input": "np6-915-cd--sum_hdl_ldl.json", + "model": "Np6915CdSumHdlLdl", + "constant": "NP6_915_CD_SUM_HDL_LDL", + "fields_constant": "NP6_915_CD_SUM_HDL_LDL_FIELDS" + }, + { + "input": "np6-970-cd--rtd_lmp_node_zone_hub.json", + "model": "Np6970CdRtdLmpNodeZoneHub", + "constant": "NP6_970_CD_RTD_LMP_NODE_ZONE_HUB", + "fields_constant": "NP6_970_CD_RTD_LMP_NODE_ZONE_HUB_FIELDS" } ] } diff --git a/tools/observe_catalog.py b/tools/observe_catalog.py new file mode 100644 index 00000000..d5b6e95f --- /dev/null +++ b/tools/observe_catalog.py @@ -0,0 +1,321 @@ +"""Collect bounded public metadata and one-row observations with explicit consent. + +This developer command never generates models. Exact public bytes and receipts +are saved for offline review; credentials and auth payloads are never retained. +""" + +import argparse +import datetime +import hashlib +import json +import logging +import stat +from dataclasses import asdict +from pathlib import Path + +from tinyercot.catalog import operations +from tinyercot.public import Credentials, PublicClient, StreamingLimits +from tinyercot.public.metadata import RETIRED_PRODUCTS + + +def verified_capture(path: Path, receipt_path: Path, expected_url: str) -> dict: + """Read exact public metadata only after checking its source receipt. + + Args: + path: Captured public JSON payload. + receipt_path: Corresponding public-only receipt. + expected_url: Exact adapter-selected source URL. + + Returns: + Parsed metadata whose URL, status, byte count and hash agree. + + Raises: + ValueError: The receipt is unverified or contains unexpected metadata. + """ + raw = path.read_bytes() + receipt = json.loads(receipt_path.read_text()) + if ( + set(receipt) - {"source_url", "retrieved_at", "sha256", "byte_count", "status"} + or receipt["source_url"] != expected_url + or receipt["status"] != 200 + or receipt["byte_count"] != len(raw) + or receipt["sha256"] != hashlib.sha256(raw).hexdigest() + ): + raise ValueError("Cached metadata lacks matching public provenance") + return json.loads(raw) + + +def main() -> None: + """Collect a selected public metadata batch without expanding its scope. + + Raises: + SystemExit: Consent, credentials, source identity, or request checks fail. + """ + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--live", action="store_true") + parser.add_argument("--credentials-file", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--root", action="store_true") + parser.add_argument("--products", nargs="*", default=[]) + parser.add_argument("--metadata-paths", nargs="*", default=[]) + parser.add_argument("--download", nargs=2, metavar=("PRODUCT", "DOC_ID")) + parser.add_argument("--spec", type=Path) + parser.add_argument("--samples", action="store_true") + parser.add_argument("--max-requests", type=int, default=60) + args = parser.parse_args() + if args.samples: + catalog = json.loads( + ( + Path(__file__).resolve().parents[1] / "tinyercot/_catalog.json" + ).read_text() + ) + if ( + args.spec is None + or hashlib.sha256(args.spec.read_bytes()).hexdigest() + != catalog["sources"]["public-reports"]["sha256"] + ): + raise SystemExit("Sampling requires the pinned current OpenAPI export") + if not args.live or not 1 <= args.max_requests <= 100: + raise SystemExit("Explicit --live and a 1–100 request budget are required") + known = { + op.path for op in operations(service="public-reports") if op.kind == "data" + } + products = {path.split("/")[1] for path in known} + if len(args.products) > 20 or set(args.products) - products: + raise SystemExit("Select at most 20 observed public products") + credential_file = args.credentials_file + if ( + credential_file.is_symlink() + or not credential_file.is_file() + or stat.S_IMODE(credential_file.stat().st_mode) != 0o600 + ): + raise SystemExit("Credentials require a regular mode-0600 file") + logging.disable(logging.CRITICAL) + args.output.mkdir(parents=True, exist_ok=True) + root_path = args.output / "root.json" + cached_root = ( + verified_capture( + root_path, + args.output / "root-receipt.json", + "https://api.ercot.com/api/public-reports/", + ) + if root_path.exists() + else None + ) + try: + values = { + key: json.loads(value) + for line in credential_file.read_text().splitlines() + for key, value in [line.split("=", 1)] + } + credentials = Credentials( + *( + values[name] + for name in ( + "ERCOT_USERNAME", + "ERCOT_PASSWORD", + "ERCOT_SUBSCRIPTION_KEY", + ) + ) + ) + del values + with PublicClient( + credentials, limits=StreamingLimits(max_requests=args.max_requests) + ) as client: + if args.root: + payload = client._authenticated_payload("/", {}) + (args.output / "root.json").write_bytes(payload.body) + (args.output / "root-receipt.json").write_text( + json.dumps(asdict(payload.receipt), indent=2, default=str) + "\n" + ) + print( + "Root public metadata saved", len(payload.body), "bytes", flush=True + ) + if args.metadata_paths or args.download: + root = verified_capture( + root_path, + args.output / "root-receipt.json", + "https://api.ercot.com/api/public-reports/", + ) + public = { + p["emilId"].lower() + for p in root["_embedded"]["products"] + if p["securityClassification"] == p["audience"] == "Public" + } + for path in args.metadata_paths: + if path not in { + f"/{kind}/{product}" + for product in public + for kind in ("archive", "bundle") + }: + raise ValueError("Unsupported metadata path") + payload = client._authenticated_payload(path, {}) + target = args.output / ( + path.strip("/").replace("/", "--") + ".json" + ) + target.write_bytes(payload.body) + target.with_name(target.stem + "-receipt.json").write_text( + json.dumps(asdict(payload.receipt), indent=2, default=str) + + "\n" + ) + print(path, "metadata bytes", len(payload.body), flush=True) + if args.download: + product, document = args.download + listing = verified_capture( + args.output / ("archive--" + product + ".json"), + args.output / ("archive--" + product + "-receipt.json"), + "https://api.ercot.com/api/public-reports/archive/" + product, + ) + if ( + product not in public + or not document.isdigit() + or int(document) + not in {row["docId"] for row in listing["archives"]} + or listing["product"]["emilId"].lower() != product + ): + raise ValueError("Download lacks public listing evidence") + payload = client._authenticated_payload( + "/archive/" + product + "/download", + {}, + method="POST", + json_body={"docIds": [int(document)]}, + ) + target = args.output / ( + "download--" + product + "--" + document + ".zip" + ) + target.write_bytes(payload.body) + target.with_suffix(".receipt.json").write_text( + json.dumps(asdict(payload.receipt), indent=2, default=str) + + "\n" + ) + print( + "Selected public download", + len(payload.body), + "bytes", + flush=True, + ) + for product in args.products: + file = args.output / (product + ".json") + if file.exists(): + body = verified_capture( + file, + file.with_name(product + "-receipt.json"), + "https://api.ercot.com/api/public-reports/" + product, + ) + elif (args.output / "root.json").exists(): + root = cached_root or verified_capture( + root_path, + args.output / "root-receipt.json", + "https://api.ercot.com/api/public-reports/", + ) + matches = [ + item + for item in root["_embedded"]["products"] + if item["emilId"].lower() == product + ] + if len(matches) != 1: + print(product, "missing-or-ambiguous-product", flush=True) + continue + body = matches[0] + else: + payload = client._authenticated_payload("/" + product, {}) + body = payload.json() + file.write_bytes(payload.body) + file.with_name(product + "-receipt.json").write_text( + json.dumps(asdict(payload.receipt), indent=2, default=str) + + "\n" + ) + public = ( + body.get("securityClassification") + == body.get("audience") + == "Public" + ) + print( + product, + "metadata", + body.get("status"), + "public" if public else "restricted-or-unknown", + flush=True, + ) + if ( + not args.samples + or not public + or body.get("status") != "Active" + or body.get("emilId", "").upper() in RETIRED_PRODUCTS + or body.get("contentType") != "DATA" + ): + continue + spec = json.loads(args.spec.read_bytes()) + for artifact in body.get("artifacts", []): + url = artifact.get("_links", {}).get("endpoint", {}).get("href", "") + prefix = "https://api.ercot.com/api/public-reports" + path = url.removeprefix(prefix) + if ( + not url.startswith(prefix) + or path not in known + or path.split("/")[1] != product + ): + print(product, "artifact-unavailable-or-unknown", flush=True) + continue + parameters = spec["paths"][path]["get"].get("parameters", []) + dates = [ + p["name"][:-4] + for p in parameters + if p["name"].endswith("From") + and p.get("schema", {}).get("format") + in {"yyyy-MM-dd", "yyyy-MM-ddTH24:mm:ss"} + ] + sort = dates[0] if dates else None + for period, direction in ( + ("current", "desc"), + ("historical", "asc"), + ): + target = args.output / ( + path.strip("/").replace("/", "--") + "--" + period + ".json" + ) + if target.exists(): + continue + query = {"size": 1, "page": 1} + if sort: + query.update(sort=sort, dir=direction) + try: + payload = client._authenticated_payload(path, query) + target.write_bytes(payload.body) + target.with_name(target.stem + "-receipt.json").write_text( + json.dumps( + asdict(payload.receipt), indent=2, default=str + ) + + "\n" + ) + response = payload.json() + print( + path, + period, + "rows", + len(response.get("data", [])), + "fields", + len(response.get("fields", [])), + flush=True, + ) + except Exception as error: # noqa: BLE001 - Never expose retained auth/request objects. + target.with_name(target.stem + "-failure.json").write_text( + json.dumps( + { + "path": path, + "period": period, + "error_type": type(error).__name__, + "observed_at": str( + datetime.datetime.now(datetime.UTC) + ), + }, + indent=2, + ) + + "\n" + ) + print(path, period, type(error).__name__, flush=True) + except Exception as error: # noqa: BLE001 - Sanitize all credential-consumer failures. + raise SystemExit(f"Public observation failed: {type(error).__name__}") from None + + +if __name__ == "__main__": + main() diff --git a/tools/probe_aggregate_dashboards.py b/tools/probe_aggregate_dashboards.py new file mode 100644 index 00000000..8f24335d --- /dev/null +++ b/tools/probe_aggregate_dashboards.py @@ -0,0 +1,81 @@ +"""Capture each anonymous dashboard once through an isolated installed wheel. + +Run /absolute/venv/bin/python -I tools/probe_aggregate_dashboards.py --live --output PATH. +The explicit live flag is required. Output contains receipts and row counts, +never headers, credentials, raw response bodies, or continuous polling. +""" + +import argparse +import datetime +import importlib.metadata +import json +import sys +from dataclasses import asdict +from pathlib import Path + + +def main() -> None: + """Run exactly two bounded anonymous captures with installed-code checks. + + Raises: + RuntimeError: The interpreter is not isolated or imports outside its venv. + PublicDataError: A bounded capture or typed source decoding fails. + OSError: The receipt output cannot be written. + """ + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--live", action="store_true") + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + if not args.live: + parser.error("--live is required for two anonymous ERCOT requests") + if not sys.flags.isolated or sys.prefix == sys.base_prefix: + raise RuntimeError("Use an isolated virtualenv interpreter with -I") + + from tinyercot.public import Limits, aggregate_dashboards + + module_path = Path(aggregate_dashboards.__file__).resolve() + if Path(sys.prefix).resolve() not in module_path.parents: + raise RuntimeError("Dashboard module was not imported from the installed venv") + + records = [] + with aggregate_dashboards.AggregateDashboardClient( + limits=Limits(max_requests=2, attempts=1) + ) as client: + for name, capture in ( + ("generation_outages", client.generation_outages), + ("dc_tie_flows", client.dc_tie_flows), + ): + snapshot = capture() + receipt = asdict(snapshot.receipt) + receipt["retrieved_at"] = snapshot.receipt.retrieved_at.isoformat() + records.append( + { + "adapter": name, + "receipt": receipt, + "source_last_updated": snapshot.source_last_updated, + "typed_rows": ( + len(snapshot.current) + len(snapshot.previous) + if isinstance( + snapshot, aggregate_dashboards.GenerationOutagesSnapshot + ) + else len(snapshot.rows) + ), + "stale_at_ten_minutes": snapshot.is_stale(), + } + ) + result = { + "distribution_version": importlib.metadata.version("tinyercot"), + "installed_module": str(module_path), + "verified_at": datetime.datetime.now(datetime.UTC).isoformat(), + "authentication": "none", + "scope": "Two rolling snapshots; no polling or historical extraction.", + "captures": records, + } + with args.output.open("x") as stream: + json.dump(result, stream, indent=2) + stream.write("\n") + print("Installed wheel decoded two anonymous dashboard snapshots; receipts saved.") + + +if __name__ == "__main__": + main() diff --git a/tools/probe_api_archives.py b/tools/probe_api_archives.py new file mode 100644 index 00000000..ecf52c61 --- /dev/null +++ b/tools/probe_api_archives.py @@ -0,0 +1,263 @@ +"""Explicit installed-wheel archive metadata and cached typed CSV verification.""" + +import argparse +import datetime +import hashlib +import json +import logging +import stat +from contextlib import closing +from dataclasses import asdict +from itertools import islice +from pathlib import Path + +import tinyercot +from tinyercot.catalog import Access +from tinyercot.public import Credentials, Limits +from tinyercot.public._http import PublicDataError, Receipt, SchemaMismatchError +from tinyercot.public.api_archives import APIArchive, APIArchiveClient, APIArchiveFile +from tinyercot.public.archives import checked_zip +from tinyercot.public.resource_dme import iter_resource_dme + + +def cached_file(evidence: Path, document: APIArchive) -> APIArchiveFile: + """Bind an existing selected source ZIP to its original receipt and metadata. + + Args: + evidence: Directory containing the bounded discovery ZIPs and receipts. + document: Unchanged public document from a newly fetched archive listing. + + Returns: + A receipt-verified source file without another document request. + + Raises: + PublicDataError: Selection, receipt, size, or ZIP structure differs. + OSError: A required source evidence file is missing or unreadable. + """ + path = evidence / f"download--np3-988-er--{document.document_id}.zip" + receipt_path = path.with_suffix(".receipt.json") + if ( + path.is_symlink() + or receipt_path.is_symlink() + or path.stat().st_size > 4_000_000 + or receipt_path.stat().st_size > 16_000 + ): + raise SchemaMismatchError("Discovery file identity or size is unsupported") + original = json.loads((evidence / "archive--np3-988-er.json").read_text()) + selected = next( + item for item in original["archives"] if item["docId"] == document.document_id + ) + if ( + document.emil_id != "np3-988-er" + or selected["friendlyName"] != document.friendly_name + or selected["postDatetime"] != document.post_datetime + ): + raise SchemaMismatchError("Selected source document metadata changed") + raw = path.read_bytes() + record = json.loads(receipt_path.read_text()) + record["retrieved_at"] = datetime.datetime.fromisoformat(record["retrieved_at"]) + receipt = Receipt(**record) + if ( + receipt.retrieved_at.tzinfo is None + or receipt.status != 200 + or receipt.source_url + != "https://api.ercot.com/api/public-reports/archive/np3-988-er/download" + or receipt.sha256 != hashlib.sha256(raw).hexdigest() + or receipt.byte_count != len(raw) + ): + raise SchemaMismatchError("Discovery archive differs from its receipt") + with checked_zip(raw, max_members=4, max_expanded_bytes=4_000_000) as archive: + members = tuple( + item.filename for item in archive.infolist() if not item.is_dir() + ) + return APIArchiveFile(document, receipt, members, raw) + + +def main() -> None: + """Verify installed metadata/CSV contracts and write credential-free evidence. + + Raises: + SystemExit: Opt-in, installation, credential, or required verification fails. + """ + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--live", action="store_true", required=True) + parser.add_argument("--credentials-file", type=Path, required=True) + parser.add_argument("--evidence", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--retired-history", action="store_true") + parser.add_argument("--download-oldest-bundle", action="store_true") + args = parser.parse_args() + installed = Path(tinyercot.__file__).resolve() + if "site-packages" not in installed.parts: + raise SystemExit("Run with an isolated installed-wheel interpreter using -I") + credential_file = args.credentials_file + if ( + credential_file.is_symlink() + or not credential_file.is_file() + or stat.S_IMODE(credential_file.stat().st_mode) != 0o600 + or credential_file.stat().st_size > 16_000 + ): + raise SystemExit("Credentials require an existing regular mode-0600 file") + logging.disable(logging.CRITICAL) + args.output.mkdir(parents=True, exist_ok=True) + records = { + "installed_module": str(installed), + "checks": [], + "all_history_extraction": False, + } + + def save(kind, **data): + records["checks"].append({"kind": kind, **data}) + (args.output / "receipts.json").write_text( + json.dumps(records, indent=2, default=str) + "\n" + ) + + try: + values = { + key: json.loads(value) + for line in credential_file.read_text().splitlines() + for key, value in [line.split("=", 1)] + } + credentials = Credentials( + *( + values[name] + for name in ( + "ERCOT_USERNAME", + "ERCOT_PASSWORD", + "ERCOT_SUBSCRIPTION_KEY", + ) + ) + ) + del values + with APIArchiveClient( + credentials, + limits=Limits(max_requests=10, max_bytes=16_000_000, attempts=1), + ) as client: + products, root_receipt = client.products() + save( + "installed-public-root", + product_count=len(products), + receipt=asdict(root_receipt), + ) + page = client.archives("NP3-988-ER") + save( + "installed-archive-listing", + emil_id="NP3-988-ER", + documents=len(page.documents), + total_records=page.total_records, + lifecycle=page.lifecycle, + receipt=asdict(page.receipt), + ) + for identity in (1270779234, 1166614741): + document = next( + item for item in page.documents if item.document_id == identity + ) + archive = cached_file(args.evidence, document) + with closing(iter_resource_dme(archive)) as iterator: + rows = list(islice(iterator, 4)) + assert len(rows) == 4 + assert all( + isinstance(value, str) + for record in rows + for value in record.row.model_dump().values() + ) + save( + "installed-cached-typed-dme", + document=asdict(document), + typed_rows=len(rows), + receipt=asdict(archive.receipt), + network_download=False, + ) + bundles = client.bundles("NP4-190-CD") + save( + "installed-bundle-listing", + emil_id="NP4-190-CD", + documents=len(bundles.documents), + total_records=bundles.total_records, + receipt=asdict(bundles.receipt), + ) + if args.retired_history: + for identity in ("NP4-179-CD", "NP3-990-EX"): + source = next( + ( + product + for product in products + if product.emil_id == identity + ), + None, + ) + if source is None or source.access is not Access.PUBLIC: + save( + "retired-history-boundary", + emil_id=identity, + result="absent-or-nonpublic", + requested=False, + ) + continue + try: + history = client.archives(identity) + save( + "installed-retired-history-listing", + emil_id=identity, + documents=len(history.documents), + total_records=history.total_records, + lifecycle=history.lifecycle, + receipt=asdict(history.receipt), + ) + except PublicDataError as error: + save( + "retired-history-boundary", + emil_id=identity, + result=type(error).__name__, + requested=True, + ) + if args.download_oldest_bundle: + oldest = min( + bundles.documents, key=lambda document: document.post_datetime + ) + try: + path = args.output / f"bundle-np4-190-cd-{oldest.document_id}.zip" + if path.exists() or path.is_symlink(): + raise SchemaMismatchError( + "Existing bundle output requires explicit receipt review" + ) + bundle = client.download_bundle(oldest) + with path.open("xb") as stream: + stream.write(bundle.body) + save( + "installed-single-bundle-transfer", + document=asdict(oldest), + receipt=asdict(bundle.receipt), + members=list(bundle.members), + row_schema=bundle.row_schema, + typed_rows=0, + ) + except PublicDataError as error: + save( + "selected-bundle-boundary", + document=asdict(oldest), + result=type(error).__name__, + detail=str(error), + response_byte_limit=16_000_000, + typed_rows=0, + ) + except ( + PublicDataError, + OSError, + ValueError, + TypeError, + KeyError, + AssertionError, + StopIteration, + ) as error: + save("required-probe-failure", error_type=type(error).__name__) + raise SystemExit( + f"Installed archive probe failed ({type(error).__name__}); see receipt evidence" + ) from None + print( + "Installed archive metadata and cached DME typing probe completed; see receipt evidence." + ) + + +if __name__ == "__main__": + main() diff --git a/tools/probe_dashboards.py b/tools/probe_dashboards.py new file mode 100644 index 00000000..d4d70228 --- /dev/null +++ b/tools/probe_dashboards.py @@ -0,0 +1,75 @@ +"""Capture each anonymous dashboard once through an isolated installed wheel. + +Run /absolute/venv/bin/python -I tools/probe_dashboards.py --live --output PATH. +The explicit live flag is required. Output contains receipts and row counts, +never headers, credentials, raw response bodies, or continuous polling. +""" + +import argparse +import datetime +import importlib.metadata +import json +import sys +from dataclasses import asdict +from pathlib import Path + + +def main() -> None: + """Run exactly two bounded anonymous captures with installed-code checks. + + Raises: + RuntimeError: The interpreter is not isolated or imports outside its venv. + PublicDataError: A bounded capture or typed source decoding fails. + OSError: The receipt output cannot be written. + """ + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--live", action="store_true") + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + if not args.live: + parser.error("--live is required for two anonymous ERCOT requests") + if not sys.flags.isolated or sys.prefix == sys.base_prefix: + raise RuntimeError("Use an isolated virtualenv interpreter with -I") + + from tinyercot.public import Limits, dashboards + + module_path = Path(dashboards.__file__).resolve() + if Path(sys.prefix).resolve() not in module_path.parents: + raise RuntimeError("Dashboard module was not imported from the installed venv") + + records = [] + with dashboards.DashboardClient( + limits=Limits(max_requests=2, attempts=1) + ) as client: + for name, capture in ( + ("fuel_mix", client.fuel_mix), + ("grid_conditions", client.grid_conditions), + ): + snapshot = capture() + receipt = asdict(snapshot.receipt) + receipt["retrieved_at"] = snapshot.receipt.retrieved_at.isoformat() + records.append( + { + "adapter": name, + "receipt": receipt, + "source_last_updated": snapshot.source_last_updated, + "typed_rows": len(snapshot.rows), + "stale_at_ten_minutes": snapshot.is_stale(), + } + ) + result = { + "distribution_version": importlib.metadata.version("tinyercot"), + "installed_module": str(module_path), + "verified_at": datetime.datetime.now(datetime.UTC).isoformat(), + "authentication": "none", + "scope": "Two rolling snapshots; no polling or historical extraction.", + "captures": records, + } + with args.output.open("x") as stream: + json.dump(result, stream, indent=2) + stream.write("\n") + print("Installed wheel decoded two anonymous dashboard snapshots; receipts saved.") + + +if __name__ == "__main__": + main() diff --git a/tools/probe_registry.py b/tools/probe_registry.py new file mode 100644 index 00000000..6ae9dd18 --- /dev/null +++ b/tools/probe_registry.py @@ -0,0 +1,145 @@ +"""Verify bounded current and historical selections through an installed registry.""" + +import argparse +import json +import logging +import stat +import sys +from dataclasses import asdict +from importlib.metadata import distribution +from pathlib import Path + +import tinyercot +from tinyercot.public import Credentials, ReportsClient, StreamingLimits +from tinyercot.public._schemas import ENDPOINTS + + +def main() -> None: + """Run one explicit installed-client batch and save public receipts only. + + Raises: + SystemExit: Consent, installation, credentials, or retrieval checks fail. + """ + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--live", action="store_true") + parser.add_argument("--credentials-file", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--start", type=int, default=0) + parser.add_argument("--count", type=int, default=20) + args = parser.parse_args() + if not args.live or not 1 <= args.count <= 20 or args.start < 0: + raise SystemExit("Explicit --live and a 1–20 operation batch are required") + if ( + Path(tinyercot.__file__).resolve().parent + == Path(__file__).resolve().parents[1] / "tinyercot" + ): + raise SystemExit("Run with an isolated installed wheel") + module = Path(tinyercot.__file__).resolve() + dist = distribution("tinyercot") + origin = json.loads(dist.read_text("direct_url.json") or "{}") + if ( + not sys.flags.isolated + or not module.is_relative_to(Path(sys.prefix).resolve()) + or "site-packages" not in module.parts + or "archive_info" not in origin + ): + raise SystemExit( + "Proof requires -I and an installed wheel in this interpreter's environment" + ) + path = args.credentials_file + if ( + path.is_symlink() + or not path.is_file() + or stat.S_IMODE(path.stat().st_mode) != 0o600 + ): + raise SystemExit("Credentials require a regular mode-0600 file") + logging.disable(logging.CRITICAL) + args.output.mkdir(parents=True, exist_ok=True) + try: + values = { + key: json.loads(value) + for line in path.read_text().splitlines() + for key, value in [line.split("=", 1)] + } + credentials = Credentials( + *( + values[name] + for name in ( + "ERCOT_USERNAME", + "ERCOT_PASSWORD", + "ERCOT_SUBSCRIPTION_KEY", + ) + ) + ) + del values + endpoints = [ep for ep in ENDPOINTS if "product_evidence" in ep.contract] + with ReportsClient( + credentials, limits=StreamingLimits(max_requests=90) + ) as client: + for endpoint in endpoints[args.start : args.start + args.count]: + output = args.output / ( + endpoint.path.strip("/").replace("/", "--") + ".json" + ) + if output.exists(): + continue + temporal = [ + field["name"] + for field in endpoint.contract["fields"] + if field["dataType"] in {"DATE", "DATETIME"} + and field.get("sortable") + ] + sort = temporal[0] if temporal else None + records = [] + for period, direction in (("latest", "desc"), ("oldest", "asc")): + try: + page = client.page( + endpoint, size=1, sort=sort, direction=direction + ) + records.append( + { + "period": period, + "status": "typed" if page.rows else "empty", + "rows": len(page.rows), + "sort": sort, + "source_time": str(getattr(page.rows[0], sort)) + if page.rows and sort + else None, + "receipt": asdict(page.receipt), + } + ) + print( + endpoint.path, + period, + "typed rows", + len(page.rows), + flush=True, + ) + except Exception as error: # noqa: BLE001 - Never expose credential-bearing request objects. + records.append( + { + "period": period, + "status": "failed", + "error_type": type(error).__name__, + } + ) + print(endpoint.path, period, type(error).__name__, flush=True) + output.write_text( + json.dumps( + { + "path": endpoint.path, + "installed_module": str(tinyercot.__file__), + "records": records, + }, + indent=2, + default=str, + ) + + "\n" + ) + except Exception as error: # noqa: BLE001 - Credential consumer must redact third-party failures. + raise SystemExit( + f"Installed registry probe failed: {type(error).__name__}" + ) from None + + +if __name__ == "__main__": + main() diff --git a/tools/probe_rt_archives.py b/tools/probe_rt_archives.py new file mode 100644 index 00000000..233b15db --- /dev/null +++ b/tools/probe_rt_archives.py @@ -0,0 +1,106 @@ +"""Explicit, anonymous installed-wheel probe for two selected RT annual files.""" + +import argparse +import datetime +import hashlib +import json +from contextlib import closing +from dataclasses import asdict +from itertools import islice +from pathlib import Path + +import tinyercot +from tinyercot.public.archive_reports import RTArchiveClient, iter_rt_archive + + +def main() -> None: + """Fetch a listing, reuse two source files, and record four typed rows each.""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--live", action="store_true", required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--source-evidence", type=Path, required=True) + args = parser.parse_args() + package = Path(tinyercot.__file__).resolve() + if "site-packages" not in package.parts: + parser.error("Run with an isolated installed-wheel interpreter using -I") + output = args.output.resolve() + output.mkdir(parents=True, exist_ok=True) + records = [] + with RTArchiveClient() as client: + documents, listing = client.archives() + for year, sheet in ((2010, "Dec_1"), (2026, "Jan")): + document = next( + d for d in documents if d.friendly_name == f"RTMLZHBSPP_{year}" + ) + cache = output / "cache" + cache.mkdir(exist_ok=True) + path = cache / f"13061-{document.document_id}.zip" + if not path.exists(): + source = args.source_evidence / f"{document.friendly_name}.zip" + source_receipt = ( + args.source_evidence / f"{document.friendly_name}-receipt.json" + ) + source_listing = json.loads( + (args.source_evidence / "rt-annual-list.json").read_text() + ) + original = next( + entry["Document"] + for entry in source_listing["ListDocsByRptTypeRes"]["DocumentList"] + if entry["Document"]["DocID"] == document.document_id + ) + assert ( + datetime.datetime.fromisoformat(original["PublishDate"]) + == document.published_at + ) + assert original["FriendlyName"] == document.friendly_name + assert original["SecurityStatus"] == "P" + raw = source.read_bytes() + receipt = json.loads(source_receipt.read_text()) + assert len(raw) == document.byte_count == receipt["byte_count"] + assert hashlib.sha256(raw).hexdigest() == receipt["sha256"] + identity = asdict(document) + identity["published_at"] = document.published_at.isoformat() + with path.open("xb") as stream: + stream.write(raw) + with path.with_suffix(".json").open("x") as stream: + json.dump({"document": identity, "receipt": receipt}, stream) + download = client.download(document, cache=cache) + assert download.cache_hit + with closing(iter_rt_archive(download, sheets=[sheet], max_rows=5)) as rows: + sample = list(islice(rows, 4)) + assert len(sample) == 4 + assert all(record.row.delivery_date.year == year for record in sample) + reused = client.download(document, cache=output / "cache") + assert reused.cache_hit and reused.receipt == download.receipt + records.append( + { + "document": asdict(document), + "download": asdict(download.receipt), + "initial_cache_hit": download.cache_hit, + "cache_reuse_verified": True, + "sheet": sheet, + "typed_rows": len(sample), + "complete_file_iteration": False, + } + ) + (output / "receipts.json").write_text( + json.dumps( + { + "installed_package": str(package), + "listing": asdict(listing), + "samples": records, + "authenticated_requests": 0, + "all_history_extraction": False, + }, + indent=2, + default=str, + ) + + "\n" + ) + print( + "Installed RT archive probe passed: two four-row samples; cache reuse verified." + ) + + +if __name__ == "__main__": + main() diff --git a/tools/register_public_batch.py b/tools/register_public_batch.py new file mode 100644 index 00000000..501e722e --- /dev/null +++ b/tools/register_public_batch.py @@ -0,0 +1,171 @@ +"""Project observed public operation batches into reviewable, pinned inputs.""" + +import argparse +import hashlib +import json +from pathlib import Path + +from tinyercot.public.metadata import RETIRED_PRODUCTS +from tools.discover_public import discover + +ROOT = Path(__file__).resolve().parents[1] + + +def project_batch(directory: Path, spec: Path) -> tuple[list[dict], dict]: + """Cross-check metadata identities and both bounded observation periods. + + Args: + directory: Public metadata, response and receipt capture directory. + spec: Exact pinned primary current OpenAPI export. + + Returns: + Verified contract projections and explicit observation status records. + + Raises: + ValueError: Root bytes or source identities lack matching provenance. + """ + raw = (directory / "root.json").read_bytes() + receipt = json.loads((directory / "root-receipt.json").read_text()) + if set(receipt) - {"source_url", "retrieved_at", "sha256", "byte_count", "status"}: + raise ValueError("Root receipt includes unsupported metadata") + if ( + hashlib.sha256(raw).hexdigest() != receipt["sha256"] + or len(raw) != receipt["byte_count"] + or receipt["source_url"] != "https://api.ercot.com/api/public-reports/" + or receipt["status"] != 200 + ): + raise ValueError("Root product metadata lacks matching public provenance") + products = json.loads(raw)["_embedded"]["products"] + verified = [] + states = {"root_receipt": receipt, "products": len(products), "operations": {}} + for product in products: + for artifact in product["artifacts"]: + url = artifact.get("_links", {}).get("endpoint", {}).get("href", "") + path = url.removeprefix("https://api.ercot.com/api/public-reports") + if not path.startswith("/" + product["emilId"].lower() + "/"): + raise ValueError("Artifact does not belong to its source product") + state = {"product": product["emilId"], "status": "pending", "periods": {}} + states["operations"][path] = state + if ( + product["emilId"].upper() in RETIRED_PRODUCTS + or product["status"] != "Active" + ): + state["status"] = "retired-or-inactive" + continue + if ( + product["audience"] != "Public" + or product["securityClassification"] != "Public" + ): + state["status"] = "restricted-or-unknown" + continue + if product["contentType"] != "DATA": + state["status"] = "binary-row-schema-unsupported" + continue + projections = [] + for period in ("current", "historical"): + source = directory / ( + path.strip("/").replace("/", "--") + "--" + period + ".json" + ) + if not source.exists(): + state["periods"][period] = "not-observed" + continue + try: + projection = discover( + spec=spec, + response=source, + receipt=source.with_name(source.stem + "-receipt.json"), + path=path, + allow_observed_nulls=True, + ) + state["periods"][period] = projection["row_schema"] + if projection["row_schema"] == "verified_observed": + projections.append(projection) + except (KeyError, TypeError, ValueError) as error: + state["periods"][period] = "ambiguous: " + str(error) + if not projections: + state["status"] = ( + "pending" + if all( + value == "not-observed" for value in state["periods"].values() + ) + else "schema-unverified" + ) + continue + current = projections[0] + field_types = {f["name"]: f["dataType"] for f in current["fields"]} + if any( + {f["name"]: f["dataType"] for f in p["fields"]} != field_types + for p in projections + ): + state["status"] = "ambiguous-schema-epochs" + continue + current["observed_nullable_fields"] = sorted( + {name for p in projections for name in p["observed_nullable_fields"]} + ) + current["nullability_policy"] = ( + "Accept null only for fields observed null in pinned samples; field presence stays required. Unobserved nullability remains unknown." + ) + current["observations"] = [p["response_source"] for p in projections] + current["product_evidence"] = { + "emilId": product["emilId"], + "status": product["status"], + "audience": product["audience"], + "securityClassification": product["securityClassification"], + "contentType": product["contentType"], + "artifactReportTypeId": artifact["reportTypeId"], + "root_sha256": receipt["sha256"], + } + state["status"] = "schema-verified-awaiting-installed-retrieval" + verified.append(current) + return verified, states + + +def main() -> None: + """Write deterministic evidence projections; never fetch or edit legacy code.""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--evidence", type=Path, required=True) + parser.add_argument("--spec", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + contracts, states = project_batch(args.evidence, args.spec) + args.output.mkdir(parents=True, exist_ok=True) + manifest_path = ROOT / "tools/inputs/current/provenance.json" + manifest = json.loads(manifest_path.read_text()) + existing = { + json.loads((manifest_path.parent / entry["input"]).read_text())["path"] + for entry in manifest["contracts"] + } + additions = [] + for contract in sorted(contracts, key=lambda c: c["path"]): + if contract["path"] in existing: + continue + product, method = contract["path"].strip("/").split("/") + filename = product + "--" + method + ".json" + model = "".join( + part[:1].upper() + part[1:] + for part in (product + "_" + method).replace("-", "_").split("_") + ) + constant = (product + "_" + method).replace("-", "_").upper() + raw = (json.dumps(contract, indent=2) + "\n").encode() + (args.output / filename).write_bytes(raw) + additions.append( + { + "input": filename, + "model": model, + "constant": constant, + "fields_constant": constant + "_FIELDS", + } + ) + manifest["inputs"][filename] = hashlib.sha256(raw).hexdigest() + manifest["contracts"].extend(additions) + (args.output / "provenance.json").write_text(json.dumps(manifest, indent=2) + "\n") + (args.output / "discovery-status.json").write_text( + json.dumps(states, indent=2) + "\n" + ) + print( + f"Projected {len(additions)} new contracts; {len(states['operations'])} artifact paths classified" + ) + + +if __name__ == "__main__": + main()