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.
View Overlay File View on GitHub Overlay Specification

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

Raw ↑
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.
All 92 tools →

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.