# NFM Product Scraper (`hypebridge/nfm`) Actor

Extracts product listings from Nebraska Furniture Mart-https://www.nfm.com category, search, and sale pages. It can also enrich each product with brand, description, image gallery, GTIN, ratings, and availability from the product page when you enable detail mode.

- **URL**: https://apify.com/hypebridge/nfm.md
- **Developed by:** [Hypebridge](https://apify.com/hypebridge) (community)
- **Categories:** E-commerce, Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 NFM Product Scraper do?

**NFM Product Scraper** extracts product listings from [Nebraska Furniture Mart](https://www.nfm.com) category, search, and sale pages. It can also enrich each product with brand, description, image gallery, GTIN, ratings, and availability from the product page when you enable detail mode.

### Why scrape Nebraska Furniture Mart?

- **Monitor retail pricing**: Track MSRP, current price, and discount percentages across product categories.
- **Build product catalogs**: Collect normalized product IDs, SKUs, UPCs, brand data, and product page URLs.
- **Watch promotions and assortment**: Compare sale pages, category pages, and search-driven subsets over time.

### What data can NFM Product Scraper extract?

| Field | Type | Description |
| --- | --- | --- |
| `url` | String | Product detail URL |
| `sourcePageUrl` | String | Listing page where the product was found |
| `pageType` | String | `category`, `search`, or `sale` |
| `sourceQuery` | String | Search term from the source listing when available |
| `sourceTotalResults` | Number | Total results reported for the source listing |
| `sourcePageSize` | Number | Page size reported for the source listing |
| `pid` | String | NFM product ID |
| `sku` | String | Displayed SKU |
| `name` | String | Product name |
| `msrp` | Number | MSRP or comparison price |
| `salePrice` | Number | Current price |
| `savingsPercent` | Number | Discount percentage |
| `brand` | String | Product brand from detail enrichment |
| `familyCode` | String | NFM family code from PDP analytics data |
| `categoryLevels` | Array | NFM category hierarchy from PDP analytics data |
| `availability` | String | Availability value from the product page |
| `extractedAt` | String | Timestamp when the item was emitted |

The full field list is available in the **Output** tab.

### How to scrape NFM product data

1. Open **NFM Product Scraper** on Apify.
2. Add one or more NFM category, search, or sale URLs to `startUrls`.
3. Set `maxItems` if you want to cap the run.
4. Disable `includeProductDetails` if you only need listing-level data (faster, cheaper).
5. Keep residential proxies enabled for production reliability.
6. Start the run and download results from the **Dataset** tab in JSON, CSV, Excel, or HTML.

### Supported URLs

| Type | Pattern | Example |
| --- | --- | --- |
| Category | `/category-slug` | `https://www.nfm.com/soundbars-and-speakers` |
| Search | `/search?...` | `https://www.nfm.com/search?q=soundbar&sgused=true` |
| Sale | `/sale?...` | `https://www.nfm.com/sale?filter=v_productType_uFilter%3A%22Comforter%22&srule=Recommended&sz=24` |

### Input

Key input fields:

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | Array | required | Category, search, or sale URLs to scrape |
| `maxItems` | Number | `0` | Maximum number of products to emit; `0` means unlimited |
| `includeProductDetails` | Boolean | `true` | Enrich each product using the product detail page |
| `proxyConfiguration` | Object | Residential proxy preset | Proxy settings for production runs |
| `maxConcurrency` | Number | `5` | Number of parallel HTTP workers |
| `debugMode` | Boolean | `false` | Save blocked or malformed HTML to the key-value store |

#### Example input

```json
{
  "startUrls": [
    {
      "url": "https://www.nfm.com/soundbars-and-speakers"
    },
    {
      "url": "https://www.nfm.com/search?q=soundbar&sgused=true"
    }
  ],
  "maxItems": 50,
  "includeProductDetails": true,
  "maxConcurrency": 5,
  "debugMode": false
}
````

### Output

The actor saves one dataset item per product. When detail enrichment is enabled, the output prefers richer values from the product page when available. If a product page fails, the listing record is still emitted so the crawl does not lose that item.

#### Sample output

```json
{
  "url": "https://www.nfm.com/klipsch-12-subwoofer-in-black-52637105/52637105.html",
  "sourcePageUrl": "https://www.nfm.com/soundbars-and-speakers",
  "pageType": "category",
  "sourceQuery": null,
  "sourceTotalResults": 459,
  "sourcePageSize": 24,
  "pid": "52637105",
  "masterId": null,
  "upc": "743878036213",
  "sku": "52637105",
  "name": "Klipsch 12\" Subwoofer in Black",
  "msrp": 399.99,
  "salePrice": 229.99,
  "savingsPercent": 42,
  "priceType": null,
  "tileImageUrl": "https://www.nfm.com/dw/image/v2/BDFM_PRD/on/demandware.static/-/Sites-nfm-master-catalog/default/example.jpg?sw=1000&sh=1000&sm=fit",
  "description": "The Klipsch R-120SW subwoofer is designed to deliver awe-inspiring bass for your movies and music.",
  "brand": "Klipsch",
  "mpn": "R-120SW",
  "gtin12": "743878036213",
  "images": [
    "https://www.nfm.com/dw/image/v2/BDFM_PRD/on/demandware.static/-/Sites-nfm-master-catalog/default/example-1.jpg?sw=1000&sh=1000&sm=fit"
  ],
  "ratingValue": 5,
  "reviewCount": 217,
  "availability": "http://schema.org/InStock",
  "priceCurrency": "USD",
  "familyCode": "ELECTR",
  "categoryLevels": [
    "Home",
    "Electronics",
    "Home Audio",
    "Speakers and Subwoofers"
  ],
  "extractedAt": "2026-04-16T22:30:00Z"
}
```

### Tips

- Keep `maxConcurrency` low. NFM is more stable with a small number of workers than with an aggressive crawl.
- Enable `debugMode` if you are tuning inputs or troubleshooting blocks. Failed HTML snapshots will be stored in the key-value store.
- Use `maxItems` for trial runs before launching large sale-page crawls.

### FAQ

#### Why are residential proxies recommended?

NFM uses anti-bot controls that can become stricter over time. Residential proxies improve reliability on larger runs and reduce the chance of incomplete results.

#### What happens if a product detail page fails?

The actor keeps the listing record and logs the detail failure, so you still get the core product data.

#### Can I scrape sale pages with multiple filters?

Yes. The actor preserves repeated `filter=` query parameters and paginates those URLs without rebuilding them manually.

### Support

- Bugs or feature requests: open an issue in the actor repository.
- Programmatic runs: use the Apify API or schedule the actor from the Apify Console.

> Disclaimer: This actor extracts publicly available product information. Review the target site's terms and applicable laws before running large-scale collection jobs.

# Actor input Schema

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

Category, search, or sale URLs on nfm.com. The actor discovers pagination from the first page of each URL.

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

Maximum number of products to emit. Use 0 for no limit.

## `includeProductDetails` (type: `boolean`):

Fetch each product detail page and enrich records with product copy, brand, images, GTIN, ratings, availability, and PDP price.

## `proxyConfiguration` (type: `object`):

Residential proxy configuration. Recommended for reliable production runs against NFM.

## `maxConcurrency` (type: `integer`):

Parallel HTTP workers. Keep this low to avoid anti-bot escalation.

## `debugMode` (type: `boolean`):

Store blocked or malformed HTML responses in the key-value store and log extra anti-block diagnostics.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.nfm.com/soundbars-and-speakers"
    }
  ],
  "maxItems": 20,
  "includeProductDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "maxConcurrency": 5,
  "debugMode": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Complete dataset with all scraped fields.

## `overview` (type: `string`):

Dataset view with the most useful pricing and product identifiers.

## `files` (type: `string`):

Key-value store entries, including failed HTML captures when debug mode is enabled.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.nfm.com/soundbars-and-speakers"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("hypebridge/nfm").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 = {
    "startUrls": [{ "url": "https://www.nfm.com/soundbars-and-speakers" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("hypebridge/nfm").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 '{
  "startUrls": [
    {
      "url": "https://www.nfm.com/soundbars-and-speakers"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call hypebridge/nfm --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=hypebridge/nfm",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "NFM Product Scraper",
        "description": "Extracts product listings from Nebraska Furniture Mart-https://www.nfm.com category, search, and sale pages. It can also enrich each product with brand, description, image gallery, GTIN, ratings, and availability from the product page when you enable detail mode.",
        "version": "0.0",
        "x-build-id": "Gjh4RaSEhYOrmaaGk"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/hypebridge~nfm/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-hypebridge-nfm",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/hypebridge~nfm/runs": {
            "post": {
                "operationId": "runs-sync-hypebridge-nfm",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/hypebridge~nfm/run-sync": {
            "post": {
                "operationId": "run-sync-hypebridge-nfm",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Category, search, or sale URLs on nfm.com. The actor discovers pagination from the first page of each URL.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of products to emit. Use 0 for no limit.",
                        "default": 20
                    },
                    "includeProductDetails": {
                        "title": "Include product details",
                        "type": "boolean",
                        "description": "Fetch each product detail page and enrich records with product copy, brand, images, GTIN, ratings, availability, and PDP price.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxy configuration. Recommended for reliable production runs against NFM."
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Parallel HTTP workers. Keep this low to avoid anti-bot escalation.",
                        "default": 5
                    },
                    "debugMode": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "Store blocked or malformed HTML responses in the key-value store and log extra anti-block diagnostics.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
