# Costco AU Scraper – Product Details & Reviews (`abotapi/costco-au-scraper`) Actor

Scrape Costco.com.au products with full details and customer reviews. Search by keyword or paste product, search and category URLs. Returns price, brand, rating, review count and text, stock, images, specifications and promotions.

- **URL**: https://apify.com/abotapi/costco-au-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (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 $1.00 / 1,000 product results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Costco Australia Product & Reviews Scraper

Scrape products and customer reviews from **Costco Australia** (costco.com.au).
Search by keyword with rich filters, or paste product, search and category links
directly. Every product comes back as one flat record with price, brand, rating,
review count, stock, images, specifications, promotions - and, when enabled, the
full customer reviews.

### What you get

- **Dual input modes** - search by keyword + filters, or paste URLs.
- **Specials & offers** - browse the **Hot Buys**, **Last Chance** (clearance) and
  **New arrivals** collections directly, or paste a specials URL.
- **Original 'was' price + savings** - every discounted product carries the
  original strike-through price, the savings amount and the savings percentage,
  plus the discount start/end dates and unit price (per kg/L/each) where shown.
- **Forward-walking pagination** across all result pages.
- **Product details on demand** - long description, ingredients, specifications,
  warranty, returns, category breadcrumb and the full image gallery.
- **Customer reviews on demand** - star rating, title, author, date, review text
  and helpful-vote counts, plus aggregate rating statistics (average, total, and
  the full 1-5 star distribution).
- **7 sort orders** and **brand / category / rating / price** filters.
- **Send results into your apps (MCP connectors)** - optional.

### Input

| Field | Description |
|---|---|
| `mode` | `search` (keyword + filters) or `url` (paste links). |
| `queries` | Search keywords (search mode). Each is searched separately. |
| `sortBy` | `relevance`, `price_asc`, `price_desc`, `name_asc`, `name_desc`, `best_selling`, `top_rated`. |
| `specialsCategory` | Limit to a specials collection: `hot_buys`, `last_chance` or `new`. Combine with a keyword/brand/category to narrow. |
| `brand` | Limit to a single brand (exact spelling). |
| `category` | Limit to a category code (e.g. `cos_9`). |
| `minRating` | Keep only products rated at least N stars (3, 4 or 5). |
| `minPrice` / `maxPrice` | Keep only products in this price band (AUD). |
| `urls` | Product / search / category URLs to scrape (url mode). |
| `fetchDetails` | Fetch each product's full detail (default on). |
| `fetchReviews` | Also collect customer reviews (default off). |
| `maxReviewsPerProduct` | Cap reviews per product (0 = all). |
| `maxItems` | Max products for the whole run (0 = unlimited). |
| `maxPages` | Safety cap on pages per keyword/URL. |
| `proxy` | Proxy configuration (Apify Proxy recommended). |

#### Example

```json
{
  "mode": "search",
  "queries": ["laptop"],
  "sortBy": "top_rated",
  "minRating": 4,
  "fetchDetails": true,
  "fetchReviews": true,
  "maxReviewsPerProduct": 20,
  "maxItems": 50,
  "proxy": { "useApifyProxy": true }
}
```

### Output

Each dataset item is one product:

```json
{
  "code": "151331",
  "name": "mbeat Stage S9 Rotating Laptop Stand",
  "title": "mbeat Stage S9 Rotating Laptop Stand",
  "brand": "mbeat",
  "price": 89.99,
  "priceFormatted": "$89.99",
  "wasPrice": 119.99,
  "wasPriceFormatted": "$119.99",
  "savingsAmount": 30.00,
  "savingsPercent": 25,
  "isOnSpecial": true,
  "discountStartDate": "2026-07-01T14:00:00.000Z",
  "discountEndDate": "2026-07-22T13:59:59.999Z",
  "unitPrice": null,
  "unitPriceFormatted": null,
  "warehouseSavings": false,
  "couponDiscount": null,
  "currency": "AUD",
  "averageRating": 4.83,
  "numberOfReviews": 42,
  "categories": ["Computers", "Computer Accessories", "Cables & Accessories"],
  "breadcrumbs": ["Computers", "Computer Accessories", "Cables & Accessories"],
  "specs": [{ "name": "Colour", "value": "Black" }],
  "images": ["https://www.costco.com.au/..."],
  "stockStatus": "inStock",
  "url": "https://www.costco.com.au/.../p/151331",
  "reviews": [
    {
      "rating": 5,
      "title": "Ideal Laptop Stand",
      "author": "BrianCC",
      "reviewDate": "2025-07-08",
      "body": "Enjoying working on the laptop...",
      "helpfulVotes": 0
    }
  ],
  "reviewCount": 42,
  "reviewStats": {
    "averageRating": 4.83,
    "totalReviews": 42,
    "ratingDistribution": { "5": 35, "4": 7 }
  }
}
```

#### About reviews

Costco Australia **does publish customer reviews**, and this actor captures them
in full (rating, title, author, date, body, helpful votes) together with the
aggregate statistics. Turn on **Fetch customer reviews** to include them. General
merchandise (electronics, homewares, etc.) is widely reviewed; some grocery
staples have few or no reviews, in which case `reviews` is an empty list and
`reviewCount` is `0`.

#### About specials & the 'was' price

Costco Australia groups its promotions into named collections - **Hot Buys**
(current member savings), **Last Chance** (clearance) and **New arrivals**. Pick
one with the **Specials / offers** input in search mode, or paste the collection
link (e.g. `https://www.costco.com.au/c/hot-buys`) in URL mode. You can still add
a keyword, brand or category to narrow a specials view.

For every discounted product the record keeps the current `price` and adds the
original `wasPrice` (strike-through), the `savingsAmount` and `savingsPercent`,
the `discountStartDate` / `discountEndDate`, and `unitPrice` for grocery lines.
Products that are not reduced return `isOnSpecial: false` and `wasPrice: null` -
the fields are always present so a dataset stays consistent. Costco does not show
a separate promo-badge text, so no label is invented; the numeric fields carry
the discount. A per-colour/size variant matrix is not exposed by the storefront,
so it is not emitted (the `hasVariants` flag still marks products that have them).

#### About prices

Costco shows a public price for most catalogue items. A small number of member-
gated grocery lines do not expose a price to non-members - those records carry
`price: null` and `priceHidden: true`, with everything else (name, images,
category, rating) still populated.

### Plan Requirement

Runs on any Apify plan. Apify Proxy is recommended for the most reliable results;
the run adapts its connection automatically. On the free plan, coverage may be
limited.

### Send results into your apps (MCP connectors)

Optionally pipe results into the tools you already use via Model Context Protocol
connectors (Notion, Linear, Airtable, Apify). Authorize a connector under Apify ,
Settings, API & Integrations, then select it in the input. This never changes
the dataset output.

# Actor input Schema

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

Choose 'search' to use keywords and filters, or 'url' to scrape specific Costco Australia product, search or category URLs you paste below.

## `queries` (type: `array`):

One or more keywords to search, for example 'laptop' or 'olive oil'. Each keyword is searched separately.

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

Result ordering.

## `specialsCategory` (type: `string`):

Optional. Limit results to one of Costco Australia's promotional collections: Hot Buys (current member savings), Last Chance (clearance) or New arrivals. Combine with a keyword, brand or category to narrow further, or paste a specials URL in URL mode. Discounted products carry the original 'was' price, savings amount and percent.

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

Optional. Limit results to a single brand exactly as it appears in the results, for example 'HP' or 'Kirkland Signature'.

## `category` (type: `string`):

Optional. Limit results to a category by its code (for example 'cos\_9'). You can read a category code from a category page URL (the part after /c/).

## `minRating` (type: `string`):

Optional. Only keep products whose average customer rating is at least this many stars (1-5).

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

Optional. Only keep products priced at or above this amount. Applied to each product's visible price.

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

Optional. Only keep products priced at or below this amount.

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

Product, search or category URLs to scrape, for example https://www.costco.com.au/search?text=laptop or a product page ending in /p/<code>. Multiple URLs supported.

## `fetchDetails` (type: `boolean`):

Fetch each product's full detail (long description, ingredients, specifications, warranty, returns, all images, category path). Adds one request per product.

## `fetchReviews` (type: `boolean`):

Also collect customer reviews for each product (star rating, title, author, date, review text, helpful votes) plus aggregate rating statistics. Adds requests per product.

## `maxReviewsPerProduct` (type: `integer`):

Cap on reviews collected per product when 'Fetch customer reviews' is on. Use 0 for all available reviews.

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

Maximum number of products to return across the whole run. Use 0 for unlimited.

## `maxPages` (type: `integer`):

Optional cap on result pages walked per keyword/URL. Leave at 0 to walk every page the site actually has (the run also stops once Max products is reached).

## `proxy` (type: `object`):

Apify Proxy is recommended for reliable results. The default shared pool is cheapest and works for most runs; the actor elevates to an Australian residential exit on its own when needed.

## `mcpConnectors` (type: `array`):

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "laptop"
  ],
  "sortBy": "relevance",
  "specialsCategory": "",
  "minRating": "0",
  "urls": [
    "https://www.costco.com.au/search?text=laptop"
  ],
  "fetchDetails": true,
  "fetchReviews": false,
  "maxReviewsPerProduct": 20,
  "maxItems": 20,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "search",
    "queries": [
        "laptop"
    ],
    "urls": [
        "https://www.costco.com.au/search?text=laptop"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/costco-au-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",
    "queries": ["laptop"],
    "urls": ["https://www.costco.com.au/search?text=laptop"],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/costco-au-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 '{
  "mode": "search",
  "queries": [
    "laptop"
  ],
  "urls": [
    "https://www.costco.com.au/search?text=laptop"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/costco-au-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/1HC1ZUVXziTUO5LLR/builds/wuL4m6PRWs2MPsAB1/openapi.json
