# Australia Catalogue Specials - Weekly Deals by State (`gratifying_graph/australia-catalogue-specials`) Actor

Current catalogue specials from Australian retailers (Woolworths, Coles, IGA, Kmart, Target, Bunnings, Priceline, Myer and more) by state. Prices, multi-buy offers, savings and validity dates in one clean schema.

- **URL**: https://apify.com/gratifying\_graph/australia-catalogue-specials.md
- **Developed by:** [Jimmy A](https://apify.com/gratifying_graph) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 deal results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Australia Catalogue Specials - Weekly Deals by State

Current **catalogue specials from Australian retailers** for any state or territory, normalized into one clean schema. Pull the weekly Woolworths and Coles specials, or search every catalogue in a state for a product: Woolworths, Coles, IGA, Kmart, Target, Bunnings Warehouse, Myer, Priceline, Dan Murphy's and more, in a single run.

This actor reads Salefinder's public catalogue pages. It is HTTP-first: no browser, no proxies, no login. Catalogues differ by state, so you pick a state and get the catalogues that run there.

### What you get

One record per catalogue item:

```json
{
  "dealId": 679211168,
  "query": "coffee",
  "state": "NSW",
  "region": "SYDNEY, 2000",
  "name": "Moccona Freeze Dried Classic Coffee 200g",
  "retailer": "Woolworths",
  "currentPrice": 14,
  "originalPrice": 23.6,
  "saving": 9.6,
  "currency": "AUD",
  "priceText": "$14.00 each",
  "saleStory": "40% off, Save $9.60",
  "unitPriceText": "$7 per 100g",
  "category": "Food and beverage > Groceries > Drinks",
  "catalogueId": 67921,
  "catalogueName": "Weekly Catalogue NSW",
  "validFrom": "2026-09-23",
  "validTo": "2026-09-29",
  "imageUrl": "https://dduhxx0oznf63.cloudfront.net/images/thumbs/ipad/679211168_b81852e0b6ad432.jpg",
  "url": "https://www.salefinder.com.au/67921/food-and-beverage/groceries/drinks/moccona-freeze-dried-classic-coffee-200g/679211168/",
  "source": "Salefinder public catalogue pages",
  "fetchedAt": "2026-09-23T20:37:29.673Z"
}
```

`currentPrice`, `originalPrice` and `saving` are numbers in AUD where the catalogue gives them. `priceText` keeps the raw price (`$14.00 each`, `Any 2 for $14.00`, `$25.49 pack (6)`), `saleStory` keeps the promo line (`1/2 Price, Save $8.40`, `Was $3.00, Save $1.50`) and `unitPriceText` keeps the unit price, so nothing is lost. `validFrom`/`validTo` are the catalogue's run dates. `query` is the search term that matched, or `null` when you did not search.

### Inputs

- **state** (required): `NSW`, `VIC`, `QLD`, `WA`, `SA`, `TAS`, `ACT` or `NT`.
- **retailers**: only read these retailers' catalogues (e.g. `Woolworths`, `Coles`, `Kmart`, `Dan Murphy's`). Case and punctuation do not matter, so `dan murphys` works too. With several retailers, `maxItems` is shared evenly between them. Empty = every retailer with a current catalogue in the state.
- **queries**: keep only items whose name contains every word of a term (`coffee`, `chocolate`, `instant coffee`). Words match the start of a word in the item name, so `egg` finds `Eggs`. Empty = every item in the matching catalogues.
- **maxItems**: cap on deal records for the whole run (default 200).
- **onlyWithPrice**: skip items that show no price (default true).
- **includeOldCatalogues**: also read range catalogues that started more than 60 days ago (default false). See the FAQ.

### Coverage

Tested on 23 September 2026 in all eight states and territories. Every one returned deals.

- Salefinder listed 52-61 catalogues per state (old range catalogues included) from 23-26 retailers.
- Retailers that returned deal records in our tests: Woolworths, Coles, IGA, Kmart, Target, Bunnings Warehouse, Myer, Priceline, Dan Murphy's, Officeworks, Bed Bath N' Table, Soul Pattinson, Good Price Pharmacy Warehouse, Direct Chemist Outlet and Toymate.
- Also listed: Amcal, Angus & Coote, Autobarn, Discount Drug Stores, IGA Liquor, Lombard, Pharmacist Advice, Pharmacy Best Buys, Prouds, Tyres and More and healthylife.
- Big W and ALDI had no current catalogue on Salefinder in any state in the week tested.
- A Woolworths weekly catalogue held 308 items in NSW that week.

### Use cases

- **Price comparison apps**: this week's coffee specials at Woolworths, Coles and IGA side by side
- **Deal alerts**: run once a week, diff against last week, notify on a target price
- **Meal-planning and budgeting tools**: pull the week's grocery specials for a state
- **Market and CPG research**: track promo depth (half price, multi-buy, % off) by brand, retailer and state over time
- **AI agents**: ask "what coffee is on special at Woolworths in Victoria" through the standby API endpoint

### API / Standby mode for AI agents

Call the actor as a synchronous HTTP endpoint:

```
GET /?state=NSW&q=coffee&retailer=woolworths&maxItems=50
```

Returns `{ count, deals: [...] }`. Repeat `q` or `retailer`, or separate values with commas, for several. An invalid state returns HTTP 400 and is not charged.

Base URL: `https://gratifying-graph--australia-catalogue-specials.apify.actor`. Add your Apify API token as `?token=YOUR_TOKEN` or an `Authorization: Bearer YOUR_TOKEN` header.

In our tests a call for one retailer answered in about 9 seconds. The same call again within 30 minutes came back from cache in milliseconds. A search across every retailer in a state reads every catalogue first (about 2 minutes in our batch test), so pass `retailer` when you need a fast answer.

### Speed

Measured locally:

- One or two retailers, with or without search terms: 5-45 seconds.
- A search term across every retailer in a state: about 2 minutes (TAS: 62 page reads, 107 seconds).

The actor reads Salefinder one page at a time with a short pause between pages, so larger runs take longer rather than hitting the site harder.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Actor start | $0.0005 |
| Per deal record | $0.002 |
| API call (standby) | $0.02 |

Measured example: chocolate and coffee specials at Woolworths and Coles in NSW returned 39 deals, $0.0785 per run. In the week tested, Woolworths and Coles catalogues ran Wednesday to Tuesday, so one run a week catches each new catalogue: about $0.34 a month. The default input (20 deals) costs $0.0405. A full Woolworths weekly catalogue (308 items in NSW) costs up to about $0.62.

### FAQ

**Where does the data come from?**
Salefinder (salefinder.com.au) catalogue pages - the same catalogues the retailers publish for shoppers. The actor reads logged-out, public, non-personal data only.
Salefinder's pages are public and served without a login. This actor reads them politely: one request at a time with a short pause.

**Are these in-store shelf prices?**
No. These are catalogue special prices for the stated validity window. Regular shelf prices are not part of catalogue data. Some catalogues show member prices: for Dan Murphy's, `currentPrice` is the headline price and the non-member price stays in `saleStory` (e.g. `Non-Member: $21.95 Each`).

**Why do I need a state?**
Catalogues are regional. Woolworths publishes a separate weekly catalogue per state (e.g. `Weekly Catalogue NSW`, `Weekly Catalogue QLD`), and the retailers differ by state: in the week tested, Dan Murphy's was listed in NSW, VIC, QLD, WA and SA but not in TAS, ACT or NT. The actor reads the catalogues Salefinder shows for the state capital. Some retailers name these METRO catalogues (e.g. `Coles Catalogue NSW METRO`).

**How are multi-buy prices handled?**
`currentPrice` is the price per item and `priceText` keeps the offer. Example from a real record: `priceText` `Any 2 for $14.00`, `saleStory` `Save $4.00` gives `currentPrice` 7, `saving` 4 and `originalPrice` null. `saving` is the amount printed in the catalogue. `originalPrice` is only filled when the catalogue shows a `Was` price or a single-item saving, so it is never guessed for multi-buys.

**Why are some prices null?**
Some catalogue items carry no price on the page, for example `35% off Blackmores Selected Products` or homewares listed without a price. With `onlyWithPrice` on (the default) they are skipped. Turn it off to keep them; the offer stays in `name` or `saleStory`.

**How do search terms match?**
Against the item name, word by word. `milk` finds `Oak Flavoured Milk 600mL` and also `Cadbury Dairy Milk Block Chocolate`. Use two words (`flavoured milk`) to narrow it.

**What are old range catalogues?**
Salefinder keeps some range catalogues listed for years, for example Officeworks books from 2022 marked valid to 2030. Their prices are old, so by default the actor skips catalogues that started more than 60 days ago. Turn on `includeOldCatalogues` to read them. Some current range catalogues also carry a far-off end date (Bunnings Warehouse `October 2026` is marked valid to 2030-09-24); `validTo` keeps the date as published.

**Canada or the US?**
Use the sibling actors [Canada Grocery Deals](https://apify.com/gratifying_graph/canada-grocery-deals) and [US Grocery Deals](https://apify.com/gratifying_graph/us-grocery-deals) - similar record shape, by postal code and ZIP code.

**CSV export?**
Every Apify dataset exports as CSV, JSON, Excel, or via API.

### Feedback

Found a bug or need a field? Open an issue on the Issues tab. The actor is checked twice a day and issues get a fast fix.

If this actor saves you time, a short review on the Store page helps other people find it.

# Actor input Schema

## `state` (type: `string`):

Catalogues differ by state. The actor reads the catalogues Salefinder shows for the state capital (Sydney, Melbourne, Brisbane, Perth, Adelaide, Hobart, Canberra, Darwin).

## `retailers` (type: `array`):

Only read catalogues from these retailers (e.g. Woolworths, Coles, Kmart, Dan Murphy's). Case and punctuation do not matter. With several retailers, maxItems is shared evenly between them. Empty = every retailer with a current catalogue in the state.

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

Keep only items whose name contains every word of a term (e.g. coffee, chocolate, nappies). Words match the start of a word in the name, so egg finds Eggs. Empty = every item in the matching catalogues.

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

Cap on the number of deal records for the whole run. You pay per record, so a small cap keeps a test run cheap.

## `onlyWithPrice` (type: `boolean`):

Skip catalogue items that show no price (e.g. "35% off selected products" promos).

## `includeOldCatalogues` (type: `boolean`):

Salefinder keeps some range catalogues listed for years (for example office and hardware books from past seasons). By default the actor skips catalogues that started more than 60 days ago.

## Actor input object example

```json
{
  "state": "NSW",
  "retailers": [
    "Woolworths",
    "Coles"
  ],
  "queries": [
    "chocolate",
    "coffee"
  ],
  "maxItems": 20,
  "onlyWithPrice": true,
  "includeOldCatalogues": false
}
```

# Actor output Schema

## `deals` (type: `string`):

All deal records from this run (dataset items).

# 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 = {
    "state": "NSW",
    "retailers": [
        "Woolworths",
        "Coles"
    ],
    "queries": [
        "chocolate",
        "coffee"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("gratifying_graph/australia-catalogue-specials").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 = {
    "state": "NSW",
    "retailers": [
        "Woolworths",
        "Coles",
    ],
    "queries": [
        "chocolate",
        "coffee",
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("gratifying_graph/australia-catalogue-specials").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 '{
  "state": "NSW",
  "retailers": [
    "Woolworths",
    "Coles"
  ],
  "queries": [
    "chocolate",
    "coffee"
  ],
  "maxItems": 20
}' |
apify call gratifying_graph/australia-catalogue-specials --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gratifying_graph/australia-catalogue-specials"
        }
    }
}
```

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/lfQV5VqRchVromxqP/builds/UzO7WJ1nG8HHMupWe/openapi.json
