API & Open Data

The whole ledger is open data. Every dataset below is a plain, read-only file served straight from the site: no key, no sign-up, no rate limit, cross-origin reads enabled, under a CC BY 4.0 license. Fetch it from a browser, a notebook, or a cron. The files regenerate on each rebuild, so what you read is what the site shows.

The one rule

Every dollar figure is a single incident’s own number. Figures are never summed across incidents, and amount_usd is blank where no single figure applies. If you aggregate, you are making a claim this index does not. See the methodology.

Endpoints

Incident records (JSON) /incidents.json application/json · 251 records

One row per distinct incident on the public record, with a stable field schema. The primary dataset.

Incident records (CSV) /incidents.csv text/csv · 251 records

The same records, one row per incident, for spreadsheets.

Per-figure loss ledger (CSV) /incident_figures.csv text/csv

Every published loss figure, one row per figure, with its period, scope, and basis. Never summed.

Full dataset (JSON) /data.json application/json

The complete build payload: the index headline, the annual loss series, sources, both incident feeds, and the market snapshot.

New incidents (JSON Feed) /feed.json application/feed+json

JSON Feed 1.1 of the most recent incidents, for polling.

New incidents (RSS) /feed.xml application/rss+xml

RSS 2.0 of the most recent incidents.

The incidents schema

Fields on each record in /incidents.json (and columns in /incidents.csv). Fields are add-only: new fields may appear, but existing ones are not renamed or removed without a version change.

FieldDescription
organizationThe filing or reporting entity named in the record.
breached_entityThe party whose data was breached, when distinct from the filer; otherwise null.
feedWhich ledger the record belongs to: "government_record" (SEC / regulator / state-AG) or "beyond_filings" (news, company statements, outside estimates).
disclosed_dateISO 8601 date the incident was publicly disclosed. Used for ordering; not a display value.
dateHuman display date of the incident, in "Mon YYYY" form.
gradeProvenance grade: V (Verified, a primary filing), A (Attested, a named source), or I (Inferred).
amount_displayThe incident's own loss figure as shown on the site, or "Not yet quantified".
amount_usdThat single figure in USD, or null. It is one incident's own figure and is NEVER a total; figures are never summed across incidents.
figure_typeWhat the amount represents (for example total_incident_cost), or null when no single figure applies.
disclosure_caseThe disclosure classification for the record.
sectorControlled-vocabulary industry sector, or null when untagged.
source_typeStructural source type (for example sec_8k_item_105, state_ag, news).
source_labelHuman-readable label for the source.
source_urlLink to the primary source for the record.
record_urlPath to the incident's own page on the site.

Discovery

A machine-readable manifest of every dataset (URLs, formats, record counts, and this schema) lives at /api.json. Point a client at that to discover everything programmatically.

Example

// Fetch every incident (browser, notebook, or cron; CORS is enabled):
const { records } = await (await fetch('https://hackerinahoodie.com/incidents.json')).json();

// Healthcare incidents that carry a dollar figure:
const priced = records.filter(r => r.sector === 'Healthcare and Life Sciences' && r.amount_usd != null);

// Discover every dataset programmatically:
const manifest = await (await fetch('https://hackerinahoodie.com/api.json')).json();
← Back to the index