# The Restaurant Warehouse Equipment Scraper (`muhammadafzal/the-restaurant-warehouse-equipment-scraper`) Actor

Extract public The Restaurant Warehouse equipment listings: prices, stock, SKUs, variants, images, and descriptions by collection, product, or keyword.

- **URL**: https://apify.com/muhammadafzal/the-restaurant-warehouse-equipment-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 equipment product extracteds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## The Restaurant Warehouse Equipment Scraper

Extract public commercial-kitchen equipment data from [The Restaurant Warehouse](https://therestaurantwarehouse.com/). This Actor returns one structured product record per item, making it useful for price monitoring, catalog research, supplier comparisons, procurement lists, and equipment-market analysis.

It uses The Restaurant Warehouse's public Shopify JSON responses instead of browser automation. That keeps runs light and makes the Actor appropriate for product and collection extraction; it does not log in, add products to a cart, check out, or access customer data.

### What it extracts

| Field | Description |
| --- | --- |
| `title`, `vendor`, `productType` | Product name, brand, and store classification |
| `minPrice`, `maxPrice`, `currency` | Current public variant pricing in USD |
| `available`, `variants` | Availability, SKU, variant options, price, compare-at price, and weight |
| `productUrl`, `imageUrl`, `images` | Canonical product page and product media |
| `description`, `tags` | Plain-text description and public store tags |
| `publishedAt`, `createdAt`, `updatedAt`, `scrapedAt` | Store metadata and extraction timestamp |

The default dataset is intentionally homogeneous: every row is a product. Warnings and totals are saved separately in the `SUMMARY` record of the default key-value store.

### When to use it

Use this Actor when you need current public listings for commercial refrigerators, freezers, fryers, prep tables, ovens, ice machines, or other equipment sold on `therestaurantwarehouse.com`.

Use a collection URL to collect a category. Use a product URL when you need an exact SKU or model. Use a search query to discover up to the first ten matching catalog products, then receive each product's full public JSON details.

Do not use this Actor for Restaurantware (`restaurantware.com`), general web search, historical price data, checkout-only prices, customer reviews, or authenticated inventory information. It is scoped only to The Restaurant Warehouse's public catalog.

### Input

Choose exactly one input mode. If you leave the input object empty, the Actor runs its small health-check default: the first 50 products in the Freezers collection.

#### Collection or product URL

Pass a URL from The Restaurant Warehouse:

```json
{
  "startUrls": [
    { "url": "https://therestaurantwarehouse.com/collections/freezers" }
  ],
  "maxItems": 50,
  "includeDescription": true
}
```

For one product:

```json
{
  "startUrls": [
    { "url": "https://therestaurantwarehouse.com/products/mbf8504gr" }
  ]
}
```

Only `/collections/{handle}` and `/products/{handle}` URLs on `therestaurantwarehouse.com` are accepted. The Actor strips tracking parameters and uses the canonical site host.

#### Catalog keyword search

```json
{
  "searchQuery": "commercial freezer",
  "maxItems": 10,
  "includeDescription": true
}
```

Shopify's public predictive-search endpoint returns at most ten matching products. Use a collection URL when you need a larger category extraction.

`maxItems` is bounded to 1–500, with a default of 50. This cap applies across all supplied URLs and prevents accidentally collecting an unbounded catalog. `includeDescription` defaults to `true`; turn it off when you only need product names, prices, stock, SKUs, and images.

### Output example

```json
{
  "productId": "4873104588859",
  "title": "Atosa MBF8504GR 82-Inch Three Door 71 cu. ft. Commercial Freezer",
  "productUrl": "https://therestaurantwarehouse.com/products/mbf8504gr",
  "sourceUrl": "https://therestaurantwarehouse.com/collections/freezers",
  "vendor": "Atosa",
  "minPrice": 5585,
  "maxPrice": 5585,
  "currency": "USD",
  "available": true,
  "variants": [
    {
      "variantId": "40469203517499",
      "sku": "MBF8504GR",
      "price": 5585,
      "available": true,
      "weight": 430,
      "weightUnit": "lb"
    }
  ],
  "scrapedAt": "2026-08-09T12:00:00.000Z"
}
```

### Reliability and limits

The Actor uses a direct public JSON route first, performs up to two bounded retries for transient failures, limits detail requests to four concurrent requests, and records a separate `SUMMARY` diagnostic. A valid query with no products finishes with a warning and no product rows. If every target request fails, the run fails honestly rather than producing fabricated or diagnostic dataset items.

Catalog fields, availability, prices, endpoint behavior, and search ranking can change without notice. Product availability means the public `available` property has at least one available variant; it is not a delivery promise or a real-time warehouse count. Prices do not include tax, freight, discounts available only during checkout, or financing terms.

### Pricing

This Actor uses one transparent pay-per-event charge: **$0.005 for each successfully saved equipment product record**. A run with the default 50-product cap costs at most $0.25 in product events; the 500-product maximum costs at most $2.50. The Actor shows this maximum before it collects records and stops once your Apify run spending limit is reached. It does not charge for empty results, rejected inputs, failed requests, or run startup. Platform usage is included in the event price rather than passed through separately.

### Compliance

Only collect public catalog information in compliance with the target site's terms, applicable law, and your organization's policies. Do not use this Actor to collect restricted customer data or to bypass access controls.

# Actor input Schema

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

Use this when you know the catalog collection or product to extract. Accepts only therestaurantwarehouse.com product or collection URLs, for example https://therestaurantwarehouse.com/collections/freezers.

## `searchQuery` (type: `string`):

Use this instead of URLs to find matching products by keyword, for example freezer or Atosa griddle. Shopify search returns the first matching products; this is not a full-site crawl.

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

Maximum unique product records to return across all input sources. Use 1–500; the default is 50 to keep runs bounded.

## `includeDescription` (type: `boolean`):

When enabled, include a plain-text product description from individual product responses. Turn it off for faster, smaller results when prices and specifications are enough.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://therestaurantwarehouse.com/collections/freezers"
    }
  ],
  "maxItems": 50,
  "includeDescription": true
}
```

# Actor output Schema

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

All extracted The Restaurant Warehouse product records in JSON, CSV, Excel, and other dataset formats.

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

Run totals, request errors, input mode, and warnings.

# 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://therestaurantwarehouse.com/collections/freezers"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/the-restaurant-warehouse-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 = { "startUrls": [{ "url": "https://therestaurantwarehouse.com/collections/freezers" }] }

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/the-restaurant-warehouse-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 '{
  "startUrls": [
    {
      "url": "https://therestaurantwarehouse.com/collections/freezers"
    }
  ]
}' |
apify call muhammadafzal/the-restaurant-warehouse-equipment-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/the-restaurant-warehouse-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/3e38GBv13gIoJLNvg/builds/bYQDdPFUKlwptwd2d/openapi.json
