# DOE Certified Appliances & Equipment Scraper - CCMS (`rel8ble/doe-certified-equipment-scraper`) Actor

DOE Compliance Certification Database (CCMS) scraper: US-certified models of compressors, pumps, transformers, HVAC, water heaters and 70+ more groups. One result = one model: brand, model numbers, every certified rating. Supplier mode. $0.50 per 1,000, no start fee.

- **URL**: https://apify.com/rel8ble/doe-certified-equipment-scraper.md
- **Developed by:** [Giovanni Rich](https://apify.com/rel8ble) (community)
- **Categories:** Business, E-commerce, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## DOE Certified Appliances & Equipment Scraper - CCMS

This **DOE Compliance Certification Database scraper** (CCMS) gives you every model a manufacturer has certified to the US Department of Energy, as clean rows: pick a product group such as **air compressors, pumps, distribution transformers, walk-in coolers, commercial refrigeration, water heaters, boilers or HVAC**, and get **brand, basic model number, individual model numbers, equipment class and every certified rating** (flow, horsepower, efficiency, capacity, energy use, kVA ...).

Use it as a **US equipment supplier list** (one row per brand with its model count), a **model-number lookup API**, a **spec and efficiency database** for product comparison, or a **competitor catalogue** of who sells which models into the US, from your own code, Make, Zapier, n8n or an AI agent.

It reads the public CCMS search service at regulations.doe.gov over plain HTTP, with **no browser and no login**. The prefilled demo returns 20 air compressor models (1.9 s locally and 4.5 s in an Apify cloud run on 8 November 2026). **$0.50 per 1,000 results, no start fee.**

**What goes in:** product groups (73 to choose from), optional search words or model numbers, optional brand names. **What comes out:** one row per certified model, or one row per brand with a switch. **When to use it:** you need to know which brands sell a type of regulated equipment in the US, which models they certified, and the ratings they reported.

**What it does not have:** **no prices, no minimum order quantities, no e-mails, no phone numbers and no manufacturer addresses.** CCMS stores the brand name, not the legal manufacturer. It is a certification record, not a catalogue.

### What you get

- **Product**: product group, product type, equipment class (e.g. "Rotary, Lubricated, Air-Cooled, Fixed-Speed Compressor").
- **Brand and models**: brand name, basic model number, individual model numbers covered by it.
- **Ratings**: every certified value of the model in `specs`, with readable names, e.g. "Full Load Actual Volume Flow Rate (CFM)": 1041.7, "Compressor Motor Nominal Horsepower (hp)": 177. Fields differ per product group.
- **Compliance flags**: test-procedure waiver, exception relief, link to the FTC EnergyGuide label when filed.
- **Brand mode**: one row per brand in a group with its number of certified records, e.g. Pumps: Grundfos 17,900, Armstrong 1,316, EBARA 1,166, Goulds Water Technology - Xylem 984, Bell & Gossett - Xylem 853 (75 pump brands, run 8 November 2026).

Size of the database on 8 November 2026: 4,714,625 certified records in 73 product groups, for example Air Conditioners and Heat Pumps - Central 3,764,692, Faucets 120,304, Distribution Transformers - Liquid-Immersed 43,204, Pumps 27,848, Walk-In Cooler refrigeration systems 24,002, Compressors 11,431.

### Sample output

Real rows from the prefilled run (Compressors, 8 November 2026), a few fields:

| brand | basic model | class | flow (CFM) | motor (hp) | pressure (psig) |
|---|---|---|---|---|---|
| Atlas Copco | GA132A3 AIR ENREC 60HZ HDFIL 2025 460V-3PH APF 5.2BAR | Rotary, Lubricated, Air-Cooled, Fixed-Speed | 1041.7 | 177 | 75 |
| Atlas Copco | GA110A3 AIR ENREC 60HZ HDFIL 2025 460V-3PH APF 5.2BAR | Rotary, Lubricated, Air-Cooled, Fixed-Speed | 879.6 | 148 | 75 |
| Atlas Copco | GA90PA3 WATER FFDRY 60HZ HDFIL 2025 460V-3PH APF 5.2BAR | Rotary, Lubricated, Liquid-Cooled, Fixed-Speed | 653.6 | 121 | 75 |

### Use cases

- **Supplier sourcing**: list every brand certifying compressors, pumps, transformers, commercial fridges or boilers in the US, with model counts
- **Spec comparison**: pull ratings of all models in a class and sort by efficiency, capacity or energy use
- **Model-number lookup**: check that a model is certified and what it reported
- **Competitor tracking**: see which models a rival brand certified, and run it again later to catch new ones
- **Lead generation for suppliers to these industries**: brands active in a product group (company data only)

### Pricing

**$0.50 per 1,000 results** (pay per result, $0.0005 each), no start fee, platform usage included. A result is one row saved to your dataset. Searches that find nothing, duplicates and failed requests are never charged. Set **Max results per search** to cap the cost of a run.

The data is public. You pay for the ready rows, the filters and the clean field names, not for access.

No other Apify Store actor for the DOE Compliance Certification Database turned up in a live Store search on 8 November 2026 (`regulations.doe.gov`, `department of energy`, `appliance efficiency`, `hvac certified models`, `distribution transformer`) or again on 9 November 2026 (`doe`, `ccms`, `doe certified`, `appliance models`, `energy efficiency`, `hvac equipment`). The nearest are ENERGY STAR actors, which cover a different, voluntary programme: pankajbhatia $0.30 per 1,000 + a start fee, nexgensignal $50 per 1,000 (1 user each in 30 days), and our own [ENERGY STAR Certified Products Scraper](https://apify.com/rel8ble/energy-star-products-scraper) at $0.29. Prices change; check before you compare.

### FAQ

**Where does the data come from?** From the Compliance Certification Database of the US Department of Energy (regulations.doe.gov/certification-data), the same records as its public search. DOE says the data are the representations certified by manufacturers, provided as is, and that a listing is not a DOE finding that the model complies. This actor is not affiliated with or endorsed by DOE.

**How fresh is it?** As fresh as CCMS, which DOE reloads regularly. Only current certified records are in it, no history.

**Does it include the manufacturer's name or contacts?** No. CCMS shows the brand name. Use brand mode to get the list of brands, then look up the companies.

**Why do some groups have millions of rows?** Central air conditioners and heat pumps are certified per indoor/outdoor combination. Use a search term (a model prefix) or a brand to narrow them, and set **Max results per search**.

**How do search terms work?** A term is matched anywhere in the record (brand, model numbers, class), case-insensitive, including parts of words: `GA11` finds GA110 models.

**How do brand words work?** The actor reads the brand list of the chosen groups and keeps every brand that contains your word: `xylem` gives "Goulds Water Technology - Xylem" and "Bell & Gossett - Xylem". Words that match no brand are reported in the run summary and cost nothing.

**Are there limits?** The actor sends one request at a time, 200 records each, with a declared user agent. Runs of tens of thousands of rows take a few minutes. Runs above about 50,000 rows were not tested.

**Known gaps**: brand, not legal manufacturer; field names and units come from DOE templates and differ per group; individual model numbers may hold the maker's own wildcards (`*`, `#`); no prices or availability.

### How to use

1. Open the actor and pick one or more **Product groups**, e.g. `Compressors`.
2. Optional: add **Search terms or model numbers** and **Brands**.
3. Turn on **One row per brand** if you want a supplier list instead of models.
4. Set **Max results per search** (start with 20) and click **Start**. Export as CSV, Excel or JSON.

### Input

| Field | What it does |
|---|---|
| `productGroups` | DOE product groups (73). Empty = all groups (then give a term or brand). |
| `searchTerms` | Words or model numbers matched anywhere in the record; each runs as its own search per group. |
| `brands` | Brand words, case-insensitive; matched to the certified brand names. |
| `uniqueBrands` | One row per brand with its number of certified records. |
| `maxResultsPerSearch` | Rows per group x term; 0 = all. |

### Input example

```json
{
    "productGroups": ["Pumps - General Pumps", "Compressors"],
    "brands": ["grundfos", "atlas copco"],
    "maxResultsPerSearch": 500
}
```

### Output example

One real row from the prefilled run (8 November 2026):

```json
{
    "productGroup": "Compressors",
    "productType": "Compressors",
    "productClass": "Rotary, Lubricated, Air-Cooled, Fixed-Speed Compressor",
    "brand": "Atlas Copco",
    "basicModelNumber": "GA132A3 AIR ENREC 60HZ HDFIL 2025 460V-3PH APF 5.2BAR",
    "individualModelNumbers": [],
    "specs": {
        "Full Load Package Isentropic Efficiency If Applicable": 0.823,
        "Full Load Actual Volume Flow Rate (CFM)": 1041.7,
        "Compressor Motor Nominal Horsepower (hp)": 177,
        "Full Load Operating Pressure (psig)": 75,
        "Maximum Full Flow Operating Pressure (psig)": 80,
        "Pressure Ratio at Full Load Operating Pressure": 6.2
    },
    "testProcedureWaiver": false,
    "exceptionRelief": false,
    "energyGuideLabelUrl": null,
    "templateVersion": "5.1",
    "recordId": "834045402369",
    "productGroupUrl": "https://www.regulations.doe.gov/certification-data/CCMS-4-Compressors.html",
    "brandModelCount": null,
    "searchTerm": null,
    "position": 1,
    "scrapedAt": "2026-11-08T18:49:53.928Z"
}
```

A run summary (`RUN_SUMMARY` in the key-value store) lists rows per search, stop reasons and ignored input.

### Integrations

Run it from the Apify API, the JavaScript or Python client, Make, Zapier, n8n, Google Sheets, or as a tool for AI agents through the Apify MCP server. Schedule it to track new certifications.

Need a custom scraper or a ready dataset? Hire me on Fiverr: https://www.fiverr.com/rel8ble

# Actor input Schema

## `productGroups` (type: `array`):

DOE product groups to read, e.g. Compressors, Pumps, Distribution Transformers, Walk-In Coolers, Commercial Refrigeration, Water Heaters. Leave empty to search all groups (then give a search term or brand).

## `searchTerms` (type: `array`):

Words or model numbers matched anywhere in the record (brand, model number, class), case-insensitive, e.g. "GA11" or "variable speed". Each term runs as its own search in each product group. Optional.

## `brands` (type: `array`):

Brand names or parts of them, case-insensitive, e.g. "Atlas Copco", "Grundfos". Matched against the certified brand list of the chosen groups; words that match no brand are reported, not charged. Optional.

## `uniqueBrands` (type: `boolean`):

Instead of models, return each brand that certifies in the group with its number of certified records. Fast way to list every supplier of a product type.

## `maxResultsPerSearch` (type: `integer`):

Rows per product group x search term. 0 = everything that matches (some groups hold millions of records).

## `maxRequestRetries` (type: `integer`):

Retries when the database does not answer.

## Actor input object example

```json
{
  "productGroups": [
    "Compressors"
  ],
  "uniqueBrands": false,
  "maxResultsPerSearch": 20,
  "maxRequestRetries": 5
}
```

# Actor output Schema

## `models` (type: `string`):

One row per DOE-certified model (or per brand in brand mode): product group, brand, model numbers and every certified rating.

## `summary` (type: `string`):

Counts per search, stop reasons and any ignored input.

# 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 = {
    "productGroups": [
        "Compressors"
    ],
    "maxResultsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/doe-certified-equipment-scraper").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 = {
    "productGroups": ["Compressors"],
    "maxResultsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("rel8ble/doe-certified-equipment-scraper").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 '{
  "productGroups": [
    "Compressors"
  ],
  "maxResultsPerSearch": 20
}' |
apify call rel8ble/doe-certified-equipment-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rel8ble/doe-certified-equipment-scraper"
        }
    }
}
```

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/4scXwJjkBHFJ9azLe/builds/mR5LlZHBNUfjV2Nkt/openapi.json
