Updated 14 October 2026
Data files & API
There is no server here to query. The “API” is a pair of static files that sit next to the pages and are served unchanged: a JSON array and the same records as CSV. The browser and the record view read the JSON directly with a relative fetch; you can do the same, or just open the files.
The files
| Path | Format | Records | What it is |
|---|---|---|---|
| /api/materials.json | JSON array | 120 | The browse index, one object per grade, all 26 fields, nulls kept. |
| /data/materials.csv | CSV, UTF-8, LF | 120 | The same records, same field order, lists joined with a semicolon. |
| /feed.xml | Atom 1.0 | - | One entry per dataset release, newest first. |
The JSON and CSV are generated from the same source as the release tarball, so a value here never disagrees with the full dataset - it is a strict subset. The browse index is a curated 120 of the 412 records: at least six per family, picked to span each family’s temperature and density range rather than to be a random sample. If you need all 412, or fields that change between releases, take the tarball and read it with cinderq.
Shape of a record
Every object carries all 26 keys even when the value is null; the key is never dropped. Lists (aliases, source_ids) are arrays, empty as [], never null. The schema page gives the type, unit and meaning of each field and the four enumerations.
{
"id": "CC-0137",
"name": "corundum brick, 99% Al2O3",
"family": "corundum",
"aliases": ["sintered alumina brick", "AL99"],
"al2o3_pct": 99.1,
"max_service_c": 1750,
"max_service_atmosphere": "oxidising",
"k_1000_w_mk": 3.0,
"k_ref_c": 1000,
"k_method": "hot-wire",
"bulk_density_g_cm3": 3.1,
"slag_index": 4,
"source_ids": ["S-004", "S-019"],
"confidence": "high",
"updated": "2026-06-28"
}
Abbreviated to fifteen keys for the page; the file carries all twenty-six.
Reading it yourself
Because the files are relative to the site, a browser on any page of this domain can read them without a cross-origin request. The record view does exactly this:
fetch("/api/materials.json")
.then(r => r.json())
.then(rows => rows.find(r => r.id === "CC-0137"));
From a shell, the CSV opens in any spreadsheet, and the JSON answers the common questions without a dependency:
# every corundum grade good past 1750 C, as a table
$ curl -s https://cindercore.dev/api/materials.json \
| jq -r '.[] | select(.family=="corundum" and .max_service_c>=1750)
| [.id,.name,.max_service_c] | @tsv'
# count records per family
$ curl -s https://cindercore.dev/api/materials.json \
| jq -r 'group_by(.family)[] | "\(.[0].family)\t\(length)"'
What is stable
- Paths.
/api/materials.jsonand/data/materials.csvwill not move within a major dataset version. - Field order. The CSV header is the canonical field order and matches the schema. New fields are appended, never inserted.
- Ids. A record id is permanent. A withdrawn grade leaves its id retired, never reassigned.
- Subset rule. If a grade is in this index, its values equal the release values exactly. The index may gain or lose grades between releases; the numbers on a kept grade do not silently change without a changelog line.