# Harbor Freight Scraper: Prices, Deals, Coupons & Store Stock (`alduinxx/harbor-freight-scraper`) Actor

Harbor Freight prices, sales, clearance and Inside Track Club member deals, plus the competitor price Harbor Freight compares each product to (DEWALT, Milwaukee, Husky…). Online stock, and shelf stock at the store nearest a ZIP code. Whole catalogue, departments or SKUs.

- **URL**: https://apify.com/alduinxx/harbor-freight-scraper.md
- **Developed by:** [Michael Hill](https://apify.com/alduinxx) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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/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

Every **Harbor Freight** product with its price, its sale and **Inside Track Club member deals**, the **competitor price Harbor Freight compares it to**, online stock, and (with a ZIP code) **shelf stock at the nearest store**. One row per product, about 5,000 products in the whole catalogue.

### Why this one

| | This Actor |
|---|---|
| Price and regular price | ✅ `price`, `regularPrice`, `onSale` |
| Instant savings, clearance and "new lower price", with end dates | ✅ `saleType`, `saleEndDate`, `saleSavings` |
| Inside Track Club member price, coupon code, limit and expiry | ✅ `memberPrice`, `memberCouponCode`, `memberDealLimit`, `memberDealEnds` |
| The competitor product and price Harbor Freight compares itself to | ✅ `competitorBrand`, `competitorModel`, `competitorPrice`, `savingsVsCompetitor` |
| Online stock quantity | ✅ `onlineQuantity` |
| Shelf stock at the store nearest a ZIP code | ✅ `storeStock` (in stock, limited, out of stock…) and the store's address |
| Whole catalogue, departments, search terms, a list of SKUs, or deals only | ✅ |

**The compare-to prices are the unusual part.** On almost every product page Harbor Freight prints a line like "Compare to DEWALT DWE6423 at $99, save 39%". This Actor returns that comparison as data: the competitor's brand, model number, price and the savings Harbor Freight claims. On 4 Oct 2026, 3,879 of the 5,005 products carried one.

### What you get

One real row (item 70971, run with ZIP 90210 on 4 Oct 2026):

| Field | Example |
|---|---|
| `sku` | 70971: Harbor Freight's item number |
| `name`, `brand` | 1467 lb. Capacity, 2 in. x 20 ft. E-Track Ratcheting Tie-Down · HAUL-MASTER |
| `department`, `category`, `categoryPath` | Automotive · Ratcheting Tie Downs · automotive/trailers-towing/straps-nets-tie-downs/ratcheting-tie-downs |
| `collections` | \["Instant Savings", "Inside Track Club Deals", "Deal Of The Day", …]: collections and promotions the product is listed in |
| `url`, `imageUrl` | the product page and its image |
| `price`, `regularPrice`, `onSale` | 9.99 · 11.99 · true |
| `saleType`, `saleEndDate`, `saleSavings` | Instant savings · 2026-10-08 · 16% (also "Clearance" and "New lower price") |
| `memberPrice`, `memberSavings`, `memberDealEnds`, `memberDealLimit`, `memberCouponCode` | 7.99 · 20% · 2026-10-29 · 4 · 28288549 |
| `couponPrice`, `couponSavings`, `couponEnds`, `couponLimit`, `couponCode` | the same for public coupons, when Harbor Freight runs them (empty here) |
| `competitorBrand`, `competitorModel`, `competitorPrice`, `savingsVsCompetitor` | SNAP-LOC · SLTE220RR · 21.29 · 53% |
| `pricePoint` | Mid Price Point (MPP): Harbor Freight's opening, mid or high tier |
| `onlineOnly`, `inStoreOnly`, `isPart` | false · true · false |
| `onlineQuantity` | 9580: units in Harbor Freight's online inventory |
| `storeNumber`, `storeName`, `storeAddress`, `storeCity`, `storeState`, `storeZip`, `storeDistanceMiles` | 374 · North Hollywood, CA · 6020 Lankershim Blvd · North Hollywood · CA · 91606 · 5.6 |
| `storeStock`, `storeStockCode`, `storeStockUpdatedAt` | Limited stock · LS · 2026-10-04 19:17:07 |
| `scrapedAt` | 2026-10-05T02:30:23.404Z |

Every row has every key; values Harbor Freight does not publish for a product come back empty rather than missing.

### What people use it for

- **Deal tracking**: every sale, clearance markdown and member deal, with its end date, in one run
- **Competitive pricing**: Harbor Freight's own price comparisons against DEWALT, Milwaukee, Husky, Snap-on and others, product by product
- **Brands and suppliers**: how a brand is priced and positioned against Harbor Freight's house brands
- **Stock checks**: whether a product is on the shelf at a given store before driving there, or across a list of SKUs

### How to use it

1. Leave everything empty for the **whole catalogue**, or narrow it with **Search terms** (e.g. `sander`, `air compressor`, `pittsburgh`) and **Departments**.
2. Or put item numbers or product URLs in **SKUs** to check exactly those products.
3. Tick **Deals only** to get just the products on sale, on clearance or with a member deal.
4. Add a **ZIP code** for shelf stock at the nearest store.
5. Set **Maximum products** and run it.

#### Input examples

```json
{
    "searchTerms": ["air compressor"],
    "zipCode": "90210",
    "maxProducts": 50
}
```

```json
{
    "dealsOnly": true,
    "maxProducts": 1000
}
```

```json
{
    "skus": ["56458", "62903", "https://www.harborfreight.com/14-in-straight-air-die-grinder-70733.html"],
    "zipCode": "02108"
}
```

### Notes

- **Prices are national.** Harbor Freight charges the same price online and in its stores, so there is no store to choose for pricing. The ZIP code only adds shelf stock.
- **Which store.** With a ZIP code, shelf stock comes from the open store nearest to it, within 50 miles; with none that close, the store columns stay empty and the log says so.
- **Member deals are not in `price`.** `price` is what everyone pays; `memberPrice` needs an Inside Track Club membership and is limited to `memberDealLimit` units.
- **Shelf stock codes** are Harbor Freight's own: IS in stock, LS limited stock, NS out of stock ("back in stock soon"), PS not stocked at that store (order for free in-store pickup), DI unavailable. Online-only products have none.
- **Departments** are Harbor Freight's own listings, the same products as its department pages, so a product can be listed in more than one: on 5 Oct 2026 Air Tools & Compressors listed 378 products, 324 of them with it as their main department. `department` gives the main one.
- **Search terms** match whole words (and plurals) in the product name and brand, so `sander` finds "Belt Sanders" but not "Sanding Discs".
- **In-store-only products** (`inStoreOnly`) are flagged by Harbor Freight as sold in its stores only; they can still show an `onlineQuantity`.
- **Savings labels** are given as Harbor Freight prints them: a percentage ("39%") or an amount ("$30").
- **Speed.** The site is behind bot protection, so requests go through Apify's Unblocker proxy, 200 products per request. The whole catalogue takes about three minutes; a department or a list of SKUs, well under one.

### Pricing

**$3.00 per 1,000 products returned**, and nothing else to work out: platform usage, including the Unblocker proxy Harbor Freight's site requires, is included. Each run also has a start fee of $0.00005.

SKUs that aren't in the catalogue are free. **Maximum products** caps what a run costs: 100 products cost $0.30, and the whole catalogue (about 5,000 products) about $15. If you set a maximum cost per run, the Actor stops when it is reached and keeps the products found so far.

### Related Actors

Grocery prices with the same structured approach:

- [Stop & Shop, Food Lion, Giant & Hannaford Grocery Scraper](https://apify.com/alduinxx/stop-shop-food-lion-giant-hannaford-scraper)
- [Metro Grocery Scraper](https://apify.com/alduinxx/metro-grocery-scraper)
- [Sobeys Grocery Scraper](https://apify.com/alduinxx/sobeys-grocery-scraper)

### Feedback

Found a product that looks wrong, or need a field that is missing? Open an issue on the **Issues** tab with the item number, and it will be looked at.

# Actor input Schema

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

Words to find in the product name or brand, e.g. "sander", "air compressor", "pittsburgh". Matched as whole words (plurals included). Leave empty for the whole catalogue.

## `departments` (type: `array`):

Only products Harbor Freight lists in these departments, as on its department pages. Leave empty for the whole catalogue.

## `skus` (type: `array`):

Price exactly these products: item numbers such as 56458, or product URLs. When given, search terms and departments are not used.

## `dealsOnly` (type: `boolean`):

Only products on sale, on clearance, at a new lower price, or with a member deal or coupon.

## `zipCode` (type: `string`):

Optional. Adds shelf stock (in stock, limited, out of stock) at the Harbor Freight store nearest this ZIP code, within 50 miles.

## `maxProducts` (type: `integer`):

The most products to return. The whole catalogue is about 5,000.

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

Lower this if you see failures.

## Actor input object example

```json
{
  "searchTerms": [],
  "departments": [],
  "skus": [],
  "dealsOnly": false,
  "zipCode": "",
  "maxProducts": 10,
  "maxConcurrency": 10
}
```

# Actor output Schema

## `products` (type: `string`):

No description

## `productsCsv` (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 = {
    "maxProducts": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("alduinxx/harbor-freight-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 = { "maxProducts": 10 }

# Run the Actor and wait for it to finish
run = client.actor("alduinxx/harbor-freight-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 '{
  "maxProducts": 10
}' |
apify call alduinxx/harbor-freight-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alduinxx/harbor-freight-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/E6bl1zSy8kH0bmRPt/builds/ejgOfiBO2l6IKlfRf/openapi.json
