Costco AU Scraper at a glance
Costco AU Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes kind, name, change type (incremental mode), brand and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Automation, Developer Tools
- Region
- Oceania
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 31 options
- Run success
- 100.0% of completed public runs in the last 30 days
Scrape Costco.com.au products by keyword or product, search and category URLs. Extract prices, brands, ratings, review counts and text, stock, images, specifications, promotions and full product details in clean structured data.
What Costco AU Scraper can do
- Three ways in. Search by keyword with brand, category, rating and price filters, browse the whole category tree as one row per category (departments, sub-categories and leaf pages, currently 3 levels and 400+ categories, each with its depth, parent chain, storefront link and a ready-made search link for that branch's products), or paste product, search, category and specials links directly, no need to build URLs by hand.
- Specials collections, browsable. Hot Buys, Last Chance (clearance) and New arrivals are their own views: pick one with a single input, or paste the collection link.
- Real discount math, not a guess. Every discounted product carries the original "was" price, the savings amount and percent, and the discount's start/end dates, alongside a per-unit price with its actual basis (kg, litre, 100 g and more) rather than a bare dollar figure.
- Membership-gated prices handled honestly. costco.com.au hides the price on some grocery lines behind a membership login; those records still come back with every other field populated and priceHidden: true, with no price where the site withholds one, rather than a guessed number.
- Detail and reviews on demand. Switch on full product detail (description, ingredients, warranty, returns, category path, full image gallery) and customer reviews (rating, title, author, date, text, helpful votes, plus aggregate rating stats) per run, and pay only for what you use.
- Built for monitoring. Incremental mode returns only new, changed, reappeared and expired products on a recurring search; Resume continues one interrupted crawl without re-collecting or re-charging what a previous run already has.
Choose what to collect
These inputs let you configure Costco AU Scraper - Products, Prices & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose 'search' to use keywords and filters, 'categories' to browse Costco Australia's full category tree (one row per category, no products), or 'url' to scrape specific Costco Australia product, search or category URLs you paste below. |
queriesarray | One or more keywords to search, for example 'laptop' or 'olive oil'. Each keyword is searched separately. |
sortBystring | Result ordering. |
specialsCategorystring | 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. |
brandstring | Optional. Limit results to a single brand exactly as it appears in the results, for example 'HP' or 'Kirkland Signature'. |
categorystring | 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/). |
categoryCodestring | Optional alias of Category code that also accepts a pasted category page URL (the part after /c/ is used). Also accepts a parent category code to cover its whole subtree. |
Show 24 more inputs
| Input | What it controls |
|---|---|
parentIdstring | Optional. Browse everything under a parent category code (its direct children and deeper levels). |
filtersarray | Optional. Site facet filters as 'FacetName:FacetValue' (for example 'Brand:Apple'). Values are case-sensitive and must match the site's own facet value exactly; a value the site does not list returns no products. |
rawQuerystring | Advanced. A raw storefront query expression ('text:sort:facet:value'), used as-is instead of the keyword, sort, category and filter inputs. |
productCodestring | Optional. Fetch one product by its numeric code (for example 126124) or the full product page link ending in /p/ (runs in URL mode and ignores the other search inputs). A page slug on its own is rejected. |
minRatingstring | Optional. Only keep products whose average customer rating is at least this many stars (1-5). |
urlsarray | Costco Australia links to scrape: search pages (text= or q= facet links, page= sets the start page), product pages (/p/), category pages (/c/), specials collections (/hot-buys/c/hot-buys, /c/last-chance, /c/new) and API search or product links. Multiple URLs supported. Each link gets an equal share of Max products, so left unedited a small sample of each shape is scraped. |
levelinteger | How deep into the category tree to go. 0 = every level the site publishes (currently 3: departments, sub-categories, leaf pages). 1 = top-level departments only. 2 = departments plus sub-categories. The site currently publishes 3 levels. |
includeNonCosboolean | Off by default. The tree's top level also carries two promotional collections (Hot Buys and What's New) that are not product categories and are excluded unless you turn this on. |
minPriceinteger | Optional. Only keep products priced at or above this amount. Applied to each product's visible price. |
maxPriceinteger | Optional. Only keep products priced at or below this amount. |
fetchDetailsboolean | Fetch each product's full detail (long description, ingredients, specifications, warranty, returns, all images, category path). Adds one request per product. |
fetchReviewsboolean | Also collect customer reviews for each product (star rating, title, author, date, review text, helpful votes) plus aggregate rating statistics. Adds requests per product. |
maxReviewsPerProductinteger | Cap on reviews collected per product when 'Fetch customer reviews' is on. Use 0 for the hard ceiling of 1000 reviews per product. |
maxItemsinteger | Maximum number of products to return across the whole run. Use 0 for the hard ceiling of 100000 products. |
maxPagesinteger | 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). |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product pull in another run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately per search/URL and filter/detail/review setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and filter/detail/review settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max products capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names that must NOT trigger UPDATED or appear in changedFields, in addition to the built-in handling (embedded reviews never trigger UPDATED). Use a top-level name such as promotions, or a dotted path for a nested field such as specs.value (applies to every list element). The ignored fields stay in the output; only change detection skips them. Saved state is re-evaluated with your current list, so editing it causes no one-off wave of UPDATED rows. |
mcpConnectorsarray | 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). |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
kindKindnameNamechangeTypeChange type (incremental mode)brandBrandpricePricepriceFormattedPrice (formatted)wasPriceWas priceunitPriceUnit priceunitPriceFormattedUnit price (formatted)unitOfMeasureUnitunitMeasureUnit measuresavingsPercentSave %Show 23 more fields
isOnSpecialOn specialcurrencyCurrencyaverageRatingRatingnumberOfReviewsRatingsreviewCountReviews collectedstockStatusStockcodeCodecategoriesCategories (array)imagesImage (array)urlURL (link)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)reviewsreviewslevelLevelparentCodeParent codeparentPathParent path (array)categoryPathCategory path (array)namePathName path (array)isCosCategoryProduct categoryslugSlugsearchUrlSearch this branch (link)childCodesChild codes (array)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"code": "500123",
"name": "Sample Stainless Steel Blender",
"title": "Northfield Sample Stainless Steel Blender",
"englishName": "Sample Stainless Steel Blender",
"url": "https://www.costco.com.au/kitchen/sample-stainless-steel-blender/p/500123",
"brand": "Northfield",
"price": 79.99,
"priceFormatted": "$79.99",
"currency": "AUD",
"priceHidden": false,
"membershipRequired": false,
"wasPrice": 99.99,
"wasPriceFormatted": "$99.99",
"savingsAmount": 20,
"savingsPercent": 20,
"isOnSpecial": true,
"discountStartDate": "2026-03-01T14:00:00.000Z",
"discountEndDate": "2026-03-21T13:59:59.999Z",
"unitPrice": null,
"unitPriceFormatted": null,
"unitOfMeasure": null,
"unitMeasure": null,
"warehouseSavings": false,
"couponDiscount": null,
"averageRating": 4.6,
"numberOfReviews": 128,
"categories": [
"Kitchen",
"Small Appliances"
],
"breadcrumbs": [
"Kitchen",
"Small Appliances"
],
"specs": [
{
"name": "Colour",
"value": "Silver"
}
],
"images": [
"https://www.costco.com.au/medias/sample-500123-1.jpg"
],
"stockStatus": "inStock",
"hasVariants": false,
"reviews": [
{
"reviewId": "1",
"rating": 5,
"title": "Great value",
"author": "SampleShopper",
"body": "Works well and easy to clean.",
"reviewDate": "2026-02-14",
"helpfulVotes": 3
}
],
"reviewCount": 1,
"reviewStats": {
"averageRating": 4.6,
"totalReviews": 128,
"ratingDistribution": {
"4": 30,
"5": 90
}
}
}Ways to use this data
- Price and specials monitoring: track the Hot Buys, Last Chance and New arrivals collections, or a saved search, on a schedule and get back only the products that are new, repriced or gone.
- Retail and pricing intelligence: compare Costco Australia's warehouse pricing, unit prices and savings against other retailers for a category or brand.
- Catalogue and merchandising research: pull specifications, categories, images and rating distributions for range planning, comparison tools or content.
- Review and sentiment analysis: collect full customer reviews and aggregate rating statistics for a product line or brand.
- Deal-hunting apps and newsletters: surface currently discounted products (isOnSpecial, savingsPercent) for a shopping tool or content feed.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Costco AU Scraper return?
The documented output for Costco AU Scraper includes kind, name, change type (incremental mode), brand, price, price (formatted), was price and unit price. Availability of each field depends on the source page and the selected mode.
How much does Costco AU Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared products, and unchanged ones are not billed unless you turn on Emit unchanged.
Why did my run return nothing instead of an error?
When nothing is collected, the run ends as succeeded with a "No products matched" status message instead of failing. That covers a search or URL with no matches, filters that exclude everything (including a price filter on pasted product links), a Resume where every product was already collected, and a run where the site refused every request. The status message is the same in all of these cases, so the run log is where you tell them apart: repeated "Connection refused" lines mean the site was blocking, and running again later usually helps. Otherwise, try a broader keyword, relax the filters, or double check the URLs you pasted. If a monitoring tool needs a hard signal, alert on a run with zero results. A bad Resume from a previous run ID is different: that stops the run with an explicit error before anything is collected or charged.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
