# Fisheries Supply Scraper (`crawlerbros/fisheries-supply-scraper`) Actor

Scrape Fisheries Supply (fisheriessupply.com) - marine and boat supplies e-commerce since 1928. Browse by category, filter by brand, price, sale status, and stock availability, or fetch full product details (description, images, price range) by URL.

- **URL**: https://apify.com/crawlerbros/fisheries-supply-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Agents, Automation, E-commerce
- **Stats:** 2 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 and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Fisheries Supply Scraper

Scrape [Fisheries Supply](https://www.fisheriessupply.com) — a Seattle-based marine and boat supplies retailer serving commercial and recreational boaters since 1928. Browse by category, filter by brand, price, sale status, and stock availability, or pull full product detail pages (description, images, price range) from product URLs.

### What this actor does

- **Two modes:** `byCategory`, `byProductUrls`
- **309 categories** across Anchor & Dock Hardware, Engine Parts, Fishing Gear, Boat Paint, Cabin, Electrical, Trailer Parts, and more
- **Filters:** brand, min/max price, on-sale-only, in-stock-only
- **Full product detail mode:** description, image, price range, variant count
- **Empty fields are omitted** — every record only contains data that was actually found

### Output per product

#### Listing records (`byCategory`, `recordType: "product"`)

- `productId`, `sku`, `productName`, `brand`
- `minPrice`, `maxPrice`, `currency`, `isOnSale`
- `inStock`, `stockMessage`, `reviewScore`
- `variantCount` — number of purchasable size/model variants under this product
- `imageUrl`, `productUrl`, `sourceUrl`
- `recordType: "product"`, `scrapedAt`

#### Product detail records (`byProductUrls`, `recordType: "productDetail"`)

- `productName`, `brand`, `description`, `sku`
- `minPrice`, `maxPrice`, `currency`, `variantCount`, `inStock`
- `imageUrl`, `productUrl`, `sourceUrl`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `byCategory` | `byCategory` / `byProductUrls` |
| `categoryPath` | select | – | Category to browse (mode=byCategory), one of 309 known paths |
| `productUrls` | array | – | Full fisheriessupply.com product URLs (mode=byProductUrls) |
| `brand` | string | – | Only keep products whose brand contains this text |
| `minPrice` | int | – | Minimum price in USD |
| `maxPrice` | int | – | Maximum price in USD |
| `onSaleOnly` | bool | `false` | Only keep products flagged as on sale |
| `inStockOnly` | bool | `false` | Only keep products currently in stock |
| `maxItems` | int | `45` | Hard cap (1–2000) |

#### Example: browse anchors under $500

```json
{
  "mode": "byCategory",
  "categoryPath": "anchor-and-dock-hardware/anchors",
  "maxPrice": 500,
  "maxItems": 45
}
```

#### Example: browse engine parts on sale from a specific brand

```json
{
  "mode": "byCategory",
  "categoryPath": "engine-parts/fuel-system",
  "brand": "Racor",
  "onSaleOnly": true,
  "maxItems": 90
}
```

#### Example: full product details from a saved list of URLs

```json
{
  "mode": "byProductUrls",
  "productUrls": [
    "https://www.fisheriessupply.com/rocna-anchor-galvanized-steel"
  ]
}
```

### Use cases

- **Price monitoring** — track marine parts prices and price ranges over time
- **Sale tracking** — filter `onSaleOnly` to find current deals
- **Category research** — pull a full category's assortment for competitive analysis
- **Catalogue enrichment** — pull full descriptions and images for a known list of product URLs

### FAQ

**Does this need a login or API key?**
No. All data is publicly available on Fisheries Supply's storefront pages.

**Which currency are prices in?**
USD ($) — Fisheries Supply's US storefront is the source for this actor.

**Why isn't there a free-text search mode?**
Two Fisheries Supply search endpoints were evaluated and rejected. `/browse?q=...` was verified not to actually filter by the search query (it returns the same fixed listing regardless of what's searched) and is excluded from crawling in the site's own `robots.txt`. `/catalogsearch/result/?q=...` (allowed by `robots.txt` and confirmed to share the same page-model grid as category pages) was also tested live and consistently returns HTTP 403 even with the browser-matching TLS fingerprint that reliably passes on category/product pages, including after proxy escalation -- so it cannot be shipped as a reliable mode. Category browsing (309 categories covering the full catalogue) is the reliable, fully-supported way to reach every product; combine it with the brand/price/sale filters to narrow results the way a keyword search would.

**Why do some products show a price range instead of one price?**
Many marine products (anchors, chain, rope, hose) come in multiple sizes/variants at different prices. `minPrice`/`maxPrice` reflect the full range across all variants of that product; the individual variant price is shown when you open the product page.

**How current is the data?**
Every run fetches live pages directly from Fisheries Supply — prices, stock, and discounts reflect what's on the site at run time.

### Limitations

- Fisheries Supply's storefront applies TLS-fingerprint-based bot detection: a plain `curl`/non-browser-fingerprinted HTTP client (even with a browser `User-Agent` header) gets an HTTP 403 on product and category pages. This actor's fetcher uses a browser-matching TLS fingerprint plus automatic retries and proxy escalation to reliably pass this check, so `productUrl` values in the output always resolve to the real page in an actual browser — a manual `curl` check from a non-browser client showing a 403 is expected site behavior, not a broken link. Image URLs (`imageUrl`) are always directly accessible from any client.
- There is no free-text search mode — see the FAQ above for why, and use category browsing plus filters instead.
- `isOnSale` is only available from category-listing pages (`mode=byCategory`); Fisheries Supply's individual product pages carry no sale-status signal at all. In `mode=byProductUrls`, the `isOnSale` field is omitted from output and the `onSaleOnly` filter has no effect (it passes every record through rather than excluding everything) — use `mode=byCategory` with `onSaleOnly` if you need to find only discounted products.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `categoryPath` (type: `string`):

Category to browse.

## `productUrls` (type: `array`):

Full fisheriessupply.com product page URLs, e.g. `https://www.fisheriessupply.com/rocna-anchor-galvanized-steel`.

## `brand` (type: `string`):

Only keep products whose brand contains this text (case-insensitive). Applies to all modes.

## `minPrice` (type: `integer`):

Only keep products whose minimum listed price is at or above this amount, in USD.

## `maxPrice` (type: `integer`):

Only keep products whose minimum listed price is at or below this amount, in USD.

## `onSaleOnly` (type: `boolean`):

Only keep products flagged as on sale.

## `inStockOnly` (type: `boolean`):

Only keep products currently in stock.

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

Maximum number of products to return.

## Actor input object example

```json
{
  "mode": "byCategory",
  "categoryPath": "anchor-and-dock-hardware/anchors",
  "productUrls": [],
  "onSaleOnly": false,
  "inStockOnly": false,
  "maxItems": 45
}
```

# Actor output Schema

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

Dataset containing all scraped Fisheries Supply products.

# 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 = {
    "mode": "byCategory",
    "categoryPath": "anchor-and-dock-hardware/anchors",
    "productUrls": [],
    "onSaleOnly": false,
    "inStockOnly": false,
    "maxItems": 45
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/fisheries-supply-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 = {
    "mode": "byCategory",
    "categoryPath": "anchor-and-dock-hardware/anchors",
    "productUrls": [],
    "onSaleOnly": False,
    "inStockOnly": False,
    "maxItems": 45,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/fisheries-supply-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 '{
  "mode": "byCategory",
  "categoryPath": "anchor-and-dock-hardware/anchors",
  "productUrls": [],
  "onSaleOnly": false,
  "inStockOnly": false,
  "maxItems": 45
}' |
apify call crawlerbros/fisheries-supply-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/fisheries-supply-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/D5WPgsmFhMfYnXFeo/builds/220Xi1pX38PTAB3pp/openapi.json
