# Industrial Production & Capacity Utilization API — Fed G.17 (`nexgensignal/fed-g17-industrial-production-capacity-observations`) Actor

Federal Reserve G.17 as data: industrial production indexes, capacity and capacity utilization by industry and market group, motor vehicle assemblies and power use, monthly from 1919. Filter by dataset, industry and date. No API key. Part of NexGen Signal — official-source data products

- **URL**: https://apify.com/nexgensignal/fed-g17-industrial-production-capacity-observations.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** News, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 g.17 industrial production observations

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 🏭 Industrial Production & Capacity Utilization API — Fed G.17

Get the Federal Reserve's G.17 Industrial Production and Capacity Utilization as clean records — industrial production indexes by industry and market group, capacity and capacity utilization rates, gross value of products, relative importance weights, motor vehicle assemblies, electric power use and diffusion indexes, monthly back to 1919 — from the Board's official release package.

Economists, manufacturers, investors and analysts use G.17 to follow factory, mining and utility output and how hard capacity is being used. This actor reads the Board's file and delivers one record per value with the dataset and industry spelled out — no XML, no API key.

The unit of output is one observation (one series in one dataset, one date). You pay per observation delivered; a run that finds nothing costs nothing.

### 📊 Sample Output

![Table of Federal Reserve G.17 observations: total industry capacity utilization, monthly, seasonally adjusted.](https://api.apify.com/v2/key-value-stores/IXCaMKjxSmUTLHhmq/records/fed-g17-industrial-production-capacity-observations.png)

| series_name | date | value | dataset | industry |
|---|---|---|---|---|
| CAPUTL.B50001.S | 2026-08-31 | 76.2717 | Capacity Utilization | Total index |
| CAPUTL.B50001.S | 2026-07-31 | 76.3259 | Capacity Utilization | Total index |
| CAPUTL.B50001.S | 2026-06-30 | 76.2438 | Capacity Utilization | Total index |
| CAPUTL.B50001.S | 2026-05-31 | 76.1605 | Capacity Utilization | Total index |
| CAPUTL.B50001.S | 2026-04-30 | 76.1803 | Capacity Utilization | Total index |

Rows from live run `oyVSMojPaDJzVNKHG` on Apify (input: dataset CAPUTL, industries B50001 and GMF, seasonally adjusted, monthly, since 2025). Notice the newest month first and the dataset and industry named on every row (utilization in percent).

### ✅ What you get

Every field of each record:

- `record_id` — unique per observation: release, series code and date (plus the dataset, because the Board repeats some series in several datasets).
- `release_code` — `G.17`.
- `series_name` — the Board's series code, e.g. `CAPUTL.B50001.S`.
- `series_description`, `series_long_description` — the Board's short and long descriptions.
- `dataset_code`, `dataset` — the G.17 dataset, e.g. `CAPUTL` = Capacity Utilization.
- `industry_code`, `industry` — industry or market group, e.g. `B50001` = Total index, `GMF` = Manufacturing (NAICS).
- `seasonal_adjustment_code`, `seasonal_adjustment` — `SA` or `NSA`.
- `frequency` — `Monthly`, `Quarterly` or `Annual` (from the Board's code list).
- `unit`, `unit_multiplier`, `currency` — unit and multiplier from the Board's code lists (e.g. `Currency`, `Millions`), and the currency where one applies.
- `date` — period end date as published (e.g. `2026-06-30` for the second quarter).
- `value` — the observation as a number.
- `observation_status`, `observation_status_label` — `A` normal; `NC`/`ND` not calculable / no data (delivered only with `includeNoData`).
- `release`, `release_prepared` — release name and when the Board prepared the package.
- `source`, `source_dataset`, `licence`, `attribution`, `observed_at` — provenance on every record: the Board and the release, the package file and its last-modified time, the Board's public-domain notice quoted, the citation the Board asks for, and the UTC read time.

### ⚙️ Sample inputs

**1. Store example — industrial production and capacity utilization, total index**

```json
{
  "datasets": ["IP_MAJOR_INDUSTRY_GROUPS", "CAPUTL"],
  "seriesNames": ["IP.B50001.S", "CAPUTL.B50001.S"],
  "maxRecords": 10
}
```

The 10 newest months of the total industrial production index (the first matching series); about $0.50 on the Free plan.

**2. Narrowed — capacity utilization by industry since 2024**

```json
{
  "datasets": ["CAPUTL"],
  "seasonalAdjustment": ["SA"],
  "frequencies": ["monthly"],
  "dateFrom": "2024",
  "maxRecords": 3000
}
```

Every seasonally adjusted monthly utilization rate from January 2024.

**3. Bulk — latest month of every durable-goods production series**

```json
{
  "datasets": ["IP_DURABLE_GOODS_DETAIL"],
  "frequencies": ["monthly"],
  "latestOnly": true,
  "maxRecords": 500
}
```

One record per monthly durable-goods series: its newest month.

Input fields:

| Field | Meaning |
|---|---|
| `seriesNames` | exact Board series codes, e.g. `IP.B50001.S` |
| `seriesNameStartsWith` | series codes starting with any of these, e.g. `CAPUTL.` |
| `descriptionContains` | every word of an entry in the description; quote a phrase to keep it together |
| `datasets` | G.17 dataset ids, e.g. `IP_MAJOR_INDUSTRY_GROUPS`, `CAPUTL`, `CAP`, `RIW`, `MVA`, `KW` |
| `industryCodes` | industry codes, e.g. `B50001`, `GMF`, `G3361T3` |
| `seasonalAdjustment` | `SA`, `NSA` |
| `frequencies` | `monthly`, `quarterly`, `annual` |
| `dateFrom` / `dateTo` | date window |
| `latestOnly` | one record per series |
| `includeNoData` | also deliver not-calculable values |
| `order` | `newest_first` or `oldest_first` |
| `maxRecords` | most observations delivered and billed (default 1,000) |

### 🧾 JSON sample record

```json
{
  "record_id": "G17:CAPUTL:CAPUTL.B50001.S:2026-08-31",
  "release_code": "G.17",
  "series_name": "CAPUTL.B50001.S",
  "series_description": "Total index; s.a. CAPUTL",
  "series_long_description": "Total index; s.a. CAPUTL",
  "dataset_code": "CAPUTL",
  "dataset": "Capacity Utilization",
  "industry_code": "B50001",
  "industry": "Total index",
  "seasonal_adjustment_code": "SA",
  "seasonal_adjustment": "Seasonally adjusted",
  "frequency": "Monthly",
  "unit": "Percentage",
  "unit_multiplier": "One",
  "currency": null,
  "date": "2026-08-31",
  "value": 76.2717,
  "observation_status": "A",
  "observation_status_label": "Normal",
  "release": "G.17 - Industrial Production and Capacity Utilization",
  "release_prepared": "2026-09-16T18:42:44",
  "source": "Board of Governors of the Federal Reserve System — G.17 Industrial Production and Capacity Utilization (statistical release XML package)",
  "source_dataset": "FRB_g17_xml.zip (G17_data.xml), Last-Modified Tue, 22 Sep 2026 23:50:17 GMT",
  "licence": "Public domain. Federal Reserve Board: \"Unless otherwise indicated, information on Board's website is in the public domain and may be copied and distributed without permission. Please cite to the Board as the source of the information.\" (federalreserve.gov/disclaimer.htm)",
  "attribution": "Source: Board of Governors of the Federal Reserve System (US), G.17 Industrial Production and Capacity Utilization",
  "observed_at": "2026-10-04T05:12:33Z"
}
```

### 🔧 How it works

1. **Robots check.** `www.federalreserve.gov/robots.txt` is requested on every run. It answers with an HTML "page not found" (HTTP 404): **no robots policy is published (FLAGGED)**. The actor records that and relies on the Board's public-domain notice; a real robots.txt that disallowed the package would stop the run with nothing charged.

2. **Table of contents first.** The release package `FRB_g17_xml.zip` is a static ZIP on the Board's G.17 release page. The actor reads its table of contents and code lists by byte range, then streams and decompresses the data file as it arrives.

3. **Filter while reading.** Each series is checked against your filters as soon as it starts; only matching series keep their observations.

4. **Deliver, then charge.** Matching observations (newest first by default) are pushed in batches, each charged after delivery, so records and charges always match. Reading stops at `maxRecords` or your maximum charge.

5. **Receipt.** `RUN_RECEIPT` records the robots result, the package and its date, bytes read, series matched, and delivered and charged counts.

No login, API key, proxy or bot workaround — one public Board file, and no personal data in it.

### 💰 Pricing example

Per observation delivered, no start fee, no monthly charge:

| Apify plan | Price per observation |
|---|---|
| Free | $0.05 |
| Bronze | $0.045 |
| Silver | $0.04 |
| Gold, Platinum, Diamond | $0.0335 |

- 10 observations (the Store example): $0.50 on the Free plan, $0.335 on Gold.
- 1,000 observations (the default cap): $50 on Free, $45 on Bronze, $40 on Silver, $33.50 on Gold.

**Coverage and size.** Live count from the package read on 3–4 October 2026 (FRB_g17_xml.zip, 8.6 MB compressed, Last-Modified 22 September 2026; package prepared 16 September 2026 for the 18 September release): **1,075,417 observations in 2,681 series across 14 datasets**, from 1919-01-31 to 2026-08-31; 1,075,410 carry a value and 7 are marked not calculable. The planning index counted 1,075,417 observations across 2,681 series in 14 datasets — they agree. The Board repeats some series in more than one dataset (the total index appears in three), so filter by `datasets` to avoid copies. A filter is required; a whole-file read takes seconds, and a full pull is 1,075,410 valued records, billed per observation.

### ⚖️ Legal & ToS

Data: Board of Governors of the Federal Reserve System, G.17 Industrial Production and Capacity Utilization, from the XML package on the Board's statistical release page. The Board's notice says: "Unless otherwise indicated, information on Board's website is in the public domain and may be copied and distributed without permission. Please cite to the Board as the source of the information." Every record carries that notice in `licence` and a citation in `attribution`.

**Robots FLAG:** `www.federalreserve.gov/robots.txt` returns a 404 page — no robots policy is published. That is recorded on every run and not treated as permission by itself; the public-domain notice governs reuse. One public file, declared User-Agent, no login, key, proxy or form. Aggregate statistics only — no personal data.

**Data Download Program retirement:** the Board is retiring its Data Download Program ("Build Your Package" goes the week of November 9, 2026; the program later). Its notice (16 July 2026) says historical data "will remain available for download as XML files on statistical release pages" — that release-page XML file is exactly what this actor reads, not the Data Download Program. If the Board ever moves or withdraws it, runs end with a source-unavailable message and nothing is charged.

Not affiliated with or endorsed by the Federal Reserve; figures are the Board's as published.

### ❓ FAQ

**Do I need a FRED key or an account?**
No. The actor reads the Board's public release file, which needs no key, login or registration.

**Why must I give a filter?**
The full release is 1,075,417 observations. A filter keeps runs fast and bills only what you asked for; an unfiltered run is refused with a clear message.

**How fresh is the data?**
As fresh as the Board's G.17 package: every record carries the package's prepared time and last-modified date.

**What happens when the Data Download Program retires?**
Nothing for this actor: it already reads the release-page XML file the Board says will remain available.

**Why do I see the same series twice?**
The Board publishes some series in several datasets (major industry groups, market groups, special aggregates). Each record names its dataset; add `datasets` to pick one.

### 🆘 Troubleshooting

- **0 records** — dataset ids are written in capitals with underscores, e.g. `IP_MARKET_GROUPS`.
- **Duplicate series** — add `datasets`.
- **Stopped at maxRecords** — raise `maxRecords` or use `latestOnly`.
- **SOURCE UNAVAILABLE message** — the server did not answer after three tries; nothing was charged — run again later.
- **CAPPED message** — your maximum total charge was reached; raise it in the run options.

### 🔗 Related Actors

- [Sweden Industry Turnover Monthly - SCB](https://apify.com/nexgensignal/se-industry-turnover-month-observations) — monthly industry turnover in Sweden.
- [Eurostat Construction Production — Monthly](https://apify.com/nexgensignal/eurostat-construction-production) — European construction output.
- [Eurostat Business & Consumer Confidence — Monthly](https://apify.com/nexgensignal/eurostat-business-confidence) — business and consumer confidence across Europe.
- [UK Construction Output Monthly - ONS](https://apify.com/nexgensignal/uk-construction-output-observations) — UK construction output.

🏢 **About NexGen Signal** — official-source data products from government and regulator publications. Browse the catalog: [apify.com/nexgensignal](https://apify.com/nexgensignal)

### ⭐ Found this useful?

If this actor saved you time, a rating on its Apify Store page helps other buyers find it.

Part of NexGen Signal — official-source data products.

# Actor input Schema

## `seriesNames` (type: `array`):

Exact Board series codes, e.g. IP.B50001.S (total industrial production index, seasonally adjusted, monthly).

## `seriesNameStartsWith` (type: `array`):

Series whose code starts with any of these, e.g. CAPUTL..

## `descriptionContains` (type: `array`):

Series whose description has every word of an entry, any order; put a phrase in double quotes to keep it together, e.g. "motor vehicles".

## `datasets` (type: `array`):

G.17 datasets, e.g. IP_MAJOR_INDUSTRY_GROUPS, IP_MARKET_GROUPS, CAPUTL (capacity utilization), CAP (capacity), RIW (relative importance weights), MVA (motor vehicle assemblies), KW (electric power use), DIFF (diffusion indexes).

## `industryCodes` (type: `array`):

G.17 industry or market codes, e.g. B50001 total index, GMF manufacturing (NAICS), G3361T3 motor vehicles and parts.

## `seasonalAdjustment` (type: `array`):

SA seasonally adjusted, NSA not seasonally adjusted.

## `frequencies` (type: `array`):

Any of monthly, quarterly, annual. Empty = all.

## `dateFrom` (type: `string`):

Only observations on or after this date (2024-01-01, or a year such as 2024).

## `dateTo` (type: `string`):

Only observations on or before this date (2025-12-31, or a year).

## `latestOnly` (type: `boolean`):

One record per series: its most recent observation in the date window.

## `includeNoData` (type: `boolean`):

Also deliver observations the Board marks no data or not calculable, with a null value.

## `order` (type: `string`):

Observation order within each series.

## `maxRecords` (type: `integer`):

Most observations delivered and billed in this run. One record = one value on one date.

## Actor input object example

```json
{
  "seriesNames": [
    "IP.B50001.S",
    "CAPUTL.B50001.S"
  ],
  "seriesNameStartsWith": [],
  "descriptionContains": [],
  "datasets": [
    "IP_MAJOR_INDUSTRY_GROUPS",
    "CAPUTL"
  ],
  "industryCodes": [],
  "seasonalAdjustment": [],
  "frequencies": [],
  "latestOnly": false,
  "includeNoData": false,
  "order": "newest_first",
  "maxRecords": 10
}
```

# Actor output Schema

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

The delivered (and billed) observations.

## `receipt` (type: `string`):

Package used, series matched, delivered and charged counts.

# 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 = {
    "seriesNames": [
        "IP.B50001.S",
        "CAPUTL.B50001.S"
    ],
    "datasets": [
        "IP_MAJOR_INDUSTRY_GROUPS",
        "CAPUTL"
    ],
    "maxRecords": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/fed-g17-industrial-production-capacity-observations").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 = {
    "seriesNames": [
        "IP.B50001.S",
        "CAPUTL.B50001.S",
    ],
    "datasets": [
        "IP_MAJOR_INDUSTRY_GROUPS",
        "CAPUTL",
    ],
    "maxRecords": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/fed-g17-industrial-production-capacity-observations").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 '{
  "seriesNames": [
    "IP.B50001.S",
    "CAPUTL.B50001.S"
  ],
  "datasets": [
    "IP_MAJOR_INDUSTRY_GROUPS",
    "CAPUTL"
  ],
  "maxRecords": 10
}' |
apify call nexgensignal/fed-g17-industrial-production-capacity-observations --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/fed-g17-industrial-production-capacity-observations"
        }
    }
}
```

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/39pTzkdhHwrNcRbQF/builds/ZauFzliYmdIUz7QXb/openapi.json
