Data / API
Load any dataset into your own code
Each of the 76 datasets on this site is a JSON file at a fixed address, with field types that stay fixed. Code on any site can read it, with no key and no sign-in.
index.json every dataset, its fields and its links openapi.json the API as OpenAPI 3.1 All downloads
Start with one dataset
Power prices and AI capacity by state →
The id of a dataset is its address with dots for slashes, so /power/states.csv is power.states. Its current rows are at https://jesseahawkins.com/data/v1/datasets/power.states.json. A field of numbers holds numbers, and an empty cell holds null.
curl -s https://jesseahawkins.com/data/v1/datasets/power.states.json | jq '.rows[0]' import pandas as pd, requests
r = requests.get("https://jesseahawkins.com/data/v1/datasets/power.states.json").json()
df = pd.DataFrame(r["rows"])
df.shape # (51, 16) const r = await fetch("https://jesseahawkins.com/data/v1/datasets/power.states.json").then((x) => x.json());
console.table(r.rows.slice(0, 5)); df <- read.csv("https://jesseahawkins.com/power/states.csv")
dim(df) # 51 16 Addresses
https://jesseahawkins.com/data/v1| Address | What it holds |
|---|---|
/index.json | Every dataset: its id, title, fields and types, row count, terms, the day it was checked, the day it is due again, and its links. |
/datasets/{id}.json | The current rows, the same facts, the sha256 of the CSV they came from, and whether that CSV is the latest fixed release. |
/datasets/{id}/releases.json | Every fixed release, oldest first, with its sha256 and the rows and fields that changed. |
/datasets/{id}/releases/{release}.json | One fixed release as JSON. It never changes, so a citation can point to it. |
/openapi.json | The four addresses above as OpenAPI 3.1, with every dataset id. |
For AI assistants
/llms.txt → /llms.txt lists every section and dataset in plain text. https://jesseahawkins.com/data/mcp is a Model Context Protocol server over Streamable HTTP. Add it to an assistant as a remote server; it needs no key and keeps no session. It reads the same files as this API, and it cannot write.
| Tool | What it gives |
|---|---|
list_datasets | List the open datasets: id, title, section, what one row is, the row count, fields with their types, terms, the day each was checked, and its links. Filter by section or by words in the id or title. |
read_dataset | Read the current rows of one dataset by its id (from list_datasets). Gives 100 rows by default and 1000 at most; use offset for the next page. "where" keeps only rows whose fields equal the given values. |
read_series | Read one time series: its unit, frequency, source, licence and every reading, oldest first. Call it with no id to list the series. "from" and "to" limit the periods, inclusive. |
find_entity | Find the page of a company, data center, country, US state, occupation, AI model, chip plant, process node, AI accelerator, AI vendor, AI law, chart, term or dataset by name. Best matches first. |
What stays fixed in version 1
v1- A dataset keeps its id, and a field keeps its name and its type. A field of numbers stays numbers.
- New fields can appear, so read fields by name and ignore the ones you do not use.
- A release file never changes after it is published. It carries its own field types, read from its own rows, and an old release can type a field differently from the current rows.
- A dataset that stops is listed under
retiredin the index, with the day it stopped. - A change that would break any of these gets a new version at a new address, and version 1 stays.
Where each value comes from
tier
Each field in a dataset file has a tier. A field that is an identifier or a place, and most text fields, have null. When one field holds values of two tiers, tier is null and tierBy names the field of the same row that decides, with the tier of each of its values.
quoted- The source publishes this value, and this site copies it. A change of unit or of rounding is allowed. Nothing else is.
derived- This site calculates the value from quoted values with fixed arithmetic: a sum, an average, a share, a change, a count or a rank.
modelled- An estimate from a model, made by the source or by this site. A value calculated from a modelled value is modelled.
Each dataset file also has freshness: the state that /status/ shows, with a notice when the data is due or late. The files are static, so the state is true for asOf, the day of the build. The dataset is due from next and late from late; compare those dates with the day you read the file.
Every dataset id
index.json →Terms
—
Each dataset carries its terms in terms, in the words of its own sources. Credit the source a dataset names when you reuse it. The files are static, so fetch them as often as you need, and use the release files when a result must not change.