# NIOSH Certified Equipment List Respirator Approvals (`tehsnarf/niosh-certified-equipment-list-respirators`) Actor

Scrapes NIOSH's official Certified Equipment List (CEL) search results and approval detail pages into a normalized export of NIOSH-approved respirators for PPE procurement, industrial hygiene, and counterfeit-verification workflows.

- **URL**: https://apify.com/tehsnarf/niosh-certified-equipment-list-respirators.md
- **Developed by:** [Chris Hoover](https://apify.com/tehsnarf) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does NIOSH Certified Equipment List Respirator Approvals Actor do?

This Actor scrapes the **NIOSH Certified Equipment List (CEL)** — the official CDC/NIOSH database
of approved respirators — at [wwwn.cdc.gov/niosh-cel](https://wwwn.cdc.gov/niosh-cel/). Give it one
or more CEL search URLs (N95, P100, PAPR, or any other filter combination) and it returns a
normalized, per-approval export covering the manufacturer, product line/model, facepiece type,
protection class, approval date, obsolete status, and NIOSH comments for every matching approval —
pulled from both the paginated results table and each approval's detail page. Run it on-demand or
on a schedule via the Apify platform to monitor for newly-added or changed approvals, with full API
access, proxy rotation, and run history included.

### Why use this NIOSH CEL scraper?

- **PPE procurement & sourcing** — verify a respirator model is genuinely NIOSH-approved before
  purchasing, and pull a normalized manufacturer/model list for supplier comparison.
- **Industrial hygiene & compliance teams** — build an internal reference of approved respirators
  by protection class (N95, P100, etc.) without manually paging through CDC's search tool.
- **Counterfeit/fraud checks** — cross-reference a product's claimed approval number against the
  authoritative CEL record, including the "Is the approval obsolete?" flag.
- **Manufacturer monitoring** — track a competitor's or partner's approval portfolio over time by
  re-running on a schedule and diffing results.

### How to use NIOSH Certified Equipment List Respirator Approvals Actor

1. Click **Try for free**.
2. In the **Start URLs** field, add one or more NIOSH-CEL `Results` search URLs — the easiest source
   is the quick-search buttons on the [CEL homepage](https://wwwn.cdc.gov/niosh-cel/) (right-click →
   copy link, or open the search and copy the resulting URL). A few ready-made examples:
   - N95: `https://wwwn.cdc.gov/NIOSH-CEL/Results?facepieceType=Filtering%20Facepiece&contaminants=40`
   - P100: `https://wwwn.cdc.gov/NIOSH-CEL/Results?facepieceType=Filtering%20Facepiece&contaminants=32`
   - PAPRs: `https://wwwn.cdc.gov/NIOSH-CEL/Results?schedule=21C&facepieceType=All`
3. Optionally set `maxItems`, `maxPages`, and `fetchDetails` (see **Input** below).
4. Click **Start** and wait for the run to finish.
5. Download the results from the **Dataset** tab in JSON, CSV, Excel, or HTML.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array (required) | One or more NIOSH-CEL `Results` search URLs. Each entry can set `userData.category` to label which named search it came from. |
| `maxItems` | integer (default 100) | Maximum approval rows to scrape across all start URLs. |
| `maxPages` | integer (default 20) | Maximum paginated result pages followed per start URL. |
| `fetchDetails` | boolean (default true) | Also fetch each approval's detail page for approval date, protection class, obsolete flag, and comments. Disable for a faster/cheaper run limited to results-table fields. |

### Output

```json
{
  "schedule": "84A",
  "approvalNumber": "0006",
  "manufacturerName": "3M Company",
  "manufacturerCode": "MMM",
  "facepieceType": "Filtering Facepiece",
  "productLineOrModel": "1860 and 1860S, Surgical N95 Filtering Facepiece",
  "protectionClass": "N95, Surgical",
  "approvalDate": "8/17/1995",
  "isObsolete": "No",
  "comments": "No exhalation valve, FDA/NIOSH MOU 225-18-006 and granted FDA 510(k) clearance under K955382 on May 1, 1996",
  "approvalDetailUrl": "https://wwwn.cdc.gov/NIOSH-CEL/ApprovalDetails?schedule=84A&approvalNum=0006",
  "sourceCategory": "N95",
  "scrapedAt": "2026-07-11T08:15:06.035063+00:00"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Description |
|---|---|
| schedule | NIOSH approval schedule code (e.g. `84A`, `21C`) |
| approvalNumber | Approval number within the schedule |
| manufacturerName | Manufacturer name as listed |
| manufacturerCode | Manufacturer's short code (e.g. `MMM` for 3M) |
| facepieceType | Respirator facepiece/type (Filtering Facepiece, Half Mask, Hood, etc.) |
| productLineOrModel | Product line / model description |
| protectionClass | Contaminant/protection class (N95, P100, Surgical, etc.) — requires `fetchDetails` |
| approvalDate | Original NIOSH approval date — requires `fetchDetails` |
| isObsolete | Whether NIOSH marks the approval obsolete — requires `fetchDetails` |
| comments | Free-text NIOSH comments (e.g. related FDA clearance notes) — requires `fetchDetails` |
| approvalDetailUrl | Full URL to the approval's detail page |
| sourceCategory | Which named search/category this row came from |
| scrapedAt | ISO-8601 UTC scrape timestamp |

### Pricing

$5.99 per 1,000 results. Example costs: 100 results ≈ $0.60, 500 results ≈ $3.00, 1,000 results ≈
$5.99, 5,000 results ≈ $29.95. Runs with `fetchDetails: false` use fewer requests per item and
finish faster, but the per-result price is the same regardless of that setting.

### Tips or advanced options

- Set `fetchDetails: false` if you only need the results-table fields (schedule, approval number,
  manufacturer, facepiece type, product line) — this skips the per-item detail-page fetch and
  roughly halves the run's request count and runtime.
- Use `userData.category` on each start URL to keep multiple searches (e.g. N95 + P100 + PAPR) apart
  in the output via the `sourceCategory` field.
- `maxPages` is a circuit breaker independent of `maxItems` — raise it only if you intentionally want
  to page deep into a very large result set (e.g. "All FFRs").

### FAQ, disclaimers, and support

This Actor scrapes only publicly-accessible NIOSH/CDC approval and product data — no login is
required and no personal/private data is collected. NIOSH's Certified Equipment List pages are
served with `<meta name="robots" content="index,follow">`. Data accuracy depends on CDC's published
records at scrape time; always confirm against the official CDC source for compliance-critical
decisions. Found a bug or need a custom field/filter? Open an issue in the Actor's **Issues** tab.

# Actor input Schema

## `startUrls` (type: `array`):

NIOSH-CEL 'Results' search URLs to scrape, e.g. the quick-search links on https://wwwn.cdc.gov/niosh-cel/ (N95: ?facepieceType=Filtering%20Facepiece\&contaminants=40, all PAPRs: ?schedule=21C\&facepieceType=All). Optionally set userData.category on each entry to label the source search.

## `maxItems` (type: `integer`):

Maximum number of approval rows to scrape across all start URLs

## `maxPages` (type: `integer`):

Circuit breaker on paginated result pages followed per start URL, independent of maxItems

## `fetchDetails` (type: `boolean`):

Also fetch each approval's detail page for approval date, protection class, obsolete flag, and comments. Doubles requests per item.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://wwwn.cdc.gov/NIOSH-CEL/Results?facepieceType=Filtering%20Facepiece&contaminants=40&pageSize=100",
      "userData": {
        "category": "N95"
      }
    }
  ],
  "maxItems": 100,
  "maxPages": 20,
  "fetchDetails": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("tehsnarf/niosh-certified-equipment-list-respirators").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("tehsnarf/niosh-certified-equipment-list-respirators").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call tehsnarf/niosh-certified-equipment-list-respirators --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=tehsnarf/niosh-certified-equipment-list-respirators",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/TvarrWKd9Cq70eWAE/builds/mMeyjqgDpfMmAiZTx/openapi.json
