EIA · OpenAPI Overlay 1.0.0
API Evangelist enhancements for EIA Open Data APIv2
15 actions
15 updates
documentation
extends
openapi/eia-api-v2-openapi.yml
Derived by API Evangelist
Built from the contracts EIA publishes. EIA did not publish this file.
What the actions change
descriptionx-apievangelist-slugx-apievangelist-reviewedx-live-api-versionx-live-api-version-datex-spec-sourcex-spec-last-modifiedx-changelog
Targets 14
$.info
$.servers
$.components.securitySchemes.api_key
$
$.components.parameters.data
$.components.parameters.facets
$.components.parameters.frequency
$.components.parameters.start
$.components.parameters.end
$.components.parameters.sort
$.components.parameters.length
$.components.parameters.offset
$.components.schemas.DataResponse.properties.data
$.components.schemas.DataResponseContainer.properties.apiVersion
OpenAPI Overlay
overlay: 1.0.0
info:
title: API Evangelist enhancements for EIA Open Data APIv2
version: 1.0.0
extends: openapi/eia-api-v2-openapi.yml
x-generated: '2026-07-27'
x-method: generated
x-source: https://www.eia.gov/opendata/documentation.php, https://www.eia.gov/opendata/faqs.php
x-note: |
Non-destructive enhancements over EIA's published OpenAPI 3.0.0 (info.version 2.1.0, last
modified 2022-12-01). Every value added here is sourced from EIA's own documentation, FAQ,
patch notes or a live probe - nothing is invented. The original spec is never mutated.
The gaps this overlay annotates: 272 of 278 operations carry no operationId, the api-key
failure responses (403 API_KEY_MISSING / API_KEY_INVALID) are undeclared, error responses
carry no schema, and the spec trails the live release (2.1.12) by ten patch versions.
actions:
- target: $.info
update:
x-apievangelist-slug: eia
x-apievangelist-reviewed: '2026-07-27'
x-live-api-version: 2.1.12
x-live-api-version-date: '2026-03'
x-spec-source: https://www.eia.gov/opendata/eia-api-swagger.zip
x-spec-last-modified: '2022-12-01'
x-changelog: https://www.eia.gov/opendata/documentation.php
x-terms-of-service: https://www.eia.gov/opendata/register.php
x-license-note: EIA data is provided free of charge and should be used in compliance with
EIA's Copyrights and Reuse Policy; attribution to "EIA" or "U.S. Energy Information
Administration" is required and the EIA logo may not be used.
- target: $.info
update:
contact:
name: EIA Open Data
url: https://www.eia.gov/opendata/
email: developer@eia.gov
- target: $.servers
update:
- url: https://api.eia.gov
description: Production - APIv2 (HTTPS only, api_key query parameter required)
- target: $.components.securitySchemes.api_key
update:
description: |
Free API key, issued instantly by email from https://www.eia.gov/opendata/register.php.
Must be supplied in the URL query string - EIA states it will NOT be read from HTTP
headers. Missing key returns HTTP 403 API_KEY_MISSING; an invalid key returns HTTP 403
API_KEY_INVALID. Not required for the bulk download facility at https://api.eia.gov/bulk.
x-registration-url: https://www.eia.gov/opendata/register.php
x-cost: free
x-approval-required: false
- target: $
update:
x-rate-limits:
sustained: ~9000 requests per hour per key
burst: 5 requests per second per key
published: https://www.eia.gov/opendata/faqs.php
enforcement: automatic temporary key suspension with automatic reactivation
headers: none
x-pagination:
style: offset-limit
parameters: [offset, length]
max_rows_json: 5000
max_rows_xml: 300
total_field: response.total
truncation_warning: '{"warning":"parameter out of range","description":"The API can only
return 5000 rows in JSON format..."}'
x-error-envelope:
gate: '{"error":{"code":"API_KEY_MISSING|API_KEY_INVALID","message":"..."}}'
parameter: '{"error":"<text>","code":<int>}'
problem_json: false
x-idempotency: not applicable - read-only API
x-undocumented-routes:
- path: /v2/seriesid/{APIv1-SERIESID}
note: Legacy APIv1 series-ID translation, documented at
https://www.eia.gov/opendata/documentation.php but absent from this spec.
- target: $.components.parameters.data
update:
description: 'Columns of measured values to return, e.g. data[]=price&data[]=revenue.
Required to receive any values - without it the response contains dimension columns only.
Each selected column is accompanied by a <column>-units field. Valid column names come
from the route''s own metadata.'
- target: $.components.parameters.facets
update:
description: 'Dimension filters, e.g. facets[stateid][]=CO&facets[sectorid][]=RES. Valid
facet ids come from the route metadata; valid values from GET <route>/facet/{facet_id}.
An unknown value is not an error - it returns zero rows.'
- target: $.components.parameters.frequency
update:
description: Periodicity to return. Valid values are declared per route in its metadata
(e.g. hourly, daily, monthly, quarterly, annual). An invalid value returns HTTP 400 naming
the valid frequencies.
- target: $.components.parameters.start
update:
description: 'Inclusive lower bound, in the route''s dateFormat. Compared lexically against
the period stamp: for monthly data start=2008-02-01 EXCLUDES 2008-02, so use 2008-01-31.
Since v2.1.11 identical start and end values on a lower-periodicity series return the full
inclusive range.'
- target: $.components.parameters.end
update:
description: Inclusive upper bound, in the route's dateFormat.
- target: $.components.parameters.sort
update:
description: 'Sort array, e.g. sort[0][column]=period&sort[0][direction]=desc. Since v2.1.9
a deterministic default sort is applied when none is supplied.'
- target: $.components.parameters.length
update:
description: Maximum rows to return. Hard ceiling is 5,000 in JSON and 300 in XML,
regardless of the value supplied.
- target: $.components.parameters.offset
update:
description: Rows to skip before returning. Combine with length to page; response.total
always reports the full responsive row count.
- target: $.components.schemas.DataResponse.properties.data
update:
description: Array of observation objects. Columns vary per route - period plus the route's
facet columns plus each requested measure and its <measure>-units companion. Values are
JSON strings, not numbers, since v2.1.6 (January 2024).
- target: $.components.schemas.DataResponseContainer.properties.apiVersion
update:
description: The live API release that served the response, e.g. "2.1.12". Pair it with the
matching technical documentation.
Work with this as data
Every overlay here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for openapi overlays
4 MCP tools reach this
find_overlaysBrowse and filter every overlay in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This overlay
curl "https://apis.io/api/v1/overlays/eia-api-v2-overlay"
All openapi overlays
curl "https://apis.io/api/v1/overlays?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.