Skip to main content
Every number in an employer’s OSHA profile comes from rows that OSHA publishes. These operations return those rows as published, so you can check a figure, show your work, or dig deeper. Follow connection setup first. Your organization also needs the OSHA dataset turned on; see Before you start. Everything here is read-only, and agents can make the same calls over MCP.

What a row looks like

Each row keeps OSHA’s own column names in camelCase, such as activityNr, inspType, openDate and totalDafwCases. Values stay as OSHA publishes them, and dates stay as OSHA’s text. Effective adds three fields:
  • employerId and siteId link the row to an employer and a site. They’re null when Effective couldn’t place the row.
  • sourceFile names the exact OSHA file the row came from, with its url, sha256 and retrievedAt.

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

The path 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)
  • violType is S (serious), W (willful), R (repeat), O (other than serious) or U (unclassified). Filter with violType.
  • standard is the OSHA rule as OSHA writes it. 19260501 B13 is 29 CFR 1926.501(b)(13).
  • Citations OSHA has deleted are hidden. Add includeDeleted=true to see them.
  • The whole list comes back at once, with no cursor.
Read one citation with 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 with GET /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. Write query 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
Results come most relevant first. 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. Send naics (2–6 digits) and, if you like, a state:
Response
  • naics is a prefix. A shorter code gives a wider group of peers. Leave out state for the whole country.
  • Years with fewer than 10 employers filing are left out, so no single employer can be singled out.
  • trcRate and dartRate work 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.