# Target AU Scraper – Products, Prices & Reviews (`abotapi/target-au-scraper`) Actor

Scrape products and customer reviews from Target.com.au. Search by keyword or use product/category URLs with sorting and filters. Returns name, brand, price, OnePass price, ratings, review text and stats, colours, sizes, images, category, stock, and variations.

- **URL**: https://apify.com/abotapi/target-au-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 4 total users, 0 monthly users, 96.6% runs succeeded, 1 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/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

## Target Australia Scraper: Products, Prices & Reviews

Target Australia Scraper turns target.com.au into a clean product data API. Search by keyword or paste product, category and search links, and get back one flat record per product with current price, was/original price, savings amount and percent, stock, colour and size variants, images, category breadcrumbs, and, when you switch it on, the full rating breakdown and individual customer reviews. Filter to On sale, Clearance or New arrivals, sort by price or rating, then export to JSON, CSV or Excel, or read the results straight through the API.

### Why This Scraper?

- **Two ways in.** Search by keyword, or paste a mix of product, category and search URLs from target.com.au in one run.
- **One flat record, every mode.** A pasted product link is resolved through the same product backend as a search result, so it carries the exact same fields, not a stripped-down detail shape.
- **Real discounts, never invented.** Was-price, savings amount and percent, and the on-special flag are only set when the site itself publishes a genuine strike-through reduction or a clearance classification.
- **Specials and offers built in.** Scope a search or pasted category/search URL to On sale, Clearance or New arrivals, store-wide or combined with a keyword.
- **Ratings and reviews on demand.** Switch on detail enrichment to attach the full rating distribution and individual, per-review text to every product, and pay only for the products you enrich.
- **Filters and sorting that actually apply.** Brand, colour and a price range work the same way in search mode and a pasted category or search URL; a pasted single product URL only respects the price range. Sort by relevance, latest, rating or price.
- **Resume a big crawl.** Point a new run at a previous run or dataset ID and it returns only the products it hasn't collected yet, so topping up a full-catalogue pull never re-pays for duplicates.

### Use Cases

- **Price and discount tracking:** monitor the was/current price, savings and on-special status of a product line over time.
- **Specials and clearance monitoring:** pull On sale, Clearance or New arrivals collections on a schedule to catch new markdowns first.
- **Catalogue and assortment research:** walk a category or a keyword across the whole result set to map brands, price bands and stock levels.
- **Voice-of-customer analysis:** collect ratings, review text and sub-ratings for a product range to spot recurring praise or complaints.
- **Competitive benchmarking:** compare price, promo status and review scores for the same products against other retailers you scrape separately.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `id` | `"W1234567890"` |
| `name` / `title` | `"Sample Linen Shirt"` / `"Sample Brand Sample Linen Shirt"` |
| `url` | `"https://www.target.com.au/p/sample-linen-shirt/12345678"` |
| `brand` | `"Sample Brand"` |
| `price` | `45.0` |
| `wasPrice` | `60.0` (`null` when the product isn't reduced) |
| `savingsAmount` / `savingsPercent` | `15.0` / `25` (both `null` when there's no genuine reduction) |
| `isOnSpecial` / `promoLabel` | `true` / `null` (`promoLabel` is `"Clearance"` on a clearance line, otherwise `null`) |
| `onePassPrice` | `null` (set only when the site publishes a OnePass member price) |
| `currency` | `"AUD"` |
| `onSale` / `clearance` | `true` / `false` |
| `description` | `"A lightweight, breathable everyday shirt."` |
| `features` | `["Regular fit", "Button-through front", "Curved hemline"]` |
| `careInstructions` | `["Warm delicate machine wash", "Do not bleach"]` |
| `category` / `breadcrumbs` | `"Clothing & Accessories > Clothing > Shirts & Tops"` / `["Clothing & Accessories", "Clothing", "Shirts & Tops"]` |
| `topLevelCategory` | `"Women"` |
| `availability` / `inStock` | `"NORMAL"` / `true` |
| `colour` | `"White"` |
| `image` / `images` | first image URL / full image URL array |
| `variantCount` / `variations` | `1` / `[{ "colour": "White", "price": 45.0, "wasPrice": 60.0, "inStock": true }]` |
| `averageRating` / `reviewCount` | `4.8` / `18` |
| `reviews` | array of `{ rating, title, body, author, date, verifiedPurchase, helpfulCount, subRatings }` (present only when reviews were collected) |
| `onlineDate` | `"2026-05-24"` |

Every record also carries `baseUrl`, `merchDepartmentCode`, `productType`, `groupIds`, `colourVariantCode`, `sizeVariantCode`, `availableOnlineQty`, `availableStoreQty`, and boolean flags for `bulkyProduct`, `targetExclusive`, `onlineExclusive`, `onePassExclusive` and `advFreeDeliveryEligible`. When detail enrichment collects reviews, each product also gets `reviewStats` (the full aggregate: total reviews, recommended/not-recommended counts, helpful-vote count, first/last review dates, sub-rating averages) and `ratingDistribution`, `recommendedCount` and `reviewsCollected`. Products with no reviews simply leave the rating and review fields empty; they are never faked.

### How to Use

1. Pick a **mode**: `search` (keywords) or `url` (paste product, category or search links).
2. Fill in the fields for that mode, add any filters (brand, colour, price range, specials collection) and a sort order.
3. Turn on **Fetch ratings and reviews** if you want review text and rating breakdowns, and set **Max products** to control run size and cost.
4. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it through the API.

#### URL mode: supported link shapes

| Link shape | Example | Behaviour |
| --- | --- | --- |
| Search page | `https://www.target.com.au/search?text=shirt` | Walks the keyword results. |
| Search page, paginated | `https://www.target.com.au/search?text=shirt&page=2` | Starts at the page in the link (partial scope: earlier pages are not collected). |
| Search page, sorted | `https://www.target.com.au/search?text=shirt&sortBy=price-asc` | Uses the link's `sortBy` while **Sort by** is left at Relevance. |
| Search page, no `www` | `https://target.com.au/search?text=shirt` | Same as the search page. |
| Category leaf page | `https://www.target.com.au/c/baby/sleep/monitors/W118762` | Walks the category by its trailing id. |
| Category page, paginated | `https://www.target.com.au/c/women/jackets-coats/W1507165?page=2` | Starts at the page in the link. |
| Product, numeric code | `https://www.target.com.au/p/x/72544778` | One product, matched on its code. |
| Product, W-code | `https://www.target.com.au/p/anything/W2250321627` | One product, matched on its code whatever the slug; a code the site does not know is skipped with a warning, never replaced by an unrelated product. |

A bare department page such as `/c/women/` has no category id; it is resolved against the site's category list when possible, otherwise it is skipped with a warning in the log (never a silent empty result).

**Unedited URL field:** in URL mode, if you leave the **URLs** field as it is, the run scrapes one example link per shape above (fifteen links, including the extra variants of search, category and product links), and **Max products** is split across them. Replace the list with your own links to scrape only those. In URL mode, an empty URL list ends the run as FAILED with the message "No URLs provided"; paste at least one link or switch to search mode.

**Brand and colour:** type the name as shown on target.com.au. Case and spacing are matched to the storefront's exact value, and a warning is logged when no option matches.

**Search with filters, sorted by price:**

```json
{
  "mode": "search",
  "searchTerms": ["linen shirt"],
  "brand": "Target Woman",
  "colour": "White",
  "minPrice": 20,
  "maxPrice": 60,
  "sortBy": "price-asc",
  "maxItems": 30,
  "fetchReviews": false
}
```

**Store-wide clearance, no keyword:**

```json
{
  "mode": "search",
  "specialsCategory": "clearance",
  "maxItems": 50,
  "fetchReviews": false
}
```

**Paste links and attach reviews:**

```json
{
  "mode": "url",
  "urls": [
    "https://www.target.com.au/p/sample-ceramic-mug/98765432",
    "https://www.target.com.au/c/kitchen-dining/mugs/W2000000"
  ],
  "fetchReviews": true,
  "maxReviews": 20,
  "maxItems": 40
}
```

**Whole catalogue for a keyword, no caps:**

```json
{
  "mode": "search",
  "searchTerms": ["kids toys"],
  "maxItems": 0,
  "maxPages": 0,
  "fetchReviews": false
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/target-au-scraper").call(run_input={"mode": "search", "searchTerms": ["shirt"], "maxItems": 20})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["name"], product["price"], product["isOnSpecial"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/target-au-scraper').call({ mode: 'search', searchTerms: ['shirt'], maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Caps and full-catalogue runs

**Max products** (`maxItems`) stops the whole run once that many products are pushed; `0` means unlimited. With more than one search term or pasted URL, that cap is split evenly across them, so a run doesn't exhaust the budget on the first term alone. **Max pages per search** (`maxPages`) is a safety cap on pages walked per term or category; leave it at `0` to walk every page, since the walk already stops on its own once the storefront's own result total is reached or a page repeats.

#### Recurring monitoring (incremental mode)

Turn on **Incremental mode** to schedule the same search daily. The first run returns every matching product as NEW. Later runs return only NEW and UPDATED products (the `changedFields` list names what moved: price, was-price, promo, stock and so on), plus REAPPEARED products, and EXPIRED products once the whole search has been walked to its end. Reviews, ratings, images (including variation images), links and the scrape time never trigger UPDATED. Unchanged products are not returned, not enriched and not billed unless you switch on **Also return unchanged products**. Every returned row, including UNCHANGED and EXPIRED rows, is billed as a normal result; the review-enrichment charge applies only to NEW, UPDATED and REAPPEARED rows with reviews fetched. EXPIRED rows are never emitted for capped, partial, single-product or resumed runs; state is kept per search or URL setup, or per **State key**. A search-mode run with no term that falls back to the example search never saves or expires state.

#### Resuming a large run

Pass a previous run's ID (or its dataset ID) as **Resume from a previous run**. The actor reads every product ID already in that dataset, skips them, and this run then returns only the products it hasn't collected before, a delta you can append to the earlier dataset. This is separate from the automatic checkpoint the actor keeps for its own migrations and Resurrects: if a run is interrupted by the platform, resuming it automatically continues from the exact page it left off, without needing `resumeFromRunId`.

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

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each product, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify then Settings then API & Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (keywords) or `url` (paste product, category, or search URLs). |
| `searchTerms` | array | no default (prefill: `["shirt"]`) | Keywords to search (search mode). If search mode gets no term and no specials category, the run searches the example term `shirt` instead of returning nothing. |
| `urls` | array | one example per supported link shape (fifteen links, see the URL mode table) | Product, category or search URLs to walk (URL mode). |
| `sortBy` | string | `relevance` | `relevance`, `newest`, `rating`, `price-asc`, `price-desc`, or `brand`. |
| `specialsCategory` | string | `""` (no promo filter) | Limit to a promotional collection: on-sale, clearance, or new-arrivals. |
| `brand` | string | no default | Filter to one brand; case and spacing are matched to the storefront value. |
| `colour` | string | no default | Filter to one exact colour facet value. |
| `onlyWithPrice` | boolean | `false` | Skip products with no price before reviews are fetched and before anything is delivered or billed. |
| `minPrice` | integer | no default | Only keep products at or above this price. |
| `maxPrice` | integer | no default | Only keep products at or below this price. |
| `fetchReviews` | boolean | `true` | Attach ratings, review stats and individual reviews to each product (detail enrichment). |
| `maxReviews` | integer | `20` | Cap on reviews captured per product. `0` disables reviews. |
| `maxItems` | integer | `20` | Total products to return across all searches or URLs (up to 1,000,000). `0` = unlimited. |
| `maxPages` | integer | `0` | Safety cap on pages walked per search term or category. `0` = walk every page, up to a hard limit of 1000 pages per search or URL. |
| `resumeFromRunId` | string | no default | ID of a previous run (or dataset) of this actor; already-collected products are skipped. |
| `incrementalMode` | boolean | `false` | Recurring monitoring: return only NEW, UPDATED, REAPPEARED and EXPIRED products against the last run. |
| `stateKey` | string | no default | Name a monitoring campaign to keep or share its state. With Incremental mode on and your own State key, a search-mode run needs a search term, URL or specials category: with none, the run stops with an input message and collects nothing. |
| `emitUnchanged` | boolean | `false` | Incremental mode only: also return unchanged products as plain rows (billed as results). |
| `emitExpired` | boolean | `true` | Incremental mode only: return products that disappeared after a complete scan (billed as results). |
| `ignoreFieldsForChanges` | array | no default | Incremental mode only: field names excluded from change detection. |
| `proxy` | object | `{"useApifyProxy": true}` | Apify Proxy configuration. |
| `mcpConnectors` | array | no default | Optional: send a summary of each product to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | no default | Notion connector only: page under which product pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. |

Every row also carries `query` (the search term or URL that produced it), `retailer` (always Target), `source` (target.com.au), `fetchedAt` (ISO timestamp), `imageUrl`, and `priceText` (formatted price). `unitPriceText` is always null because the storefront data carries no unit-price text; `saleStory` mirrors `promoLabel`.

#### Dataset views

The Output tab offers four views over the same records: **Products Overview** (name, brand, price, was-price, stock), **Reviews** (one row per review, flattened from the `reviews` array), **Pricing & specials** (price, was-price, savings, promo label, `priceText`) and **Stock & availability** (in-stock flag, online and store quantities, variants).

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "kind": "product",
  "id": "W1234567890",
  "name": "Sample Linen Long Sleeve Shirt",
  "title": "Sample Brand Sample Linen Long Sleeve Shirt",
  "url": "https://www.target.com.au/p/sample-linen-long-sleeve-shirt/12345678",
  "baseUrl": "https://www.target.com.au/p/sample-linen-long-sleeve-shirt/12345678",
  "brand": "Sample Brand",
  "price": 45.0,
  "wasPrice": 60.0,
  "onePassPrice": null,
  "currency": "AUD",
  "onSale": true,
  "isOnSpecial": true,
  "savingsAmount": 15.0,
  "savingsPercent": 25,
  "promoLabel": null,
  "onlineOnlyPrice": false,
  "clearance": false,
  "description": "A lightweight, breathable everyday shirt.",
  "features": ["Regular fit", "Button-through front", "Curved hemline"],
  "careInstructions": ["Warm delicate machine wash", "Do not bleach"],
  "category": "Clothing & Accessories > Clothing > Shirts & Tops",
  "breadcrumbs": ["Clothing & Accessories", "Clothing", "Shirts & Tops"],
  "topLevelCategory": "Women",
  "merchDepartmentCode": "WMN01",
  "productType": "SHIRT",
  "availability": "NORMAL",
  "groupIds": ["W951361"],
  "colour": "White",
  "colourVariantCode": "WHT",
  "sizeVariantCode": "M",
  "inStock": true,
  "availableOnlineQty": 25,
  "availableStoreQty": null,
  "bulkyProduct": false,
  "targetExclusive": true,
  "onlineExclusive": false,
  "newArrival": false,
  "onePassExclusive": false,
  "advFreeDeliveryEligible": true,
  "onlineDate": "2026-05-24",
  "image": "https://assets.target.com.au/transform/00000000-0000-0000-0000-000000000000/sample_1",
  "images": [
    "https://assets.target.com.au/transform/00000000-0000-0000-0000-000000000000/sample_1",
    "https://assets.target.com.au/transform/11111111-1111-1111-1111-111111111111/sample_2"
  ],
  "variations": [
    { "variationId": "V1", "colour": "White", "colourVariantCode": "WHT", "sizeVariantCode": "M", "price": 45.0, "wasPrice": 60.0, "savingsAmount": 15.0, "savingsPercent": 25, "inStock": true, "url": "https://www.target.com.au/p/sample-linen-long-sleeve-shirt/12345678", "image": "https://assets.target.com.au/transform/00000000-0000-0000-0000-000000000000/sample_1" }
  ],
  "variantCount": 1,
  "searchMode": "search",
  "averageRating": 4.8,
  "reviewCount": 18,
  "ratingDistribution": { "5": 15, "4": 3 },
  "recommendedCount": 17,
  "reviewsCollected": 1,
  "reviewStats": {
    "totalReviews": 18,
    "averageRating": 4.8,
    "ratingDistribution": { "5": 15, "4": 3 },
    "recommendedCount": 17,
    "notRecommendedCount": 1,
    "helpfulVoteCount": 9,
    "firstReviewDate": "2025-11-02T08:00:00.000+00:00",
    "lastReviewDate": "2026-03-19T12:18:09.000+00:00",
    "subRatings": { "Quality": 4.6, "Value For Money": 4.5 }
  },
  "reviews": [
    {
      "id": "100000001",
      "rating": 5,
      "title": "Great everyday shirt",
      "body": "Comfortable and true to size.",
      "author": "Sample Reviewer",
      "location": "Victoria",
      "date": "2026-03-19T12:18:09.000+00:00",
      "verifiedPurchase": true,
      "isRecommended": true,
      "isRatingsOnly": false,
      "helpfulCount": 3,
      "notHelpfulCount": 0,
      "isSyndicated": false,
      "syndicatedFrom": null,
      "pros": null,
      "cons": null,
      "subRatings": { "Quality": 5, "Value For Money": 5 }
    }
  ]
}
```

### Plan Requirement

The default automatic proxy pool (datacenter) returned real product, search and category data for target.com.au in our checks, so no residential proxy is required. If the default pool keeps rejecting pages, the run retries on a residential Australian connection (within the same page request, including when the default pool answers with a page that cannot be read), which uses your own Apify plan's residential traffic and which Apify free plans do not include; if that connection is refused, the log says "The selected connection is unavailable to this run. Apify free plans do not include residential proxies." and the run returns to the default pool. If the proxy connection itself is refused for your account, or no page can be read at all, the run fails with a clear message instead of returning an empty dataset. You can also select a proxy group directly under Connection. You are charged per product returned, plus detail enrichment units for each product whose review feed was read: one unit per started block of 10 delivered reviews, minimum 1 when the feed was read (10 reviews is 1 unit, 11 is 2, 25 is 3). A product whose review feed could not be read adds no enrichment unit. The **Pricing** tab shows the current rates.

### FAQ

#### How much does it cost?

You pay per product returned to the dataset, plus detail enrichment units where it ran (**Fetch ratings and reviews** on and **Max reviews** above 0): one unit per started block of 10 delivered reviews, minimum 1 when the review feed was read, even if the product has no reviews. Nothing is charged when the feed could not be read. The **Pricing** tab shows the current rates. Use **Max products** to cap the cost of any run.

#### Is it legal to scrape target.com.au?

This actor collects only publicly available product data. You are responsible for how you use it: follow target.com.au's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product facts like price and stock are generally not protected, but images, descriptions and review text may be subject to third-party rights.

#### Does turning on reviews always add a charge?

No. Ratings and reviews are only fetched, and only billed, when **Fetch ratings and reviews** is on and **Max reviews per product** is above `0`. This applies the same way to every mode, including a single pasted product URL: turn the toggle off (or set Max reviews to `0`) and no review fetch happens and no enrichment charge is added for that run.

#### Why did my pasted product URL return nothing?

A single product URL resolves to exactly one record. If a price range (**Min price** / **Max price**) is set and that product's price falls outside it, that one product is dropped, so the run legitimately returns zero items. Clear or widen the price range to confirm.

#### Can I top up a large crawl without paying twice?

Yes. Pass a previous run's ID (or its dataset ID) as **Resume from a previous run**; the actor skips every product already in that dataset and returns only the new ones. Combine both datasets for the full set.

#### Why did my run fail instead of returning an empty dataset?

If a result-page fetch is rejected and zero products were collected, the run stops with a clear error message so "no results for these terms" is never confused with "the connection never worked". Resurrect the failed run from the Console in a few minutes; it resumes from the exact page that was rejected, unlike a brand-new run, which starts from the beginning. If some products were already collected before a mid-run rejection, you still get those, with a status message noting the run was only partial.

#### 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 product summaries into Notion, Linear or Airtable.

### 🔗 Want more e-commerce data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🛒 <a href="https://apify.com/abotapi/kmart-au-scraper"><b>Kmart Scraper</b></a><br>Scrape products and customer reviews from Kmart.com.au. Search by keyword or use...</td><td>🛒 <a href="https://apify.com/abotapi/costco-au-scraper"><b>Costco AU Scraper</b></a><br>Scrape Costco.com.au products by keyword or product, search and category URLs. Extract...</td></tr>
<tr><td>🛒 <a href="https://apify.com/abotapi/myer-au-scraper"><b>Myer Scraper</b></a><br>Scrape Myer (myer.com.au) department-store products: name, brand, price, was-price...</td><td>🛒 <a href="https://apify.com/abotapi/harvey-norman-scraper"><b>Harvey Norman Scraper</b></a><br>Scrape Harvey Norman Australia products: name, brand, price, was-price / discount...</td></tr>
<tr><td>🛒 <a href="https://apify.com/abotapi/chemistwarehouse-com-au-scraper"><b>Chemist Warehouse AU</b></a><br>Scrape chemistwarehouse.com.au products with prices, RRP, discounts, stock, images...</td><td>🛒 <a href="https://apify.com/abotapi/amazon-au-scraper"><b>Amazon Australia Product &amp; Reviews Scraper</b></a><br>Scrape Amazon Australia (amazon.com.au) products and customer reviews. Search by keyword...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/target-au-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

search = provide search terms and filters. url = paste product, category, or search URLs and walk them.

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

One or more keywords to search, e.g. shirt, towel, kids toys. Leave empty (with no specials category) to search the example term shirt.

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

Paste product, category, or search URLs from target.com.au. Multi-URL supported. Filter fields still apply. A ?page=N in a pasted link starts the walk at that page (partial scope), and a ?sortBy= in the link is honoured while Sort by is left at Relevance. Left unedited, this field scrapes one example per URL shape (fifteen links). An empty list in URL mode stops the run with an input message.

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

Order of results within each search or pasted category/search URL. Ignored for a pasted single product URL.

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

Limit results to a promotional collection: On sale keeps reduced products with a strike-through was-price, Clearance keeps run-out lines, New arrivals keeps the latest range. Applies to search terms and to pasted category or search URLs. Leave terms empty in search mode to walk the whole collection. Ignored for a pasted single product URL.

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

Filter to one brand. Type the name as shown on target.com.au (e.g. Target Woman); case and spacing are matched to the storefront's exact value, and a loud warning is logged when nothing matches. Ignored for a pasted single product URL.

## `colour` (type: `string`):

Filter to one colour. Type the name as shown on target.com.au (e.g. White); case and spacing are matched to the storefront's exact value, and a loud warning is logged when nothing matches. Ignored for a pasted single product URL.

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

Only keep products at or above this price. Applies to search, category and search URLs, and also to a pasted single product URL (the product is dropped when outside the range).

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

Only keep products at or below this price. Applies to search, category and search URLs, and also to a pasted single product URL (the product is dropped when outside the range).

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

Skip products that carry no price. They are dropped before reviews are fetched and before anything is delivered or billed.

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

Attach ratings, review stats and individual reviews to each product (detail enrichment).

## `maxReviews` (type: `integer`):

Cap on reviews captured per product. 0 disables reviews.

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

Total products to return across all searches or URLs. 0 = unlimited. Capped at 1,000,000.

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

Safety cap on pages walked per search term or category. 0 = walk every page (the run still stops naturally once the storefront's own result total is reached or a page repeats). A hard limit of 1000 pages per search or URL always applies.

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

Apify Proxy configuration. The default automatic (datacenter) pool works well; residential is used only as a reliability fallback.

## `resumeFromRunId` (type: `string`):

Optional. ID of a previous run of this actor (or a dataset ID). Products already in that dataset are skipped, so this run returns only NEW products (a delta). Combine both runs' datasets for the full set. Max products then counts only the new products.

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

Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs compare every product against the last run (title, brand, colour, price, was-price and discount, promo label, stock and availability) and return only NEW and UPDATED products; an UPDATED row's changedFields names exactly what moved. Reviews, ratings, images, links and the scrape time are never compared. Unchanged products are not returned, not enriched and not billed. State is kept separately for each search or URL setup; use State key to name or share a campaign. Products that disappear are returned once as EXPIRED (see 'Return products that disappeared') and a product that comes back is returned as REAPPEARED.

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

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to derive a key automatically from the search terms or URLs and the filters. With Incremental mode on and a State key set, search mode needs a search term, URL or specials category; otherwise the run stops with an input message.

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

Incremental mode only. Return products that did not change, as plain rows (no reviews fetch, no detail-enrichment charge). Each returned UNCHANGED row counts as a returned result and is billed under the per-result event. Off by default: unchanged products are skipped.

## `emitExpired` (type: `boolean`):

Incremental mode only. When a run walks its whole search to the end, return products seen earlier that are no longer listed, with changeType EXPIRED. Each returned EXPIRED row counts as a returned result and is billed under the per-result event (no detail-enrichment charge). Never emitted for capped, partial, single-product or resumed runs.

## `ignoreFieldsForChanges` (type: `array`):

Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (reviews, ratings, images, links and scrape time never trigger UPDATED). Nested fields can be given as dotted paths. Ignored fields are still returned in the row.

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

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify then Settings then API & Integrations, then select it here. Notion gets a page-per-item export; other connectors get a best-effort write. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify.

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

URL or id of the Notion page under which item pages are created. Required only for the Notion export.

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

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

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "shirt"
  ],
  "urls": [
    "https://www.target.com.au/search?text=shirt",
    "https://www.target.com.au/search?text=shirt&page=2",
    "https://www.target.com.au/search?text=shirt&sortBy=price-asc",
    "https://target.com.au/search?text=shirt",
    "https://www.target.com.au/c/baby/sleep/monitors/W118762",
    "https://www.target.com.au/c/women/jackets-coats/W1507165?page=2",
    "https://www.target.com.au/p/x/72544778",
    "https://www.target.com.au/p/anything/W2250321627",
    "https://www.target.com.au/search?text=shirt&sEngine=c",
    "https://www.target.com.au/c/women",
    "https://www.target.com.au/c/women/jackets-coats/W1507165?sortBy=price-asc",
    "https://www.target.com.au/search?q=shirt&page=1",
    "https://www.target.com.au/search?text=shirt&q=%3Arelevance%3Abrand%3ATarget",
    "https://www.target.com.au/p/72544778",
    "https://www.target.com.au/p/x/72544778?variant=72544779"
  ],
  "sortBy": "relevance",
  "specialsCategory": "",
  "onlyWithPrice": false,
  "fetchReviews": true,
  "maxReviews": 20,
  "maxItems": 20,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": true,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `pricing` (type: `string`):

No description

## `stock` (type: `string`):

No description

## `changes` (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",
    "searchTerms": [
        "shirt"
    ],
    "urls": [
        "https://www.target.com.au/search?text=shirt",
        "https://www.target.com.au/search?text=shirt&page=2",
        "https://www.target.com.au/search?text=shirt&sortBy=price-asc",
        "https://target.com.au/search?text=shirt",
        "https://www.target.com.au/c/baby/sleep/monitors/W118762",
        "https://www.target.com.au/c/women/jackets-coats/W1507165?page=2",
        "https://www.target.com.au/p/x/72544778",
        "https://www.target.com.au/p/anything/W2250321627",
        "https://www.target.com.au/search?text=shirt&sEngine=c",
        "https://www.target.com.au/c/women",
        "https://www.target.com.au/c/women/jackets-coats/W1507165?sortBy=price-asc",
        "https://www.target.com.au/search?q=shirt&page=1",
        "https://www.target.com.au/search?text=shirt&q=%3Arelevance%3Abrand%3ATarget",
        "https://www.target.com.au/p/72544778",
        "https://www.target.com.au/p/x/72544778?variant=72544779"
    ],
    "proxy": {
        "useApifyProxy": true
    },
    "incrementalMode": false,
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/target-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",
    "searchTerms": ["shirt"],
    "urls": [
        "https://www.target.com.au/search?text=shirt",
        "https://www.target.com.au/search?text=shirt&page=2",
        "https://www.target.com.au/search?text=shirt&sortBy=price-asc",
        "https://target.com.au/search?text=shirt",
        "https://www.target.com.au/c/baby/sleep/monitors/W118762",
        "https://www.target.com.au/c/women/jackets-coats/W1507165?page=2",
        "https://www.target.com.au/p/x/72544778",
        "https://www.target.com.au/p/anything/W2250321627",
        "https://www.target.com.au/search?text=shirt&sEngine=c",
        "https://www.target.com.au/c/women",
        "https://www.target.com.au/c/women/jackets-coats/W1507165?sortBy=price-asc",
        "https://www.target.com.au/search?q=shirt&page=1",
        "https://www.target.com.au/search?text=shirt&q=%3Arelevance%3Abrand%3ATarget",
        "https://www.target.com.au/p/72544778",
        "https://www.target.com.au/p/x/72544778?variant=72544779",
    ],
    "proxy": { "useApifyProxy": True },
    "incrementalMode": False,
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/target-au-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",
  "searchTerms": [
    "shirt"
  ],
  "urls": [
    "https://www.target.com.au/search?text=shirt",
    "https://www.target.com.au/search?text=shirt&page=2",
    "https://www.target.com.au/search?text=shirt&sortBy=price-asc",
    "https://target.com.au/search?text=shirt",
    "https://www.target.com.au/c/baby/sleep/monitors/W118762",
    "https://www.target.com.au/c/women/jackets-coats/W1507165?page=2",
    "https://www.target.com.au/p/x/72544778",
    "https://www.target.com.au/p/anything/W2250321627",
    "https://www.target.com.au/search?text=shirt&sEngine=c",
    "https://www.target.com.au/c/women",
    "https://www.target.com.au/c/women/jackets-coats/W1507165?sortBy=price-asc",
    "https://www.target.com.au/search?q=shirt&page=1",
    "https://www.target.com.au/search?text=shirt&q=%3Arelevance%3Abrand%3ATarget",
    "https://www.target.com.au/p/72544778",
    "https://www.target.com.au/p/x/72544778?variant=72544779"
  ],
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/target-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/target-au-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/SUJoKU9seyWFuicrf/builds/sywNBhpguu6EKBVK0/openapi.json
