# Coles Scraper — Bulk Prices & CSV API (`apivault_labs/coles-basket-price-monitor`) Actor

Collect Coles products, specials and basket prices; track delivered observations with explicit store context. Bulk export: JSON, CSV, Excel and API. PPE: $1/1K product results; usage extra.

- **URL**: https://apify.com/apivault_labs/coles-basket-price-monitor.md
- **Developed by:** [Apivault Labs](https://apify.com/apivault_labs) (community)
- **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 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

## Coles Scraper — Grocery Prices, Specials & Basket Monitor

![Coles Scraper — Products, Specials and Basket Monitor](https://api.apify.com/v2/key-value-stores/Y3DV82BaJxz75CHaM/records/coles-readme-banner-v1.png)

Collect Coles Australia grocery prices, specials and product details as structured JSON for retail research, shopping-basket monitoring and AI agents. Search products, read supermarket categories, calculate selected basket totals, retain dated price observations and compare live Woolworths products using verified GTIN and pack identity.

**Apify account access is required to run this Actor.** The result tariff is **$1 per 1,000 delivered products on every plan**, with Apify platform resources charged separately. Optional Woolworths comparison charges are additional.

### Coles product search

```json
{"searchTerms":["milk"],"maxItems":100,"maxPages":2}
```

No targets defaults to a small milk search. Combine `searchTerms`, public Coles `categoryUrls`, `productUrls` and `basket`, or leave search terms empty for URL-only runs. Product IDs are deduplicated across inputs and pages. Associated recommendations are excluded; sponsored products are marked and can be filtered.

Useful for Australian grocery price research, Coles specials tracking, supermarket basket comparison, retail price monitoring and AI shopping research. The Actor reads observations; it does not place orders or operate checkout.

### Choose a Coles scraping workflow

| Your goal | Inputs to start with | Results to read |
| --- | --- | --- |
| Find grocery products and prices | `searchTerms` or `categoryUrls` | Product dataset, `SUMMARY` |
| Collect ingredients, allergens and nutrition | `includeDetails: true` | Product dataset |
| Research Coles half-price specials | Specials URL, `promotionFilter: "halfprice"` | Discount and unit-price fields |
| Calculate a shopping basket | `basket`, optional `applyMultibuy` | `BASKET` |
| Monitor price changes across runs | `incrementalMode`, `trackHistory`, a stable `stateKey` | Changes, `HISTORY`, `BASKET_HISTORY` |
| Continue a bounded collection | `resume: true`, the same campaign | Dataset, `PROGRESS`, `SUMMARY` |
| Compare an identical Woolworths product | `compareWoolworths: true` | Verified identity and reference-price fields |

Start with a small product or basket input. Inspect the coverage and price scope before increasing limits or scheduling repeated runs. Search terms and URLs can be combined; the same product is returned once per collection cycle.

### Full product details

```json
{"searchTerms":["Devondale milk"],"includeDetails":true,"maxItems":5,"maxPages":1}
```

Product rows include ID, name, brand, pack size, AUD current/previous price, savings, reported availability, URL and observation time. `includeDetails` fetches product cards for listing results and adds checksum-valid GTIN, images, description, ingredients, allergens, dietary/storage information, nutrition, country of origin and size/variety variants where supplied. Explicit product URLs already return card data. Missing source fields stay null or empty; `detailStatus` distinguishes cards from listing-only records. Fetching each card increases time and resource usage.

`pricePerKg` and `pricePerLitre` normalize explicit source unit-price denominations. Unknown or ambiguous pack sizes are not guessed.

### Specials, half-price and filters

```json
{
  "categoryUrls":["https://www.coles.com.au/on-special"],
  "promotionFilter":"halfprice",
  "minDiscountPercent":50,
  "excludeSponsored":true,
  "sortBy":"unitPriceAscending",
  "maxItems":30,"maxPages":2
}
```

`specialsOnly` keeps reported specials, including multibuy promotions. `discountPercent` uses a known higher previous price, or an explicitly reported percentage when the reference price is absent. `discountPercentSource` distinguishes the two; no previous price is invented. `isHalfPrice` means a computed or explicitly reported discount of at least 50%. Multibuy percentage can remain unknown.

Filter exact case-insensitive `brands`, `minPrice`, `maxPrice`, `minDiscountPercent`, `inStockOnly`, `excludeSponsored` and `promotionFilter` (`all`, `halfprice`, `multibuy`). Unknown values fail an explicitly requested numeric filter. Availability describes the observed online context, not guaranteed physical-store stock.

Sort the **collected output batch** by `source`, `priceAscending`, `priceDescending`, `nameAscending` or `unitPriceAscending`. Unit sorting separates mass ($/kg) from volume ($/L), then places unknown units last. It does not compare different physical dimensions or rank the entire catalogue.

### Shopping-basket totals and multibuy

```json
{
  "basket":[{"url":"https://www.coles.com.au/product/8150288","quantity":2}],
  "applyMultibuy":true,"maxItems":20,"maxPages":1
}
```

`BASKET` reports quantities, subtotals, known total, missing-price coverage and comparison coverage. Unknown prices stay unknown and never become zero. `complete` describes priced basket lines; `collectionComplete` separately describes the scan.

With `applyMultibuy`, supported explicit “N for $X” and “Pick any N for $X” offers apply to integer quantities of the **same product**. A quantity of three under a verified “2 for $5” offer costs $5 plus one observed shelf price. `multibuyApplied` identifies adjusted lines. Other promotions remain visible without an invented checkout calculation.

Mixed-product groups, loyalty/member eligibility, variable-weight checkout adjustments, shipping and other fees are excluded. Actual customer checkout can differ.

### Price changes and dated history

```json
{
  "basket":[{"url":"https://www.coles.com.au/product/8150288","quantity":2}],
  "incrementalMode":true,"trackHistory":true,
  "historyDays":30,"historyRetentionDays":365,"maxHistoryEntries":100,
  "stateKey":"weekly-milk-basket","maxItems":20
}
```

Repeat the same campaign name and scope. First observations are `NEW`; subsequent output defaults to changed products. `emitUnchanged` includes unchanged rows. Changes cover price, previous price, specials and availability, with `previousPrice`, `priceChange`, `previousObservedAt` and `changedFields`. Unknown-to-known prices do not invent a numeric delta. Missing products are not automatically discontinued.

`HISTORY` retains actual dated product observations and window minimum/maximum, first/latest prices and change. `BASKET_HISTORY` retains completed-cycle basket observations and min/max totals for fully priced baskets. History starts when you run the campaign: selecting 30 days does not create 30 days of historical data. No daily interpolation is performed. One observation has no historical price-change value.

Only a complete scan with fully delivered output advances the baseline and commits new history. Partial scans preserve the previous completed baseline. Concurrent runs of the same campaign are excluded. A different target, basket, regional context or filter requires a new `stateKey`.

### Resume large scans

```json
{"searchTerms":["milk"],"resume":true,"stateKey":"milk-scan","maxItems":50,"maxPages":2}
```

Run the same input again to continue a saved incomplete scan. `PROGRESS` reports completion and checkpoint status. Products delivered before a successful checkpoint are skipped on continuation. Once the cycle completes, the next run starts a new observation cycle.

Limits apply per run: `maxItems` counts collected observations before unchanged-row filtering; `maxPages` counts newly fetched listing pages per target. `SUMMARY.status: PARTIAL` is an intentional bounded result, not proof of complete catalogue coverage. Raise limits or continue the campaign.

An interrupted run can replay observations. Downstream consumers should deduplicate by product ID and observation time. Narrow very large targets or reduce history retention if a campaign reaches its storage limit; `maxCampaignProducts` bounds campaign size.

### Live Woolworths comparison

```json
{
  "productUrls":["https://www.coles.com.au/product/1329781"],
  "compareWoolworths":true,"maxComparisonProducts":1,
  "maxComparisonCandidates":3,"comparisonBudgetUsd":0.10,
  "collectionTimeoutSecs":240
}
```

Automatic candidate discovery runs [Woolworths Products Price Monitor](https://apify.com/apivault_labs/woolworths-products-price-monitor). **Its Actor fees and resource usage are additional** to this run. `comparisonBudgetUsd` caps the child run; `COMPARISON` records its run/build and candidate count. Discovery is bounded and can return no exact match.

Alternatively supply public `woolworthsProductUrls` as live candidates. These pages are read directly without starting the comparison Actor. Similar names never establish identity: a valid normalized GTIN and equal explicit physical pack are both required. Ambiguous matches, invalid GTINs, unknown packs and missing prices stay explicitly unmatched/unknown. `VERIFIED_GTIN_AND_PACK` means verified product identity, not equivalent regional pricing. `referenceIsLive`, reference date/URL and scope identify freshness and source. `comparisonRegionComparable` remains false because the Woolworths default context is not a verified equivalent Coles region.

`comparisonProducts` still accepts user-provided dated AUD references with `colesProductId`, `referenceUrl`, `observedAt`, `price` and `samePackConfirmed: true`. These explicit mappings take precedence and are labelled `USER_CONFIRMED_SAME_PACK`, `referenceIsLive: false`. Check the referenced product and pack yourself. Full basket comparison requires known reference and Coles prices for every line.

### Store context and postcode

Use `storeId` to select a Coles store's online prices and online availability. The source must confirm the selected store on every collected page and return valid product data. Valid observations carry `storeContextStatus: VERIFIED_ONLINE_STORE`, `regionalPricesVerified: true` and an explicit `priceScope`. A store mismatch or missing collection produces an error; a supplied ID alone is insufficient. This does not promise physical shelf stock, member offers or checkout prices.

For example, use `storeId: "839"` for Coles Broadway or `storeId: "481"` for Coles Central Raine Square, Perth. Source observations confirmed different prices and online availability for identical products between these stores. Prices are time-dependent; these examples do not promise a particular current price.

```json
{
  "searchTerms": ["tomatoes"],
  "storeId": "839",
  "maxItems": 5,
  "maxPages": 1
}
```

Use `postcode` for automatic selection of a Coles supermarket **located in that exact postcode**. A public [Data-M8 store catalogue](https://data-m8.com/products/list-of-all-coles-supermarkets-in-australia-csv/) supplies candidates; Coles must confirm the selected store ID, postcode, state and supermarket identity on a current store page before collection. Every product page must then confirm the selected store ID.

If several stores are listed in a postcode, the lowest numeric store ID is chosen consistently. This is not a distance or delivery-service calculation. The catalogue inspected at release contains857 stores across639 postcodes in all eight states and territories; its publisher labels the snapshot November2024. New stores may be missing and old records may fail live verification. There is **no nearby-postcode or default-store fallback**. An unlisted postcode, inconsistent store identity or denied source produces an explicit error without paid product rows. Use a known `storeId` when your postcode has no verified listed store.

```json
{
  "postcode": "2000",
  "productUrls": ["https://www.coles.com.au/product/9032651"],
  "maxItems": 1
}
```

Postcode-selected rows include `postcode`, `storeId`, `storeName`, `storeState`, `storePostcode`, `postcodeSelection: EXACT_POSTCODE_VERIFIED` and `postcodeCandidateCount`. `SUMMARY.storeContext` records the selection. History retains the resolved store; if the chosen store changes, reuse requires a new `stateKey` so prices from different stores are not mixed. Choose either `postcode` or `storeId`, or omit both for default online observations.

### Output fields and data quality

| Field group | Selected fields | Interpretation |
| --- | --- | --- |
| Product identity | `productId`, `name`, `brand`, `packageSize`, `gtinNormalized`, `url` | GTIN is present only when valid; pack sizes are not guessed |
| Observed price | `price`, `wasPrice`, `savings`, `currency`, `observedAt`, `priceScope` | AUD observations in the stated online context |
| Unit price and promotions | `pricePerKg`, `pricePerLitre`, `discountPercent`, `offerDescription`, `multibuyQuantity`, `multibuyPrice` | Missing values remain unknown |
| Product details | `imageUrls`, `ingredients`, `allergens`, `nutrition`, `countryOfOrigin`, `variants` | Included where supplied by the product card |
| Monitoring | `changeType`, `previousPrice`, `priceChange`, `previousObservedAt`, `priceHistory` | Changes and statistics from your actual observations |
| Comparison | `comparisonStatus`, `referencePrice`, `referenceObservedAt`, `referenceIsLive`, `priceDifference` | Match status and freshness must accompany any price claim |

For example, a delivered product observation can contain the following subset. This is an **illustrative snapshot**, not a promise of today's price:

```json
{
  "productId": "9032651",
  "name": "Nutella Hazelnut Spread",
  "packageSize": "400g",
  "gtinNormalized": "09300698000216",
  "price": 6.70,
  "currency": "AUD",
  "observedAt": "2026-10-09T00:00:00Z",
  "priceScope": "Default online price; store and member prices not verified"
}
```

Use `SUMMARY.coverageComplete` to distinguish a complete requested collection from a limited batch. A successful limited run can return useful products while `SUMMARY.status` remains `PARTIAL`. Always inspect `ERRORS` before treating a zero-row dataset as an empty search.

### MCP, AI agents and exports

Actor identifier: `apivault_labs/coles-basket-price-monitor`. This Coles grocery scraper supports product search, specials research, shopping basket price comparison, dated supermarket price history and Coles vs Woolworths GTIN matching. Private candidates require authorized access and are not publicly discoverable yet.

Use the input schema and the JSON examples with an Apify MCP client, agent, API integration or scheduled run:

1. Read `SUMMARY` and `ERRORS` for success, coverage and delivered count.
2. Read the dataset for product cards, observed prices, changes and comparisons.
3. Read `BASKET`, `HISTORY`, `BASKET_HISTORY`, `PROGRESS` and optional `COMPARISON` for aggregates and state.
4. Preserve observed/reference timestamps, unknown fields, partial coverage and pricing scope in downstream answers.

For an Apify MCP client, select `apivault_labs/coles-basket-price-monitor` as the Actor tool. The hosted connection is `https://mcp.apify.com/?tools=apivault_labs/coles-basket-price-monitor`; authenticate with your own Apify token through the client's credential settings. Never put a token in shared prompts or URLs. Discover the current tool name and input schema with `tools/list`, then call the Actor tool with one of the input examples. Read the returned run ID and use the available run, dataset and key-value-store tools to inspect completion and outputs. The focused connection can expose these helper tools alongside the Actor tool. Authorized private discovery does not imply public Store visibility.

Apify supports JSON, CSV, Excel and other dataset exports. Zero rows after a source failure do not mean no matching products. Error-free complete zero-row searches represent empty results. Do not describe a partial scan as complete, a single snapshot as historical coverage or a user reference as live collection.

### Pricing and limits

The Coles result fee is **$0.001 per delivered product row ($1 per 1,000)** on every subscription plan. There is no start fee or separate fee for details, history records, basket summaries or error records. With incremental monitoring, unchanged products omitted from the dataset do not incur a result fee; collecting them still uses platform resources. Empty results and input errors produce no paid result rows.

Apify platform usage is paid separately by the user. Optional automatic Woolworths discovery also incurs that Actor's fees and resource usage within `comparisonBudgetUsd`; explicit candidate URLs avoid the child Actor. The result rate does not guarantee an all-inclusive run cost.

Access or rate limits can interrupt collection and are reported explicitly. This independent product is not endorsed by Coles or Woolworths. There is no guarantee of member pricing, physical stock, equivalent retailer regions or full catalogue coverage. Exact build/run verification and outstanding release gates are recorded privately.

### Frequently asked questions

#### Do I need a Coles account?

No Coles login is required. An Apify account is required to run the Actor. Member-only offers and checkout prices are outside its verified coverage.

#### Can I download Coles prices to Excel or CSV?

Yes. Export the product dataset using Apify's dataset export options. Basket and history summaries are separate JSON records listed in the run outputs.

#### Does a 30-day window include past prices automatically?

No. History begins with your first completed observation. Repeat the same campaign over time to build a real series. A 30-day statistics window summarizes observations you actually collected.

#### Can an AI agent find the cheapest supermarket basket?

It can use known basket subtotals and verified identical-product comparisons. It must retain unmatched lines, unknown prices, observation dates and the unverified regional context. This Actor does not claim the cheapest possible Australian basket.

#### What is the difference between product results and a full catalogue?

Searches and categories cover the requested targets within your limits. A partial scan does not represent the complete Coles catalogue. Continue a saved campaign or adjust its collection limits.

### Release notes — 9 October 2026

Verified selected-store online prices and availability, with explicit regional output fields and store mismatch checks. Automatic exact-postcode selection includes current Coles identity confirmation and explicit errors for unlisted or mismatched regions. Earlier improvements include grocery research and MCP guidance, pricing explanations and input validation.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords for Coles Australia product search. Leave empty for category/product/basket-only runs. If no targets are supplied, a small milk search is used.

## `categoryUrls` (type: `array`):

Public Coles browse or specials URLs. No complete catalogue guarantee.

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

Full public Coles product URLs.

## `basket` (type: `array`):

Explicit product URLs and positive quantities. Unknown prices remain unknown. Optional applyMultibuy supports validated repeated-SKU offers.

## `comparisonProducts` (type: `array`):

User-provided dated AUD reference prices mapped by colesProductId. Requires samePackConfirmed=true. This is not live collection of Woolworths.

## `incrementalMode` (type: `boolean`):

Output only changes by default. Advance the campaign baseline only after a complete cycle and fully delivered output.

## `emitUnchanged` (type: `boolean`):

Return unchanged observations in monitoring runs.

## `stateKey` (type: `string`):

Use a different key for different products, quantities or filters.

## `specialsOnly` (type: `boolean`):

Keep explicit source promotion flags.

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

Keep only explicit online availability values.

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

Products collected per run, including unchanged observations before incremental output filtering. Partial scans can checkpoint with resume.

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

Maximum newly collected listing pages per target per run. Continuations may also deliver observations saved by a previous run.

## `requestTimeoutSecs` (type: `integer`):

Bounded collection limit; an incomplete scan does not advance monitoring state.

## `collectionTimeoutSecs` (type: `integer`):

Bounded collection limit; an incomplete scan does not advance monitoring state.

## `includeDetails` (type: `boolean`):

Fetch GTIN, ingredients, allergens, nutrition, origin, images and variants where supplied. Additional product requests consume time.

## `trackHistory` (type: `boolean`):

Retain observed completed cycles in a named campaign. No synthetic daily history.

## `resume` (type: `boolean`):

Continue an incomplete collection with the same stateKey and targets. Previously delivered observations are skipped after a successful checkpoint.

## `applyMultibuy` (type: `boolean`):

Apply explicit validated N-for-price or Pick-any offers to repeated integer units of the same SKU. Excludes mixed SKU groups, members and weighted checkout pricing.

## `excludeSponsored` (type: `boolean`):

Remove products explicitly marked as sponsored.

## `compareWoolworths` (type: `boolean`):

Fetch details and match valid GTIN plus equal physical pack. Without explicit reference URLs, starts the Woolworths Products Price Monitor Actor; its Actor/resource charges are additional and capped by comparisonBudgetUsd.

## `brands` (type: `array`):

Case-insensitive exact brand names, not a fuzzy keyword match.

## `woolworthsProductUrls` (type: `array`):

Optional explicit public product detail URLs for compareWoolworths. Reads live pages without a child Actor. Identity still requires matching valid GTIN and equal pack.

## `historyDays` (type: `integer`):

Days included in statistics for actual collected observations; this does not retrieve past prices.

## `historyRetentionDays` (type: `integer`):

Retain actual completed-cycle observations for this many days, subject to the per-product entry limit.

## `maxHistoryEntries` (type: `integer`):

Maximum retained dated observations per product and shopping basket.

## `maxComparisonProducts` (type: `integer`):

Maximum collected Coles products used for bounded live Woolworths candidate discovery.

## `maxComparisonCandidates` (type: `integer`):

Maximum candidate count per selected comparison product. Exact matches are not guaranteed.

## `maxCampaignProducts` (type: `integer`):

Maximum unique products in a monitoring campaign. Narrow targets if the campaign reaches its storage limit.

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

Unknown values are excluded when this filter is supplied.

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

Unknown values are excluded when this filter is supplied.

## `minDiscountPercent` (type: `number`):

Unknown values are excluded when this filter is supplied.

## `comparisonBudgetUsd` (type: `number`):

Per-run cap for the optional Woolworths Actor. Includes its charges under Apify limits; this Coles run has separate resource usage.

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

Sorts only the collected output batch. Unit sorting separates $/kg and $/L, with unknown values last; it is not a global catalogue ranking.

## `promotionFilter` (type: `string`):

Half-price requires an observed previous/current discount or an explicitly reported percentage of at least 50%. Multibuy requires a reported promotion.

## `storeId` (type: `string`):

Select online prices and online availability for a known Coles store, such as 839 (Broadway) or 481 (Perth). Each product page must confirm the store. Physical shelf stock and member prices are not verified.

## `postcode` (type: `string`):

Automatically select a listed Coles supermarket in this exact four-digit postcode, then verify its identity with Coles. No nearby/default-store fallback; unlisted postcodes fail explicitly. If several stores match, the lowest numeric ID is chosen. Choose postcode or storeId, not both.

## Actor input object example

```json
{
  "searchTerms": [],
  "incrementalMode": false,
  "emitUnchanged": false,
  "stateKey": "default",
  "specialsOnly": false,
  "inStockOnly": false,
  "maxItems": 100,
  "maxPages": 3,
  "requestTimeoutSecs": 45,
  "collectionTimeoutSecs": 240,
  "includeDetails": false,
  "trackHistory": false,
  "resume": false,
  "applyMultibuy": false,
  "excludeSponsored": false,
  "compareWoolworths": false,
  "historyDays": 30,
  "historyRetentionDays": 365,
  "maxHistoryEntries": 100,
  "maxComparisonProducts": 5,
  "maxComparisonCandidates": 3,
  "maxCampaignProducts": 10000,
  "comparisonBudgetUsd": 0.1,
  "sortBy": "source",
  "promotionFilter": "all"
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

## `errors` (type: `string`):

No description

## `basket` (type: `string`):

No description

## `history` (type: `string`):

No description

## `basketHistory` (type: `string`):

No description

## `progress` (type: `string`):

No description

## `comparison` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("apivault_labs/coles-basket-price-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("apivault_labs/coles-basket-price-monitor").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 '{}' |
apify call apivault_labs/coles-basket-price-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apivault_labs/coles-basket-price-monitor"
        }
    }
}
```

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/jzIboAHgrrHhSfNiY/builds/5ato2chifj7OSDId5/openapi.json
