# Zoro Listings Scraper (`piotrv1001/zoro-listings-scraper`) Actor

The Zoro Product Listings Scraper extracts products from Zoro.com's 13M-SKU industrial and MRO catalog by search term or category, capturing titles, brands, MFR numbers, prices, 20+ technical specs, images and stock flags — ideal for price monitoring and catalog enrichment.

- **URL**: https://apify.com/piotrv1001/zoro-listings-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 products

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

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

### 🔩 Zoro Product Listings Scraper

Extract product listings from **Zoro.com**, the US industrial and MRO supplier with over 13 million SKUs. The **Zoro Product Listings Scraper** turns any Zoro search phrase or category into a clean, structured product feed — complete with prices, brands, manufacturer numbers, full technical specifications, images and stock status.

Ideal for **price monitoring, competitive analysis, catalog enrichment, procurement research and MRO market intelligence**.

### ✨ Features

- 🏷️ **Complete Product Data**: Title, brand, manufacturer part number, Zoro item number, price, price unit, pack quantity, images and category path.
- 📐 **Full Technical Specs**: Every listed attribute — material, dimensions, voltage, country of origin, standards and more. Typically **20+ specifications per product**.
- 🔍 **Search or Browse**: Feed it plain search phrases like `nitrile gloves`, or paste any Zoro category URL.
- 📦 **Stock & Fulfillment Signals**: In-stock flag, lead time, discontinued status, drop-ship and freight-only flags, and state shipping restrictions.
- ⭐ **Optional Ratings & UPC**: Turn on one switch to add star ratings, review counts and UPC codes.
- ⚡ **Fast & Efficient**: 36 products per request, no browser overhead — thousands of products in minutes.

### 🛠️ How It Works

1. **Enter search terms** – Add phrases such as `cordless drill` or `safety glasses`. Descriptive two- or three-word phrases work best.
2. **Or paste category URLs** – Grab any category page from Zoro, for example `https://www.zoro.com/wrenches/c/4403/`.
3. **Set a product limit** – Choose how many products you want. Start small to preview the data.
4. **Run the scraper** – Results stream into your dataset, ready to download as JSON, CSV, Excel or XML, or to pull via the Apify API.

### 📥 Input

| Field | Type | Description |
| --- | --- | --- |
| `searchTerms` | array | Product phrases to look up, e.g. `["nitrile gloves", "cordless drill"]` |
| `startUrls` | array | Zoro category (`/c/`) or keyword (`/k/`) listing URLs |
| `maxItems` | integer | Maximum number of products to return (default `50`) |
| `includeReviews` | boolean | Also fetch star rating, review count and UPC (default `false`) |
| `proxyConfiguration` | object | Proxy settings — US residential is required and preselected |

```json
{
    "searchTerms": ["cordless drill"],
    "maxItems": 50,
    "includeReviews": false
}
````

### 📊 Sample Output Data

```json
[
    {
        "zoroNo": "G8579697",
        "url": "https://www.zoro.com/dewalt-12-in-20v-dc-cordless-drill-kit-battery-included-dcd771c2/i/G8579697/",
        "title": "1/2 in, 20V DC Cordless Drill Kit, Battery Included",
        "brand": "Dewalt",
        "mfrNo": "DCD771C2",
        "price": 179,
        "originalPrice": null,
        "priceUnit": "EA",
        "minOrderQty": 1,
        "packageQty": 1,
        "inStock": true,
        "isDiscontinued": false,
        "leadTimeDays": 1,
        "salesStatus": "ST",
        "isDropShipDirect": false,
        "isFreightOnly": false,
        "restrictedStates": [],
        "categoryPath": ["Tools & Machining", "Power Tools and Accessories", "Cordless Tools", "Cordless Drills"],
        "categoryId": "5861",
        "images": [
            "https://www.zoro.com/static/cms/product/large/Z0qOGyjcpEx_.JPG",
            "https://www.zoro.com/static/cms/product/large/Grainger_DCD771C2xx2xx1d15c0.jpeg"
        ],
        "attributes": {
            "Item": "Drill Kit",
            "Voltage": "20 V DC",
            "Chuck Size": "1/2 in",
            "Brushless Motor": "Yes",
            "Max. Torque": "300 in-lb",
            "Tool Weight": "4.7 lb",
            "Country of Origin (subject to change)": "China"
        },
        "rating": 4.7,
        "reviewCount": 312,
        "upc": "885911475259"
    }
]
```

`rating`, `reviewCount` and `upc` are `null` unless **Include ratings and reviews** is enabled.

### 📋 Data Fields

| Field | Description |
| --- | --- |
| `zoroNo` | Zoro item number |
| `url` | Direct link to the product page |
| `title` | Product title |
| `brand` | Brand name |
| `mfrNo` | Manufacturer part number |
| `price` / `originalPrice` | Current price and list price before discount |
| `priceUnit` | Unit the price applies to (`EA`, `PK`, `CS`, …) |
| `minOrderQty` / `packageQty` | Minimum order quantity and units per package |
| `inStock` / `isDiscontinued` | Availability flags |
| `leadTimeDays` / `salesStatus` | Shipping lead time and sales status code |
| `isDropShipDirect` / `isFreightOnly` | Fulfillment method flags |
| `restrictedStates` | US states the item cannot ship to |
| `categoryPath` / `categoryId` | Full category breadcrumb and leaf category ID |
| `images` | Full-size product image URLs |
| `attributes` | All technical specifications as key–value pairs |
| `rating` / `reviewCount` / `upc` | Star rating, review count and UPC (optional) |

### 💰 How much does it cost to scrape Zoro?

This Actor uses **pay per event** pricing — you pay for the data you get, not for compute time.

| Event | Price |
| --- | --- |
| Actor start | $0.005 |
| Product | $0.004 |
| Enriched product (adds rating, review count and UPC) | $0.008 |

**1,000 products cost about $4.** With ratings and UPC enabled, about $8. A 50-product test run costs roughly 20 cents. The Apify Free plan includes $5 of monthly usage, enough for a first look at the data.

### 💡 Tips

- **Descriptive phrases beat single words.** `nitrile gloves` returns results, `gloves` may not. If a phrase returns nothing, the scraper automatically retries the singular or plural form.
- **Category URLs give the most complete coverage.** Browse to a category on Zoro and copy the URL from the address bar.
- **Set `maxItems` deliberately.** Some categories hold tens of thousands of products; the limit is what keeps a run predictable and cheap.
- **A single query reaches about 9,900 products.** For bigger hauls, run narrower subcategories — the scraper splits oversized categories automatically when your limit calls for it.
- **Duplicates are removed** across every search term and category in a single run.

### ❓ FAQ

**Do I need a Zoro account?**
No. All prices returned are the standard guest prices shown to any visitor.

**Can I scrape the whole 13-million-product catalog?**
Technically yes, but it would be slow and expensive. This Actor is built for targeted category, brand and keyword slices, which is what price monitoring and catalog work actually need.

**Why does a search term return no results?**
Zoro serves landing pages for a curated set of phrases. If your phrase has no page, try a more standard product term — `hex key set` instead of `allen wrench kit`.

**Is scraping Zoro legal?**
This Actor only collects publicly available product information — no personal data and no login-protected content. Scraping public data is generally legal, but you are responsible for how you use the results, including compliance with Zoro's Terms of Service and applicable law. Consult a lawyer if you are unsure.

### 🆘 Support

Found a bug or need a field that is not extracted yet? Open an issue on the **Issues** tab and it will be looked at. Custom scraping solutions are available on request.

Start extracting Zoro product data today! 🚀

# Actor input Schema

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

Product phrases to look up on Zoro, for example `nitrile gloves` or `cordless drill`. Descriptive two- or three-word phrases return the best results.

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

Zoro category (`/c/`) or keyword (`/k/`) listing URLs to scrape, for example `https://www.zoro.com/wrenches/c/4403/`.

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

Stop after this many products. Keep it low for a quick test run.

## `includeReviews` (type: `boolean`):

Also fetch the star rating, review count and UPC for every product. Makes the run slower.

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

Zoro requires US residential proxies. Leave the default unless you know what you are doing.

## Actor input object example

```json
{
  "searchTerms": [
    "cordless drill"
  ],
  "startUrls": [
    {
      "url": "https://www.zoro.com/wrenches/c/4403/"
    }
  ],
  "maxItems": 50,
  "includeReviews": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "searchTerms": [
        "cordless drill"
    ],
    "startUrls": [
        {
            "url": "https://www.zoro.com/wrenches/c/4403/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/zoro-listings-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 = {
    "searchTerms": ["cordless drill"],
    "startUrls": [{ "url": "https://www.zoro.com/wrenches/c/4403/" }],
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/zoro-listings-scraper").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 '{
  "searchTerms": [
    "cordless drill"
  ],
  "startUrls": [
    {
      "url": "https://www.zoro.com/wrenches/c/4403/"
    }
  ]
}' |
apify call piotrv1001/zoro-listings-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Zoro Listings Scraper",
        "description": "The Zoro Product Listings Scraper extracts products from Zoro.com's 13M-SKU industrial and MRO catalog by search term or category, capturing titles, brands, MFR numbers, prices, 20+ technical specs, images and stock flags — ideal for price monitoring and catalog enrichment.",
        "version": "0.0",
        "x-build-id": "BsxpyoJ5z3eixpgur"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/piotrv1001~zoro-listings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-piotrv1001-zoro-listings-scraper",
                "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/piotrv1001~zoro-listings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-piotrv1001-zoro-listings-scraper",
                "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/piotrv1001~zoro-listings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-piotrv1001-zoro-listings-scraper",
                "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",
                "properties": {
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Product phrases to look up on Zoro, for example `nitrile gloves` or `cordless drill`. Descriptive two- or three-word phrases return the best results.",
                        "default": [
                            "cordless drill"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Category or listing URLs",
                        "type": "array",
                        "description": "Zoro category (`/c/`) or keyword (`/k/`) listing URLs to scrape, for example `https://www.zoro.com/wrenches/c/4403/`.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Maximum products",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Stop after this many products. Keep it low for a quick test run.",
                        "default": 50
                    },
                    "includeReviews": {
                        "title": "Include ratings and reviews",
                        "type": "boolean",
                        "description": "Also fetch the star rating, review count and UPC for every product. Makes the run slower.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Zoro requires US residential proxies. Leave the default unless you know what you are doing.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
