> ## Documentation Index
> Fetch the complete documentation index at: https://docs.effectiveai.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Read OSHA’s own rows

> Read OSHA injury summaries, inspections, citations and accident investigations as OSHA publishes them, search their narratives, and compare industry injury rates.

Every number in an [employer's OSHA profile](/guides/osha-employers) 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](/guides/index#connect-once) first. Your organization also needs the OSHA
dataset turned on; see [Before you start](/guides/osha-employers#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`.

| Resource | What it holds | Needs one of | Other filters |
| - | - | - | - |
| `300a-summaries` | Yearly injury summaries (Form 300A) | `employerId`, `siteId`, `establishmentId`, `ein`, `state` | `naics`, `year` |
| `case-details` | Individual injury and illness cases (Forms 300 and 301) | `employerId`, `siteId`, `establishmentId`, `ein`, `state` | `naics`, `year` |
| `severe-injury-reports` | Hospitalizations, amputations and eye losses employers reported | `employerId`, `siteId`, `state`, `zip` | `naics`, `eventDateFrom`, `eventDateTo` |
| `inspections` | Inspections, with their citations | `employerId`, `siteId`, `state`, `zip` | `naics`, `inspType`, `openDateFrom`, `openDateTo` |
| `accidents` | Accident investigations, with the workers involved | `employerId`, `siteId`, `activityNr` | `eventDateFrom`, `eventDateTo`, `fatality` |

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:

```bash theme={null}
curl --request GET \
  --url "https://api.effectiveai.app/api/v2/insurance/osha/300a-summaries?employerId=emp_8356d81fe525d4a7971c&year=2023" \
  --header "Authorization: Bearer $EFFECTIVE_API_KEY"
```

```json Response (first row, abbreviated) theme={null}
{
  "summaries": [
    {
      "id": "4087211",
      "establishmentName": "SUNSHINE ROOFING LLC",
      "establishmentId": "3398120",
      "ein": "591234567",
      "city": "TAMPA",
      "state": "FL",
      "naicsCode": "238160",
      "annualAverageEmployees": 48,
      "totalHoursWorked": 99840,
      "totalDeaths": 1,
      "totalDafwCases": 3,
      "totalDjtrCases": 1,
      "totalOtherCases": 3,
      "totalDafwDays": 70,
      "yearFilingFor": 2023,
      "employerId": "emp_8356d81fe525d4a7971c",
      "siteId": "site_3f9a1c27b4e8d05a6c12",
      "sourceFile": {
        "url": "https://www.osha.gov/sites/default/files/ITA_300A_Summary_Data_2023_through_12-31-2024.zip",
        "sha256": "0a29e52e34a86b14f7dfe13f887d11ef4e253b4bb4b4b6f3332f57480fdb52b5",
        "retrievedAt": "2026-10-13T04:02:17.000Z"
      }
    }
  ],
  "nextCursor": null
}
```

## Read an inspection and its citations

Read an inspection by its activity number:

```bash theme={null}
curl --request GET \
  --url "https://api.effectiveai.app/api/v2/insurance/osha/inspections/1500001" \
  --header "Authorization: Bearer $EFFECTIVE_API_KEY"
```

```json Response (abbreviated) theme={null}
{
  "activityNr": "1500001",
  "estabName": "SUNSHINE ROOFING LLC",
  "siteAddress": "4410 W HILLSBOROUGH AVE",
  "siteCity": "TAMPA",
  "siteState": "FL",
  "siteZip": "33614",
  "naicsCode": "238160",
  "inspType": "M",
  "openDate": "2023-08-01",
  "employerId": "emp_8356d81fe525d4a7971c",
  "siteId": "site_3f9a1c27b4e8d05a6c12",
  "sourceFile": {
    "url": "https://apiprod.dol.gov/v4/get/OSHA/inspection/json",
    "sha256": "f4b00edf87defd5f7aeb657935a859d511cf84de3603e16e3ee84dd5dae0b597",
    "retrievedAt": "2026-10-13T04:02:17.000Z"
  }
}
```

`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:

```bash theme={null}
curl --request GET \
  --url "https://api.effectiveai.app/api/v2/insurance/osha/inspections/1500001/violations" \
  --header "Authorization: Bearer $EFFECTIVE_API_KEY"
```

```json Response (abbreviated) theme={null}
{
  "violations": [
    {
      "activityNr": "1500001",
      "citationId": "01001",
      "standard": "19260503 A01",
      "violType": "S",
      "issuanceDate": "2024-01-26",
      "initialPenalty": 16131,
      "currentPenalty": 11290
    },
    {
      "activityNr": "1500001",
      "citationId": "02001",
      "standard": "19260501 B13",
      "violType": "W",
      "issuanceDate": "2024-01-26",
      "initialPenalty": 161323,
      "currentPenalty": 112926
    }
  ]
}
```

* `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.

```bash theme={null}
curl --request GET \
  --url "https://api.effectiveai.app/api/v2/insurance/osha/search?query=%22fall%20protection%22%20-ladder&employerId=emp_8356d81fe525d4a7971c" \
  --header "Authorization: Bearer $EFFECTIVE_API_KEY"
```

```json Response theme={null}
{
  "results": [
    {
      "resource": "accidents",
      "rowId": "900001",
      "title": "Employee killed in fall from roof",
      "snippet": "Employee #1 was installing shingles on a residential roof without **fall** **protection** and fell about 22 feet to the ground.",
      "date": "2023-07-31",
      "employerId": "emp_8356d81fe525d4a7971c",
      "siteId": "site_3f9a1c27b4e8d05a6c12",
      "path": "/insurance/osha/accidents/900001"
    }
  ],
  "nextCursor": null
}
```

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`:

```bash theme={null}
curl --request GET \
  --url "https://api.effectiveai.app/api/v2/insurance/osha/incidence-rates?naics=2381&state=FL" \
  --header "Authorization: Bearer $EFFECTIVE_API_KEY"
```

```json Response theme={null}
{
  "naics": "2381",
  "state": "FL",
  "minimumEmployers": 10,
  "years": [
    {
      "year": 2025,
      "employers": 412,
      "hours": 61840000,
      "recordableCases": 1218,
      "dartCases": 702,
      "trcRate": 3.94,
      "dartRate": 2.27
    },
    {
      "year": 2024,
      "employers": 398,
      "hours": 59200000,
      "recordableCases": 1196,
      "dartCases": 688,
      "trcRate": 4.04,
      "dartRate": 2.32
    },
    {
      "year": 2023,
      "employers": 385,
      "hours": 57600000,
      "recordableCases": 1172,
      "dartCases": 671,
      "trcRate": 4.07,
      "dartRate": 2.33
    }
  ],
  "dataVersion": "dv_20261015T230438.512Z"
}
```

* `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](/guides/osha-employers#yearly-injury-rates), 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](/guides/osha-employers#what-osha-data-covers).
* [Pagination and recovery](/guides/pagination-and-recovery) explains paging and how to recover from
  errors.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.