The open dataset for the US electric grid — utilities, grid operators, territory boundaries, and more.
opengrid.info · Built by Texture, maintained by the community.
| Dataset | File | Count | Description |
|---|---|---|---|
| Utilities | data/utilities.json |
3,132 | Every US electric utility — IOUs, co-ops, munis, CCAs, federal |
| ISOs | data/isos.json |
7 | Independent System Operators |
| RTOs | data/rtos.json |
7 | Regional Transmission Organizations |
| Balancing Authorities | data/balancing-authorities.json |
45 | Balancing authorities with EIA codes |
| Regions | data/regions.json |
3,000 | Geographic regions — service territories, ISO/RTO/BA boundaries |
| Territory Boundaries | data/territories/*.json |
3,000+ | GeoJSON boundary files for service territories, ISOs, BAs, CCAs |
All data is JSON. No database required. Clone the repo and start building.
For a detailed breakdown of every field, data source, and what we're planning to add next, see the Data Catalog.
git clone https://github.com/TextureHQ/opengrid.git
cd opengridThen load any JSON file in your language of choice:
import json
with open("data/utilities.json") as f:
utilities = json.load(f)
print(f"{len(utilities)} utilities")
# → 3132 utilities
# Find all investor-owned utilities in California
ca_ious = [u for u in utilities if u["segment"] == "INVESTOR_OWNED_UTILITY" and u.get("jurisdiction") and "CA" in u["jurisdiction"]]import utilities from "./data/utilities.json" assert { type: "json" };
const coops = utilities.filter(u => u.segment === "DISTRIBUTION_COOPERATIVE");
console.log(`${coops.length} distribution cooperatives`);The site at opengrid.info is an interactive map and explorer for all the data in this repo.
Run it locally:
npm install
npm run dev
# Open http://localhost:3000Note: The interactive map requires a Mapbox access token. Set
NEXT_PUBLIC_MAPBOX_ACCESS_TOKENin.env.local. Without it, the home page shows a static landing view — all other pages work fine.
Each utility includes identity, classification, operational data, and relationships:
{
id: string; // UUID
slug: string; // URL-safe identifier (e.g., "duke-energy")
name: string; // Display name
eiaName: string | null; // Name as reported to EIA
shortName: string | null; // Abbreviated name
logo: string | null; // Logo URL
website: string | null; // Official website
eiaId: string | null; // EIA utility ID
segment: UtilitySegment; // INVESTOR_OWNED_UTILITY | DISTRIBUTION_COOPERATIVE | MUNICIPAL_UTILITY | ...
status: UtilityStatus; // ACTIVE | MERGED | ACQUIRED | DEFUNCT | PENDING
customerCount: number | null; // Total retail customers
peakDemandMw: number | null; // Summer peak demand (MW)
winterPeakDemandMw: number | null; // Winter peak demand (MW)
totalRevenueDollars: number | null; // Annual revenue
totalSalesMwh: number | null; // Annual sales (MWh)
baCode: string | null; // Balancing authority code
nercRegion: string | null; // NERC region
hasGeneration: boolean | null; // Owns generation assets
hasTransmission: boolean | null; // Operates transmission
hasDistribution: boolean | null; // Operates distribution
amiMeterCount: number | null; // Advanced metering infrastructure count
totalMeterCount: number | null; // Total meters
jurisdiction: string | null; // States served (e.g., "FL, IN, KY, NC, OH, SC")
isoId: string | null; // → ISOs
rtoId: string | null; // → RTOs
balancingAuthorityId: string | null; // → Balancing Authorities
generationProviderId: string | null; // G&T co-op providing generation
transmissionProviderId: string | null; // Transmission provider
parentId: string | null; // Parent utility
successorId: string | null; // Successor (if merged/acquired)
serviceTerritoryId: string | null; // → Regions
}Utility segments:
INVESTOR_OWNED_UTILITY— IOUs (e.g., Duke Energy, PG&E)DISTRIBUTION_COOPERATIVE— Distribution co-opsGENERATION_AND_TRANSMISSION— G&T co-opsMUNICIPAL_UTILITY— City/town-owned utilitiesCOMMUNITY_CHOICE_AGGREGATOR— CCAs (California)POLITICAL_SUBDIVISION— State/county utilitiesTRANSMISSION_OPERATOR— Transmission-only operatorsJOINT_ACTION_AGENCY— Joint action agenciesFEDERAL— Federal utilities (TVA, BPA, WAPA)
{
id: string;
slug: string; // e.g., "caiso"
name: string; // e.g., "California Independent System Operator"
shortName: string; // e.g., "CAISO"
states: string[]; // States covered
website: string | null;
regionId: string | null; // → Regions (for boundary GeoJSON)
logo: string | null;
}Same schema as ISOs.
{
id: string;
slug: string; // e.g., "arizona-public-service"
name: string; // e.g., "Arizona Public Service"
shortName: string; // e.g., "APS"
eiaCode: string | null; // e.g., "AZPS"
eiaId: string | null;
website: string | null;
states: string[];
isoId: string | null; // → ISOs (if within an ISO)
regionId: string | null; // → Regions (for boundary GeoJSON)
logo: string | null;
}{
id: string;
slug: string;
name: string;
type: RegionType; // SERVICE_TERRITORY | ISO | BALANCING_AUTHORITY | RTO | CCA_TERRITORY | ...
eiaId: string | null;
state: string | null;
customers: number | null;
source: string | null; // Data source (e.g., "ArcGIS HIFLD Electric Retail Service Territories")
sourceDate: string | null;
}Each file is a GeoJSON FeatureCollection with polygon/multipolygon geometries:
{
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"properties": {
"id": "region-st-803",
"name": "ARIZONA PUBLIC SERVICE CO",
"eiaId": "803",
"state": "AZ"
},
"geometry": {
"type": "Polygon",
"coordinates": [[[lng, lat], ...]]
}
}]
}File naming:
- EIA ID for service territories:
803.json,1000.json - Prefixed slugs for other types:
ba-caiso.json,iso-pjm.json,cca-cleanpowersf.json
All data is sourced from publicly available, authoritative sources:
| Source | URL | What We Use |
|---|---|---|
| EIA-861 | eia.gov/electricity/data/eia861 | Utility identities, customer counts, operational data, relationships |
| HIFLD | hifld-geoplatform.opendata.arcgis.com | Service territory GeoJSON boundaries |
| ArcGIS | services.arcgis.com | Electric retail service territory polygons |
| CEC | energy.ca.gov | California Community Choice Aggregator territories |
| EIA API | api.eia.gov | Balancing authority boundaries and codes |
See the Data Catalog for detailed source documentation and our roadmap for future datasets (rate structures, generation mix, interconnection queues, and more).
opengrid/
├── README.md ← You are here
├── LICENSE ← Apache 2.0
├── data/
│ ├── utilities.json ← 3,132 utilities
│ ├── isos.json ← 7 ISOs
│ ├── rtos.json ← 7 RTOs
│ ├── balancing-authorities.json ← 45 BAs
│ ├── regions.json ← 3,000 regions
│ └── territories/ ← 3,000+ GeoJSON boundary files
├── app/ ← Next.js pages (the opengrid.info site)
│ └── (shell)/ ← Layout with nav, map, detail pages
├── components/ ← React components (TopBar, DataSourceLink, etc.)
├── lib/ ← Data loading, formatting, geo utilities
├── types/ ← TypeScript type definitions
├── scripts/ ← Data sync scripts (EIA, ArcGIS, CCA, etc.)
├── docs/
│ ├── CONTRIBUTING.md ← How to contribute
│ └── DATA_CATALOG.md ← Detailed data catalog & gap analysis
└── content/ ← Concept and planning docs
We welcome contributions! See docs/CONTRIBUTING.md for details on:
- Reporting data issues
- Adding or updating data
- Contributing territory boundaries
- Improving the explorer
- Running sync scripts
OpenGrid is licensed under the Apache License 2.0.
The underlying data is sourced from US government agencies and public sources. The data itself is not copyrightable — our contribution is the cleaning, normalization, and structuring.
Built with ❤️ by Texture — the energy operating system.