# Academy Sports Scraper (`crawlerbros/academy-sports-scraper`) Actor

Scrape Academy Sports + Outdoors - one of the largest US sporting goods retailers. Search by keyword, browse fishing, hunting, footwear, clothing, camping, fitness and fan-shop categories, or fetch product pages by URL. Get names, brands, prices, ratings, specs, images and availability.

- **URL**: https://apify.com/crawlerbros/academy-sports-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **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

## Academy Sports Scraper

Scrape **Academy Sports + Outdoors** — one of the largest US sporting goods retailers (950,000+ products). Search by keyword, browse curated categories (fishing, hunting, footwear, clothing, camping, fitness, team sports, fan shop…), or fetch product pages by URL. Get product names, brands, prices, was-prices, ratings, review counts, long descriptions, specs, images, availability and item numbers. Pure JSON API — no login, no proxy required.

### What this actor does

- **Three modes:** `search`, `browseByCategory`, `byUrl`
- **Full product detail:** name, brand, price, was-price, rating, review count, long description, specs, feature benefits, what's-in-the-box
- **Rich filters:** brands, price range, minimum rating, keyword, deal type (clearance, hot deal, price drop…), six sort orders
- **Curated dropdowns:** 50 category paths and 60 top brands
- **Clearance & deals:** filter by `Clearance`, `Hot Deal`, `Online Only`, `New`, `Price Drop`, `Everyday Value`, `Ships to Store`
- **Availability:** online stock, buy-online-pick-up-in-store, ship-to-store, same-day delivery flags
- **Empty fields are omitted**

### Output per product

- `productId`, `partNumber`, `catentryId`, `uniqueId`, `upc` — Academy item numbers
- `name`, `brand`, `shortDescription`, `description`
- `price`, `wasPrice`, `priceMax` — was-price appears only when a real discount exists
- `rating`, `reviewCount`, `orderCount`
- `specifications` (size, capacity, color, material…), `featureBenefits[]`, `whatsInTheBox[]`
- `imageUrls[]` — scene7 CDN images (main + per-color)
- `availability` (`In Stock` / `Out of stock`), `sellable`, `buyOnlinePickUpInStore`, `shipToStore`, `sameDayDelivery`, `whiteGloveDelivery`
- `categoryPath`, `categories[]`
- `deals[]`, `clearance`, `customBadges[]`
- `sourceUrl`, `recordType: "product"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `browseByCategory` / `byUrl` |
| `searchQuery` | string | `nike running shoes` | Free-text query (mode=search) |
| `categoryPath` | string | `outdoors > fishing` | Curated category (mode=browseByCategory) |
| `urls` | array | – | Product page URLs (mode=byUrl) |
| `brand` | array | – | Keep only these brands |
| `dealType` | string | – | `Clearance` / `Hot Deal` / `Online Only` / `New` / `Price Drop` / `Everyday Value` / `Ships to Store` |
| `minPrice` | number | – | Minimum starting price in USD |
| `maxPrice` | number | – | Maximum price in USD |
| `minRating` | number | – | Minimum review rating (1–5) |
| `containsKeyword` | string | – | Keep products whose name/description contains this text |
| `sortBy` | string | `relevance` | `relevance` / `priceAsc` / `priceDesc` / `topRated` / `topSeller` / `newArrival` |
| `maxItems` | int | `50` | Hard cap (1–1000) |

#### Example: search with filters

```json
{
  "mode": "search",
  "searchQuery": "fishing rod",
  "brand": ["Penn", "Shakespeare"],
  "minPrice": 30,
  "maxPrice": 200,
  "minRating": 4,
  "sortBy": "topRated",
  "maxItems": 50
}
```

#### Example: browse a category

```json
{
  "mode": "browseByCategory",
  "categoryPath": "outdoors > fishing",
  "maxItems": 100
}
```

#### Example: clearance products

```json
{
  "mode": "browseByCategory",
  "categoryPath": "mens > mens-apparel",
  "dealType": "Clearance",
  "maxItems": 50
}
```

#### Example: fetch specific product pages

```json
{
  "mode": "byUrl",
  "urls": [
    "https://www.academy.com/p/yeti-roadie-8-hard-cooler",
    "https://www.academy.com/p/nike-mens-revolution-7-road-running-shoes"
  ]
}
```

### Data source and limitations

- **Data source:** Academy's public product search index (Algolia) — the same service that powers the site's own search (`www.academy.com`). No login, cookies or proxy required.
- **Currency & market:** all prices are in USD from the US site. Academy operates in the US only.
- **Category paths:** `categoryPath` values are curated against Academy's live category facet. Deeper sub-categories exist on the site but are only exposed if you use a deeper curated path.
- **Search + category:** `categoryPath` applies in `browseByCategory` mode only; in `search` mode the keyword drives the results (combining both would empty the result set).
- **Anti-bot:** the search API is Algolia's public endpoint and tolerates high query volume. The site's own pages sit behind a PerimeterX challenge for datacenter IPs; this actor reads the JSON index directly and never depends on those challenge-gated pages.
- **Not affiliated:** this actor is a third-party tool and is not affiliated with or endorsed by Academy Sports + Outdoors.

### Use cases

- **Price monitoring** — track price, was-price and clearance movements across 950k products
- **Outdoor & sporting goods research** — ratings, review counts and specs at scale
- **Competitor assortment analysis** — compare Academy's fishing, hunting, footwear and fan-shop ranges
- **Deal & clearance tracking** — monitor Hot Deal, Price Drop and Clearance tagging
- **Product feed building** — rich retail feeds for analytics and enrichment

### FAQ

**What is the data source?** Academy's public product search index (Algolia, the same service that powers the site's own search). No login, cookies or proxy required. This is a third-party tool and is not affiliated with Academy Sports + Outdoors.

**What currency and market are supported?** USD and the US site (`www.academy.com`). Academy operates in the US only.

**What does `wasPrice` mean?** The regular (pre-discount) price. It appears only when it genuinely differs from the current price — i.e. a real discount. `price` is always what you would pay now.

**What is `priceMax`?** Products sold in multiple sizes/configurations carry a price range; `priceMax` is the top of the range when it differs from the starting price.

**How fresh is the data?** The product index is re-built daily by Academy; prices, deals and availability update continuously.

**Why are some fields missing on some products?** Products without ratings, specs or deals simply omit those fields — no placeholder values are emitted.

**Are there rate limits?** The Algolia search service is designed for high query volume. The actor uses polite paging with small delays and retries on throttling or server errors.

**What is `buyOnlinePickUpInStore`?** Academy's BOPIS flag — whether the product can be bought online and picked up at a local store. `shipToStore` and `sameDayDelivery` are related fulfilment flags.

# Actor input Schema

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

What to fetch.

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

Free-text query, e.g. `nike running shoes`, `fishing rod`, `cooler` (mode=search).

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

Curated Academy category, e.g. `outdoors > fishing` (mode=browseByCategory).

## `urls` (type: `array`):

Academy product page URLs, e.g. `https://www.academy.com/p/yeti-roadie-8-hard-cooler`.

## `brand` (type: `array`):

Keep only products from these brands.

## `dealType` (type: `string`):

Keep only products with this deal tag (e.g. `Clearance`, `Hot Deal`, `Price Drop`).

## `minPrice` (type: `number`):

Drop products whose starting price is below this.

## `maxPrice` (type: `number`):

Drop products whose maximum price is above this.

## `minRating` (type: `number`):

Keep only products rated at least this (1-5).

## `containsKeyword` (type: `string`):

Keep only products whose name or description contains this text (case-insensitive).

## `sortBy` (type: `string`):

Result ordering.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "nike running shoes",
  "categoryPath": "outdoors > fishing",
  "urls": [],
  "brand": [],
  "dealType": "",
  "sortBy": "relevance",
  "maxItems": 5
}
```

# Actor output Schema

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

Dataset containing all scraped Academy 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": "search",
    "searchQuery": "nike running shoes",
    "categoryPath": "outdoors > fishing",
    "urls": [],
    "brand": [],
    "dealType": "",
    "sortBy": "relevance",
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/academy-sports-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": "search",
    "searchQuery": "nike running shoes",
    "categoryPath": "outdoors > fishing",
    "urls": [],
    "brand": [],
    "dealType": "",
    "sortBy": "relevance",
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/academy-sports-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": "search",
  "searchQuery": "nike running shoes",
  "categoryPath": "outdoors > fishing",
  "urls": [],
  "brand": [],
  "dealType": "",
  "sortBy": "relevance",
  "maxItems": 5
}' |
apify call crawlerbros/academy-sports-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/academy-sports-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/E24Z2tdwKDiCUFMlp/builds/bQu3XBuUE8YoxzvhF/openapi.json
