# OSHA 300A summaries (published) (https://developers.asip.io/docs/api-reference/osha-300a-summaries)

Certified OSHA 300A annual summaries at your establishments: the establishment totals exactly as frozen into the certified form.

> **Status: Available on request.** API keys, the read-only Data API, the MCP server (with an API key) and signed webhooks are live on app.asip.io. Developer access is off by default for every company: ask ASIP to enable it for yours (https://developers.asip.io/docs/how-to-get-access). One-click OAuth sign-in for AI connectors (claude.ai, ChatGPT, Copilot) is not available yet; use an API key. The changelog at https://developers.asip.io/docs/changelog says when each part becomes available.

## OSHA 300A summaries (published)

`GET https://app.asip.io/api/v1/data/osha-300a-summaries`

Certified OSHA 300A annual summaries at your establishments: the establishment totals exactly as frozen into the certified form. Summaries still being prepared are not returned. A totals value of null means the frozen form could not be read, never zero. Ordered by last modification (updatedAt, then id), oldest first. Oversight roles only: other callers receive 403 `restricted`. MCP query id: `query://asip/osha_300a_summaries`.

**Query parameters**

| Name | Type | Required | Description |
|---|---|---|---|
| `cursor` | string | no | Opaque cursor: pass back `pagination.endCursor` from the previous page unchanged. |
| `limit` | integer (1–200) | no | Page size, 1–200. Default 50. |
| `updatedSince` | string (date-time) | no | Only records whose ordering timestamp is at or after this ISO 8601 date-time. |
| `stationId` | string | no | Restrict to one station in your scope (an id from /api/v1/data/stations). |

**Responses**

| Status | Meaning |
|---|---|
| 200 | One page of records. |
| 400 | A parameter is malformed (`bad_input`). |
| 401 | No valid API key (`unauthenticated`). Only an `asip_pk_` API key is accepted; web sign-in and ASIP Go tokens are refused. |
| 403 | Not available to your role (`restricted`/`forbidden`), or the API key lacks this query's scope (`insufficient_scope`). |
| 404 | Module not enabled, or station not in your scope (`module_disabled`/`not_found`). |
| 429 | Rate limited; see Retry-After. |

**Record fields** (`Osha300aSummary`)

| Field | Type | Description |
|---|---|---|
| `id` | string | Stable ASIP record id. |
| `module` | string | The ASIP module that owns the record (a module key, or "platform"). |
| `url` | string | Deep link to the record in the ASIP app. Requires the viewer to sign in. |
| `stationId` | string | The establishment (station). |
| `departmentId` | string or null |  |
| `coveredYear` | integer |  |
| `status` | string | certified, posted, posting_complete or retained. |
| `certifiedAt` | string (date-time) or null |  |
| `postedFrom` | string or null |  |
| `postedThrough` | string or null |  |
| `totals` | object or null | Null when the frozen form could not be read — never zero. |
| `caseCount` | integer or null |  |
| `annualAverageEmployees` | number or null |  |
| `totalHoursWorked` | number or null |  |
| `figuresVerified` | boolean |  |
| `updatedAt` | string (date-time) |  |

## OSHA 300A summaries (published) — change feed

`GET https://app.asip.io/api/v1/data/osha-300a-summaries/feed`

Certified OSHA 300A annual summaries at your establishments: the establishment totals exactly as frozen into the certified form. Summaries still being prepared are not returned. A totals value of null means the frozen form could not be read, never zero. Ordered by last modification (updatedAt, then id), oldest first. Oversight roles only: other callers receive 403 `restricted`. The feed stops 30 seconds behind the current time, so a record appears on it about 30 seconds after it is written; this keeps a slow write from being skipped. MCP query id: `query://asip/osha_300a_summaries`.

**Query parameters**

| Name | Type | Required | Description |
|---|---|---|---|
| `cursor` | string | no | Opaque cursor: pass back `pagination.endCursor` from the previous page unchanged. |
| `limit` | integer (1–200) | no | Page size, 1–200. Default 50. |
| `updatedSince` | string (date-time) | no | Only records whose ordering timestamp is at or after this ISO 8601 date-time. |

**Responses**

| Status | Meaning |
|---|---|
| 200 | One page of records. |
| 400 | A parameter is malformed (`bad_input`). |
| 401 | No valid API key (`unauthenticated`). Only an `asip_pk_` API key is accepted; web sign-in and ASIP Go tokens are refused. |
| 403 | Not available to your role (`restricted`/`forbidden`), or the API key lacks this query's scope (`insufficient_scope`). |
| 404 | Module not enabled, or station not in your scope (`module_disabled`/`not_found`). |
| 429 | Rate limited; see Retry-After. |
