# OSHA NRTL Recognized Testing Laboratories Scraper (`tehsnarf/osha-nrtl-recognized-testing-laboratories`) Actor

Scrapes OSHA's official list of Nationally Recognized Testing Laboratories (NRTLs) and each lab's detail page: contact info, docket/recognition links, recognized testing sites, and recognized testing standards.

- **URL**: https://apify.com/tehsnarf/osha-nrtl-recognized-testing-laboratories.md
- **Developed by:** [Chris Hoover](https://apify.com/tehsnarf) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 OSHA NRTL Recognized Testing Laboratories Scraper do?

This Actor scrapes OSHA's official list of **Nationally Recognized Testing Laboratories (NRTLs)** —
the labs OSHA authorizes to test and certify workplace products (electrical equipment, appliances,
fire safety devices, and more) against consensus safety standards. It pulls contact info, docket and
Federal Register recognition links, and each lab's recognized testing sites and testing standards
from the [OSHA NRTL program pages](https://www.osha.gov/nationally-recognized-testing-laboratory-program/current-list-of-nrtls),
normalizing them into a clean, structured dataset. Run it on demand, on a schedule via Apify's
built-in scheduler, or pull results through the API — no browser automation required, since these
pages are static, server-rendered HTML.

### Why use this Actor?

- **Supplier/vendor qualification** — verify a testing lab is currently OSHA-recognized before
  accepting its certification mark on a product.
- **Compliance monitoring** — track changes to a lab's recognized scope (testing sites, testing
  standards) over time by re-running on a schedule.
- **Procurement due diligence** — pull docket numbers and Federal Register recognition links in one
  export instead of checking each lab's page by hand.
- **Research/journalism** — build a reference dataset of the ~20 labs OSHA currently recognizes and
  what each is scoped to test.

### How to use OSHA NRTL Recognized Testing Laboratories Scraper

1. Click **Try for free** (or **Run**) on the Actor page.
2. Leave **Start URLs** as the default (all labs currently on OSHA's list) or replace it with just
   the lab detail pages you care about.
3. Optionally adjust **Max items**, **Delay between requests**, and **Fetch concurrency**.
4. Click **Start** and wait for the run to finish — the full current list (~20 labs) typically
   finishes in under a minute.
5. Open the **Dataset** tab to view, filter, or export results (JSON, CSV, Excel, HTML, and more).

### Input

- **Start URLs** (`startUrls`, required) — NRTL detail-page URLs to scrape. Defaults to all labs
  currently on OSHA's list.
- **Max items** (`maxItems`, default `100`) — cap on total lab pages scraped per run.
- **Delay between requests** (`delaySeconds`, default `1.0`) — polite delay each fetch waits before
  requesting.
- **Fetch concurrency** (`concurrency`, default `5`) — how many detail pages are fetched at once
  (each still waits `delaySeconds` before requesting, so per-request politeness is unchanged).

See the **Input** tab for the full JSON schema.

### Output

Each dataset item is one recognized testing laboratory. Example (abridged):

```json
{
  "labName": "CSA Group Testing and Certification Inc.",
  "detailUrl": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/csa",
  "certMarkImageUrl": "https://www.osha.gov/sites/default/files/2026-03/csa.jpg",
  "certMarkAlt": "Certification Mark for csa",
  "address": "178 Rexdale Boulevard, Etobicoke, Ontario M9W 1R3, Canada",
  "phone": "866-797-4272",
  "fax": "",
  "docketNumber": "OSHA-2006-0042",
  "docketUrl": "https://www.regulations.gov/docket/OSHA-2006-0042",
  "recognitionStatusUrl": "https://www.federalregister.gov/documents/2021/03/05/2021-04556/csa-group-testing-and-certification-inc-grant-of-renewal-of-recognition",
  "websiteUrl": "https://www.csagroup.org/",
  "certificationListingUrl": "https://www.csagroup.org/testing-certification/product-listing/",
  "certificationMarkUrl": "https://www.csagroup.org/testing-certification/marks-labels/",
  "recognizedTestingSites": ["CSA Group, Edmonton, 1707-94th Street, Edmonton, Alberta T6N 1E6, Canada", "..."],
  "recognizedTestingStandards": [
    {"standardNumber": "ANSI/AAMI ES 60601-1", "standardTitle": "Medical Electrical Equipment - Part 1: General Requirements for Basic Safety and Essential Performance"}
  ],
  "scopeNotes": "",
  "scrapedAt": "2026-08-06T20:23:00.000Z"
}
```

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

### Data table

| Field | Description |
|---|---|
| labName | Lab name |
| detailUrl | Full URL of the lab's OSHA NRTL detail page |
| certMarkImageUrl | Certification mark image URL |
| certMarkAlt | Certification mark image alt text |
| address | Headquarters address |
| phone | Phone number, if listed |
| fax | Fax number, if listed |
| docketNumber | OSHA docket number |
| docketUrl | regulations.gov docket URL |
| recognitionStatusUrl | Federal Register recognition/renewal notice link |
| websiteUrl | Lab's own homepage URL, if listed |
| certificationListingUrl | Certification listing website URL, if listed |
| certificationMarkUrl | Certification mark info website URL, if listed |
| recognizedTestingSites | Recognized testing site address blocks |
| recognizedTestingStandards | `{standardNumber, standardTitle}` pairs |
| scopeNotes | Free-text scope note beyond the sites/standards tables, if any |
| scrapedAt | ISO-8601 UTC timestamp of when this row was scraped |

### Pricing / Cost estimation

**How much does it cost to scrape OSHA NRTL data?** This Actor is priced at **$3 per 1,000 results**
(~$0.003/result). Example costs:

| Results | Cost |
|---|---|
| 20 (full current list) | ~$0.06 |
| 100 | ~$0.30 |
| 500 | ~$1.50 |
| 1,000 | ~$3.00 |

Apify's free tier includes monthly platform credit that covers light/occasional use — check your
plan's usage tier on the Apify Console for current limits.

### Tips or advanced options

- Leave **Start URLs** at its default to always pull the full current list; narrow it to specific
  lab slugs (e.g. only `ul` and `csa`) for faster, cheaper targeted runs.
- Raise **Fetch concurrency** for faster full-list runs; lower it (or raise **Delay between
  requests**) if you want an even more conservative crawl footprint.
- Some labs' pages don't list every field (e.g. not every lab has a public fax number, and one
  current lab has no listed docket number) — this is normal, reflecting what OSHA actually publishes
  for that lab, not a scraping error.

### FAQ, disclaimers, and support

This Actor scrapes only public osha.gov pages; no login or private data is involved. It is not
affiliated with or endorsed by OSHA — "NRTL," "OSHA," and related marks belong to their respective
owners. OSHA occasionally adds, removes, or renews labs; re-run this Actor periodically (or on a
schedule) to keep results current. If you hit an issue or need custom fields, use the **Issues** tab
on this Actor's Store page.

# Actor input Schema

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

NRTL detail-page URLs to scrape. Defaults to all labs currently on OSHA's list.

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

Maximum number of lab detail pages to scrape in this run

## `delaySeconds` (type: `number`):

Polite delay each fetch waits before requesting

## `concurrency` (type: `integer`):

How many detail pages to fetch at once (each still waits delaySeconds before requesting)

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/csa"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/csl"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/dekra"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/element"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/fm"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/iapmo"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/its"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/jet"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/lc"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/met"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/nna"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/nsf"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/qai"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/qps"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/sgs"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/solarptl"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/swri"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/tuv"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/tuvam"
    },
    {
      "url": "https://www.osha.gov/nationally-recognized-testing-laboratory-program/ul"
    }
  ],
  "maxItems": 100,
  "delaySeconds": 1,
  "concurrency": 5
}
```

# 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/osha-nrtl-recognized-testing-laboratories").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/osha-nrtl-recognized-testing-laboratories").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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/osha-nrtl-recognized-testing-laboratories --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tehsnarf/osha-nrtl-recognized-testing-laboratories"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ALjrXnMb59ThJukIp/builds/gRgBKKIpGLDW7viRY/openapi.json
