What a row looks like
Each row keeps OSHA’s own column names in camelCase, such asactivityNr, inspType, openDate
and totalDafwCases. Values stay as OSHA publishes them, and dates stay as OSHA’s text. Effective
adds three fields:
employerIdandsiteIdlink the row to an employer and a site. They’renullwhen Effective couldn’t place the row.sourceFilenames the exact OSHA file the row came from, with itsurl,sha256andretrievedAt.
Choose a resource
All paths are under/insurance/osha.
Lists come newest first. They return 25 rows by default, and up to 100 with
limit. While
nextCursor isn’t null, send it as cursor with the same filters. Dates in filters are
YYYY-MM-DD and inclusive, and states are two-letter codes.
Read one row by its ID: /300a-summaries/{id}, /case-details/{id},
/severe-injury-reports/{id}, /inspections/{activityNr} or /accidents/{summaryNr}.
List an employer’s rows
Thepath values in an OSHA profile are ready-made lists. This one returns Sunshine Roofing’s 2023
summaries, one for each site that filed:
Response (first row, abbreviated)
Read an inspection and its citations
Read an inspection by its activity number:Response (abbreviated)
inspType is OSHA’s one-letter reason for the inspection, such as H (planned), B (complaint) or
M (fatality or catastrophe). Filter the list with the same letter.
Then list its citations:
Response (abbreviated)
violTypeisS(serious),W(willful),R(repeat),O(other than serious) orU(unclassified). Filter withviolType.standardis the OSHA rule as OSHA writes it.19260501 B13is 29 CFR 1926.501(b)(13).- Citations OSHA has deleted are hidden. Add
includeDeleted=trueto see them. - The whole list comes back at once, with no cursor.
GET /insurance/osha/inspections/1500001/violations/01001. Add /events
to that path to see how its penalty and status changed over time.
GET /insurance/osha/inspections/1500001/related-activities lists other OSHA activities linked to
the inspection; filter it with relType.
Read an accident investigation
Accident investigations describe what happened. Read one withGET /insurance/osha/accidents/900001,
and the workers involved with GET /insurance/osha/accidents/900001/injuries. Each injured worker
links back to an inspection through relInspNr.
List accidents with employerId, siteId or activityNr. Add fatality=true or fatality=false
to narrow the list.
Search the narratives
Search reads the narratives in case details, severe injury reports and accident investigations. Writequery like a web search: plain words, quotes for a phrase, and - to leave a word out. Add
employerId to search one employer’s rows.
Response
resource and rowId name the row, and path reads it. Snippets
mark the matching words in bold.
Compare with industry rates
Industry rates add up every Form 300A filed in an industry. Sendnaics (2–6 digits) and, if you
like, a state:
Response
naicsis a prefix. A shorter code gives a wider group of peers. Leave outstatefor the whole country.- Years with fewer than 10 employers filing are left out, so no single employer can be singled out.
trcRateanddartRatework the same way as in the OSHA profile, so you can set them side by side.
Good to know
- A list without one of its required filters returns
400 invalid_request, as does an unknown or repeated parameter. - Each dataset covers different employers. See What OSHA data covers.
- Pagination and recovery explains paging and how to recover from errors.