# THE ICONIC Scraper - Fashion Products, Sizes, Stock & Reviews (`abotapi/theiconic-com-au-scraper`) Actor

Scrape THE ICONIC (theiconic.com.au) fashion products: name, brand, price, sale price, sizes with stock and price per size, images, colour variants, category path, materials, care and customer reviews. Search by keyword, category or brand, or paste product, search and sale links.

- **URL**: https://apify.com/abotapi/theiconic-com-au-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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

## THE ICONIC Scraper: Fashion Products, Prices, Sizes, Stock & Reviews

THE ICONIC Scraper turns THE ICONIC (theiconic.com.au) catalogue into a clean, structured dataset. Search by keyword, category or brand, or paste product, search, sale and new arrivals links. Every product comes back with its list, sale and final price, every size with its own stock and price, the full image gallery, colour variants, category path, materials, care, customer reviews and more. Export to JSON, CSV or Excel, or pull results straight into your app through the API.

### Why This Scraper?

- **Every size with its own stock and price.** Each product carries parallel size lists (`sizes`, `size_code`, `size_stock_status`, `size_price`, `size_sku`) and a `size_details` array, so you can see exactly which sizes are in stock and what each one costs.
- **Two ways in.** Search by keyword, category page or brand page with sort, price, gender, size, colour and on-sale filters, or paste links and read exactly those pages.
- **Rich product detail.** Full image gallery, colour variants with their own prices, description, composition and fabric, care label, category path, breadcrumbs, supplier, dispatch time and sustainability notes.
- **Sale and price clarity.** `price`, `special_price`, `final_price` and `markdown_price` (the reduced price when on sale) with an `is_on_sale` flag and a price range across sizes, in the store currency.
- **Customer reviews, ready to use.** Turn on reviews to attach each product's reviews (stars, title, text, date, reviewer, recommendation, helpful votes, extra ratings and store replies) plus its rating average, review count and per-star counts. A dedicated **Reviews** view lists one row per review.
- **Built for monitoring.** Turn on Incremental mode to track the same search over time and get only new and changed products, with an optional price-and-availability-only scope and compact update rows.
- **Light mode when you need it.** Switch off full product details to return just what the list shows, for quick market snapshots.

### Use Cases

- **Price and markdown tracking:** watch `final_price`, `special_price` and `is_on_sale` across brands and categories to catch new reductions first.
- **Stock monitoring:** follow per-size stock status to spot sell-outs and restocks for the sizes you care about.
- **Brand and range research:** build category-level datasets of assortment, colours, materials and pricing for a brand.
- **Catalogue enrichment:** pull images, descriptions, composition and care text for fashion product databases.
- **Review and sentiment analysis:** pull reviews with their star ratings for brands and categories to compare quality, fit and value.
- **Deal alert tools:** feed an app or bot with newly discounted products using Incremental mode.

### Data You Get

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

| Field | Example |
| --- | --- |
| `product_id` / `sku` | `"0000000"` / `"AB000AA00CD"` |
| `name` / `brand` | `"Sample Boxy Tee"` / `"Sample Label"` |
| `url` | Link to the product page |
| `price` / `special_price` / `final_price` / `markdown_price` | `60.0` / `45.0` / `45.0` / `45.0` |
| `currency` / `is_on_sale` | `"AUD"` / `true` |
| `price_range` | `{ "min_price": 60.0, "max_price": 60.0, "min_final_price": 45.0, "max_final_price": 45.0 }` |
| `image` / `images` / `thumbnails` | main image / full gallery / thumbnail list |
| `color_name` / `color_hex` | `"Black"` / `"#000000"` |
| `variants_count` / `variants_details` / `variants_message` | `3` / other colours with id, link, colour and prices / `"More colours available"` |
| `sizes` / `size_universal` / `size_code` | `["AU 6", "AU 8"]` / `["AU 6", "AU 8"]` / `["6", "8"]` |
| `size_stock_status` / `size_price` / `size_sku` | `["in-stock", "out-of-stock"]` / `[45.0, 45.0]` / one SKU per size |
| `size_details` | one object per size with sku, size, prices, stock status, dispatch time and supplier |
| `dispatch_time` / `supplier` | `"1-2 Working Days"` / `"Sample Supplier Pty Ltd"` |
| `gender` / `department` / `category` / `subcategory` | `"female"` / `"Clothing"` / `"T-Shirts & Singlets"` / `"Basic T-Shirts"` |
| `category_path` / `breadcrumbs` | `"Clothing/Tops/Tees"` / trail of name and link |
| `description` | Product description as plain text |
| `composition_material` / `fabric_material` / `measurements` | `"Main: 100% Cotton"` / `"Cotton"` / `"Length: 57cm"` (when the product lists them) |
| `care_label` / `size_fit` / `sizeguide_url` | `"Cold gentle machine wash."` / fit note / size guide link |
| `availability` / `has_stock` / `returnable` / `shipment_type` / `brand_type` / `activated_at` | `"InStock"` / `true` / `true` / `"WH"` / `"Private Label"` / `"2026-01-01 00:00:00"` |
| `sustainability` | `{ "groups": [{ "name": "Organic Materials", "description": "..." }], "items": [] }` |
| `reviews_rating` / `reviews_count` / `reviews_recommended_count` / `rating_distribution` / `reviews` | `4.7` / `120` / `110` / `[{ "stars": 5, "count": 90 }]` / nested list of reviews, newest first (when reviews are on), see below |
| `wishlist_count_text` / `is_sponsored` | `"1.2k+"` / `false` (from the list the product was found on) |
| `total_items_found` / `position` / `keyword` / `scraped_at` | `1000` / `1` / `"t-shirt"` / `"2026-01-01T00:00:00Z"` |
| `changeType` | `"NEW"` (also `"UPDATED"`, `"UNCHANGED"`, `"REAPPEARED"`, `"EXPIRED"`; incremental mode only) |

Each entry of `reviews` carries `review_id`, `review_title`, `review_text`, `review_rating` (1 to 5), `review_date`, `reviewer_name`, `review_recommended`, `review_helpful_votes`, `review_unhelpful_votes`, `review_secondary_ratings` (for example Quality and Value), `review_responses`, `review_locale` and `review_syndicated` (true when the review was collected on another store of the brand). Reviews are read from the same product SKU shown in `sku`; a product with no reviews returns an empty list and a count of 0. With reviews off, or Max reviews set to 0, the list is empty and the rating fields are null.

`composition_material`, `fabric_material`, `measurements`, `care_label` and `size_fit` are filled only when the product lists them, and `wishlist_count_text` and `is_sponsored` only when the product was found through a list. In incremental mode every row also carries `changedFields`, `firstSeenAt` and `lastSeenAt`, and compact update rows add `previousPrice`, `priceChanges` and `variantChanges`.

### How to Use

1. Pick a **mode**: `search` (keywords, categories, brands) or `url` (paste links).
2. For search mode, add **Search keywords**, **Category pages** or **Brand pages**, and optionally a sort, price range, gender, size, colour or on-sale filter.
3. Choose whether to **Fetch full product details** and **Fetch customer reviews**, set **Max reviews per product**, and set **Max items** to control run size and cost.
4. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it through the API.

**Search by keyword with filters, with each product's 20 newest reviews:**

```json
{
  "mode": "search",
  "searchTerms": ["t-shirt"],
  "gender": "female",
  "minPrice": 10,
  "maxPrice": 50,
  "sortBy": "price_low",
  "fetchReviews": true,
  "maxReviews": 20,
  "maxItems": 60
}
```

**Read a brand page, on sale only, list fields only:**

```json
{
  "mode": "search",
  "brands": ["aere"],
  "onSaleOnly": true,
  "fetchDetails": false,
  "maxItems": 120
}
```

**Paste a product link and a category link:**

```json
{
  "mode": "url",
  "urls": [
    "https://www.theiconic.com.au/womens-clothing-dresses/?sort=new",
    "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html"
  ]
}
```

**Scheduled price watch: only products whose price or stock moved, as short rows:**

```json
{
  "mode": "search",
  "searchTerms": ["running shoes"],
  "incrementalMode": true,
  "changeScope": "priceAndStock",
  "compactUpdates": true,
  "maxItems": 0
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

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

JavaScript:

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

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

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

#### Filters and pasted links

Sort, price, gender, size, colour and on-sale filters are applied by the site itself, so filtered-out products are never returned or charged. When you paste a listing link, the facets already in the link win; the filters in the input only fill in what the link leaves out. A pasted link that starts at a later page continues from that page. A pasted product link is always returned in full and is not affected by price filters.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one specific earlier run: paste its run or dataset id and this run skips products already collected there, returning only the new ones. An automatic checkpoint also protects a run against platform restarts.
- **Incremental mode** (`incrementalMode`) is for scheduling the same search or link set repeatedly. The first run returns everything as `NEW`. Later runs return only `NEW`, `UPDATED` and `REAPPEARED` products by default; unchanged products are not returned or billed unless `emitUnchanged` is on. `UPDATED` is decided by the product record: price, special price, final price, on-sale flag, availability, per-size stock and price, name, brand, colour, description, materials, category and the size list; `changedFields` names what moved. Images, the wishlist count, the position in the list, the keyword, the scrape time and the review fields are never compared, so a new review alone does not make a product `UPDATED`. Reviews are read only for products that are returned (new or changed ones, and unchanged ones are returned without reviews if `emitUnchanged` is on).
- **Price and availability only** (`changeScope: priceAndStock`) narrows `UPDATED` to price, special price, final price, markdown price, on-sale flag, price range, overall availability and each size's price and stock, ignoring descriptions, images and other details. **Compact update rows** (`compactUpdates`) shrink `UPDATED` and `EXPIRED` rows to ids, current price and stock plus `priceChanges` and `variantChanges`.
- **Expired products** (`emitExpired`) are produced only after a complete scan of a search, category or brand (not when Max items or Max pages capped it, a link started after page 1, or product links or the sitemap were used). A product leaving a list is not proof that it is unavailable; use `availability` and the size stock fields for that. `expireAfterMissedScans` waits for several complete scans in a row before reporting one.
- Max items counts products scanned, so the scope stays the same from run to run. Use **Ignore fields when detecting changes** (`ignoreFieldsForChanges`) to exclude more fields; ignored fields are still returned.

### 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 record, 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 → Settings → API & Integrations**.
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 item pages 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, category pages and brand pages) or `url` (paste product, search, category, brand, sale or sitemap links). |
| `searchTerms` | array | prefill only: `["t-shirt"]` | Words to search for, for example `t-shirt`. One search per entry. Search mode only. |
| `categories` | array | (none) | Category pages by plain name, for example `Women's dresses` or `Men's shoes`; a site address such as `womens-clothing-dresses` or a pasted category link also works. Search mode only. |
| `brands` | array | (none) | Brand pages by plain name, for example `Nike` or `Country Road`; a site address such as `aere` or a pasted brand link also works. Search mode only. |
| `sortBy` | string | `popularity` | `popularity`, `new`, `price_low`, `price_high`, `brand_asc` or `brand_desc`. Also fills the sort of a pasted listing link that has none. |
| `minPrice` | integer | (none) | Only keep products at or above this whole amount. Applied to searches and listings, not to a pasted product link. |
| `maxPrice` | integer | (none) | Only keep products at or below this whole amount. Applied to searches and listings, not to a pasted product link. |
| `gender` | string | `""` (all) | Optional: `female` or `male`. Empty keeps all. |
| `size` | string | (none) | Optional size, for example `M` or `10` (read as AU M or AU 10), or exactly as the site writes it, such as `AU 10` or `One Size`. |
| `colour` | string | (none) | Optional colour as the site writes it, for example `black`. |
| `onSaleOnly` | boolean | `false` | Only keep products that are currently reduced. |
| `urls` | array | default: one example link per supported shape (search, category, brand, product, sale, new arrivals, sitemap) | Links to read (URL mode). Product, search, category, brand, sale and new arrivals pages, and the product sitemap index. Facets carried in the link (price, gender, size, sort, sale) are applied and a link that starts at a later page continues from there. Links not recognised are skipped with a log warning. |
| `fetchDetails` | boolean | `true` | Open each product page to add every size with stock and price, all images, colour variants, description, materials, care and category path. Off returns only what the list shows. A pasted product link always returns full detail. |
| `fetchReviews` | boolean | `true` | Attach each returned product's customer reviews and rating summary to its row. Works with or without full product details. Off, or Max reviews 0, skips reviews entirely. |
| `maxReviews` | integer | `20` | Reviews attached per product, newest first (0 to 1000). Up to 100 reviews are read per request. `0` skips reviews: no review reads and no review charge. |
| `maxPages` | integer | (none) | Optional limit on result pages read per list (60 products per page). Empty or 0 means no page limit. It does not cap the run: it defers to Max items (default 20). |
| `maxItems` | integer | `20` | Total products to scan across the run. `0` is unlimited. Shared fairly between several searches or links. In incremental mode this counts products scanned. |
| `proxy` | object | Apify Proxy, Residential | Connection used to load pages. Keep the default for the most reliable results, or supply your own proxy URLs. |
| `resumeFromRunId` | string | (none) | Optional run id or dataset id. Products already in that dataset are skipped, so this run returns only new products. |
| `incrementalMode` | boolean | `false` | Recurring monitoring of the same setup. Returns only `NEW`, `UPDATED` and `REAPPEARED` products on repeat runs. See "Resume and recurring updates". |
| `stateKey` | string | (none) | Optional, incremental mode only. Names or shares a monitoring campaign. Left empty, a key is derived from the search, links and filters. |
| `baselineDatasetId` | string | (none) | Optional, incremental mode only. An earlier full dataset of this Actor used as the starting point so the first incremental run returns only products that changed since then. |
| `emitUnchanged` | boolean | `false` | Incremental mode only. Also return (and bill) unchanged products, marked `UNCHANGED`. |
| `emitExpired` | boolean | `false` | Incremental mode only. Also return (and bill) products no longer found, marked `EXPIRED`, only after a complete scan. |
| `changeScope` | string | `all` | Incremental mode only. `all` or `priceAndStock` (only price, sale flag, availability and per-size price and stock decide `UPDATED`). |
| `compactUpdates` | boolean | `false` | Incremental mode only. `UPDATED` and `EXPIRED` rows become short, with `priceChanges` and `variantChanges`. NEW rows stay complete. |
| `expireAfterMissedScans` | integer | `1` | Incremental mode only, with Emit expired. A product expires only after missing from this many complete scans in a row. |
| `ignoreFieldsForChanges` | array | (none) | Incremental mode only. Extra field names that must not make a product `UPDATED`; dotted names such as `size_details.dispatch_time` ignore a field inside each size. Ignored fields are still returned. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record. Lists are shortened for brevity.

```json
{
  "product_id": "0000000",
  "sku": "AB000AA00CD",
  "name": "Sample Boxy Tee",
  "brand": "Sample Label",
  "url": "https://www.theiconic.com.au/sample-boxy-tee-0000000.html",
  "price": 60.0,
  "special_price": 45.0,
  "final_price": 45.0,
  "markdown_price": 45.0,
  "currency": "AUD",
  "is_on_sale": true,
  "price_range": { "min_price": 60.0, "max_price": 60.0, "min_final_price": 45.0, "max_final_price": 45.0 },
  "image": "https://img1.theiconic.com.au/sample-image-1.jpg",
  "images": ["https://img1.theiconic.com.au/sample-image-1.jpg", "https://img1.theiconic.com.au/sample-image-2.jpg"],
  "color_name": "Black",
  "color_hex": "#000000",
  "variants_count": 2,
  "variants_message": "More colours available",
  "sizes": ["AU 6", "AU 8"],
  "size_code": ["6", "8"],
  "size_stock_status": ["in-stock", "out-of-stock"],
  "size_price": [45.0, 45.0],
  "size_sku": ["AB000AA00CD-0000001", "AB000AA00CD-0000002"],
  "dispatch_time": "1-2 Working Days",
  "supplier": "Sample Supplier Pty Ltd",
  "gender": "female",
  "department": "Clothing",
  "category": "T-Shirts & Singlets",
  "subcategory": "Basic T-Shirts",
  "category_path": "Clothing/Tops/Tees",
  "breadcrumbs": [{ "name": "Women", "url": "https://www.theiconic.com.au/women/" }],
  "description": "A relaxed boxy tee in soft organic cotton.",
  "composition_material": "Main: 100% Cotton",
  "fabric_material": "Cotton",
  "measurements": "Length: 57cm",
  "care_label": "Cold gentle machine wash.",
  "availability": "LimitedAvailability",
  "has_stock": true,
  "returnable": true,
  "shipment_type": "WH",
  "brand_type": "Private Label",
  "activated_at": "2026-01-01 00:00:00",
  "reviews_rating": 4.7,
  "reviews_count": 120,
  "reviews_recommended_count": 110,
  "rating_distribution": [{ "stars": 5, "count": 90 }, { "stars": 4, "count": 20 }],
  "reviews": [
    {
      "review_id": "0000001",
      "review_title": "Great fit",
      "review_text": "Soft fabric and true to size.",
      "review_rating": 5,
      "review_date": "2026-01-01T00:00:00.000+00:00",
      "reviewer_name": "Sample",
      "review_recommended": true,
      "review_helpful_votes": 2,
      "review_unhelpful_votes": 0,
      "review_secondary_ratings": { "Quality": 5, "Value": 5 },
      "review_responses": [],
      "review_locale": "en_AU",
      "review_syndicated": false
    }
  ],
  "total_items_found": 1000,
  "position": 1,
  "keyword": "t-shirt",
  "scraped_at": "2026-01-01T00:00:00Z"
}
```

### Plan Requirement

Pages are loaded through the **Connection** setting. This site refuses datacenter connections, so the default is Apify Residential Proxy, which is the recommended choice for the most reliable results; keep it, or supply your own proxy URLs. Apify free plans do not include residential proxies: on a free plan the log shows a boxed notice and the run continues on a backup datacenter connection, where some or most pages may still fail. Residential traffic is billed to your Apify plan, and each run has a built-in traffic limit of roughly 5,500 products with details; if it is reached the run stops early, says so in its status message, and keeps what it collected. When a lighter connection is able to serve pages, the actor uses it automatically. A run that could not load a single page ends as FAILED with a clear status message, never as a quiet empty success.

### FAQ

#### How much does it cost?

You pay a small per-run start fee, plus per product returned, plus a detail charge for every product whose own product page was read in addition to a list (a pasted product link is one page and carries no extra detail charge), plus a review charge for every returned product that has at least one review attached. **Fetch full product details** defaults to on; turn it off for list fields only with no detail charge. **Fetch customer reviews** defaults to on; turn it off, or set **Max reviews per product** to 0, for no review reads and no review charge. Products without reviews are never charged the review event. Rows that incremental mode suppresses (unchanged products) and compact update rows are never charged the detail event. The **Pricing** tab shows the current rates, and **Max items** caps the size of any run.

#### Is it legal to scrape THE ICONIC?

This actor collects only publicly available product data. You are responsible for how you use it: follow the site's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product descriptions and photos may be subject to third-party rights.

#### Can I get only new or changed products on a schedule?

Yes. Schedule the actor from the **Schedules** tab with the same search or links and turn on **Incremental mode**. Each run then returns only new and updated products by default, and unchanged ones are not billed.

#### What is the difference between Resume and Incremental mode?

**Resume** continues one specific earlier run so it is not re-collected or re-charged. **Incremental mode** is for running the same search again and again on a schedule and wanting only what changed; it remembers its own state, so you never paste a run id.

#### Why did my run fail instead of finishing empty?

A run that could not load a single page ends as FAILED so a connection problem is never confused with a genuine empty result. The status message says which case it is: the proxy connection was refused for this account (check your plan, or the credentials of your own proxy URLs), no results because the backup connection could not load the pages, a non-residential Apify proxy group was chosen that this site refuses (switch to residential), or a general connection problem (try again later). A search that loads fine but matches nothing completes as a normal successful run.

#### Why do sponsored products appear in my results?

Some lists show sponsored placements. They are real products, so they are returned and marked with `is_sponsored: true` when the product was found through a list.

#### 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.

#### URL mode: supported links and default

| Link shape | Example |
| --- | --- |
| Search | `https://www.theiconic.com.au/catalog/?q=t-shirt` |
| Search with filters | `https://www.theiconic.com.au/catalog/?q=t-shirt&price=10-50&gender=female&size=M` |
| Category | `https://www.theiconic.com.au/womens-clothing-dresses/` |
| Category, later page and sort | `https://www.theiconic.com.au/womens-clothing-dresses/?page=2&sort=new` |
| Category, on sale | `https://www.theiconic.com.au/womens-clothing-dresses/?special_price=1&sort=popularity` |
| Brand page | `https://www.theiconic.com.au/aere` |
| Brand page, on sale | `https://www.theiconic.com.au/aere/?page=1&sort=popularity&special_price=1` |
| Product page | `https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html` |
| Product page with tracking parameters | `https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html?utm_source=x&utm_medium=y` |
| Sale page | `https://www.theiconic.com.au/sale/` |
| New arrivals | `https://www.theiconic.com.au/new-arrivals/` |
| New Zealand product page | `https://www.theiconic.co.nz/leigh-boxy-tshirt-2498829.html` |
| Product sitemap index | `https://sitemap.theiconic.com.au/sitemap_index_product.xml` |

Any other link is skipped with a warning in the log. The **Links** field has a default list with one example of each shape, so a URL-mode run started with the field untouched reads those examples; clear it or paste your own links to read only those.

#### Output views

The dataset has four views in the Console: **Products** (every field), **Sizes and stock** (per-size lists and details), **Reviews** (one row per customer review, next to the product columns) and **Changes** (incremental mode `changeType`, `changedFields` and compact update rows).

#### Billing

Each run pays one start event. Each product pushed to the dataset is one dataset-item event. A product whose own page was read in addition to a list also pays the detail-enrichment event, once per product, charged right after it is pushed. Suppressed incremental rows, compact update rows and failed fetches are never charged the detail event. A product that has at least one review attached also pays the review-enrichment event once, charged right after it is pushed, whether it carries 1 review or many (Max reviews per product bounds how many); products with no reviews, unchanged rows, compact update rows and runs with reviews off are never charged it. Current rates are on the **Pricing** tab.

### 🔗 Want more fashion data?

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

<table>
<tr><td>👗 <a href="https://apify.com/abotapi/next-uk-product-scraper"><b>Next.co.uk Scraper</b></a><br>Scrape Next.co.uk: keyword search, category and product-listing walks, full product...</td><td>👗 <a href="https://apify.com/abotapi/24s-com-scraper"><b>24S Scraper</b></a><br>Scrape 24S luxury fashion by category, filters, or URL. Extract brand, name, price...</td></tr>
<tr><td>👗 <a href="https://apify.com/abotapi/mango-com-scraper"><b>Mango Scraper</b></a><br>Scrape Mango (shop.mango.com) fashion products: current price plus strike-through Rebajas...</td><td>👗 <a href="https://apify.com/abotapi/zozotown-scraper"><b>ZOZOTOWN</b></a><br>Scrape ZOZOTOWN (zozo.jp), Japan's largest fashion marketplace: name, brand, JPY price...</td></tr>
<tr><td>👗 <a href="https://apify.com/abotapi/yesstyle-com-scraper"><b>YesStyle Scraper</b></a><br>Scrape YesStyle products by keyword or URL. Extract prices, discounts, ratings, stock...</td><td>👗 <a href="https://apify.com/abotapi/gap-us-shopping-scraper"><b>Gap US Scraper</b></a><br>Scrape Gap US (gap.com) clothing and fashion products by category. Extract product names...</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/theiconic-com-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: build the lists to read from keywords, category pages and brand pages below. URL: paste product, search, category, brand and sale links, or the product sitemap, and read exactly those.

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

Words to search for, for example t-shirt or running shoes. One search per entry. Search mode only.

## `categories` (type: `array`):

Category pages by plain name, for example Women's dresses, Men's shoes or Beauty skincare. A category address such as womens-clothing-dresses or a pasted category link works too. One list per entry, read alongside the keywords. Search mode only.

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

Brand pages by plain name, for example Nike, Country Road or AERE. A brand address such as aere or a pasted brand link works too. One list per entry, read alongside the keywords. Search mode only.

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

Order of each list. Also fills the sort of pasted listing links that do not already carry one.

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

Only keep products priced at or above this whole amount (in the store currency). Applied by the site's own price filter to searches and listings. Does not apply to a pasted product link.

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

Only keep products priced at or below this whole amount (in the store currency). Applied by the site's own price filter to searches and listings. Does not apply to a pasted product link.

## `gender` (type: `string`):

Optionally narrow listings to one gender. Leave empty for all.

## `size` (type: `string`):

Optionally narrow listings to one size, for example M or 10 (written for you as AU M or AU 10), or exactly as the site writes it, for example AU 10 or One Size.

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

Optionally narrow listings to one colour as the site writes it, for example black.

## `onSaleOnly` (type: `boolean`):

Only keep products that are currently reduced. Applies to searches and listings.

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

Paste links from theiconic.com.au (or theiconic.co.nz): product pages, search results, category pages, brand pages, the sale and new arrivals pages, or the product sitemap index. Filters you ticked on the site and carried in the link (price, gender, size, sort, sale) are applied, and a link that starts at a later page continues from that page. Search filters set above only fill in what a link does not already say. Links the actor does not recognise are skipped with a warning in the log. URL mode only.

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

On: open every product page to add all sizes with stock and price, every image, colour variants, description, materials, care, category path and more. Off: return only what the list shows (name, brand, price, image, colour message, wishlist count), which is much lighter.

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

Attach each returned product's customer reviews to its row as a nested list, with the rating average, review count, per-star counts and recommended count. Works with or without full product details. Charged once per product row that has at least one review, never for products without reviews, for unchanged rows left out in incremental mode, or when switched off.

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

How many reviews to attach to each product, newest first, when Fetch customer reviews is on. Use 0 to skip reviews entirely (no review reads, no rating summary, no review charge). Up to 100 reviews are read per request, so higher values read more pages per product.

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

Optional limit on result pages read per list (60 products per page). Leave empty or 0 for no page limit. This does not cap the run: it defers to Max items, which is the only default cap (20).

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

Total products to scan across all searches and links. 0 = unlimited, up to the built-in traffic limit (roughly 5,500 detailed products per run). With several searches or links the budget is shared fairly between them. In incremental mode this counts products scanned, not only changed rows returned.

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

Connection used to load pages. Residential Apify Proxy (the default) gives the most reliable results; datacenter exits are refused by this site. Choosing your own proxy URLs or no proxy is respected as-is.

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

Optional. Id of an earlier run of this Actor (or a dataset id). Products already in that dataset are skipped, so this run returns only new products. For recurring monitoring of the same setup use Incremental mode below instead.

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

Turn on for daily or scheduled monitoring. The first run returns every matching product as NEW. Later runs compare each product with the last run (price, special price, final price, on-sale flag, availability and per-size stock and price, plus name, brand, colour, description, materials, category and sizes) and return only NEW, UPDATED and REAPPEARED products; an UPDATED row's changedFields names what moved. Images, the wishlist count, listing position, keyword and scrape time are never compared. Turn on Emit unchanged or Emit expired only when you also want those rows (they are billed). State is kept per search, link and filter setup; use State key to name or share a campaign.

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

Optional. Name this monitoring campaign to keep its state stable, or to share state across differently configured runs. Leave empty to derive a key from the search, links and filters so different setups never mix.

## `baselineDatasetId` (type: `string`):

Optional. Pick the dataset of an earlier full run of this Actor as the starting point so your first incremental run returns only products that changed since then. Pick it unedited. Used only on the first run for a state key; cannot be combined with Resume.

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

Off by default. Also return products that did not change, marked UNCHANGED. This returns and bills rows you already have.

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

Off by default. Also return products that were present before but are no longer found in the list, marked EXPIRED. Only after a complete scan (not when Max items or Max pages capped it, a link started after page 1, or product links or the sitemap were used). A product leaving a list is not proof it is unavailable; use the stock fields for availability.

## `changeScope` (type: `string`):

All fields (default): any change to the product record other than the always-ignored fields returns an UPDATED row. Price and availability only: only price, special price, final price, on-sale flag, overall availability and each size's price and stock return UPDATED; descriptions, images, materials and other details never do. Switching this on an existing campaign continues from its saved baseline.

## `compactUpdates` (type: `boolean`):

Off by default. UPDATED and EXPIRED rows become short: ids, link, name, current price and stock, plus priceChanges and variantChanges with the old and new value of each moved price or stock field per size. NEW rows always carry the full record. Extra detail fees are not charged for compact rows.

## `expireAfterMissedScans` (type: `integer`):

Only used with Emit expired. A product is marked EXPIRED only after it was missing from this many complete scans in a row (default 1). Raise it (for example 3) so a product that briefly drops out of a list is not reported. A product that comes back resets the count.

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

Optional. Field names to leave out of UPDATED detection, in addition to the built-in handling (images, wishlist count, position, keyword, scrape time and the review fields never count). To ignore a field inside each size while still tracking size price and stock, use a dotted name such as size_details.dispatch_time. Ignoring size_details itself would hide size price and stock changes.

## `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": [
    "t-shirt"
  ],
  "categories": [],
  "brands": [],
  "sortBy": "popularity",
  "gender": "",
  "onSaleOnly": false,
  "urls": [
    "https://www.theiconic.com.au/catalog/?q=t-shirt",
    "https://www.theiconic.com.au/womens-clothing-dresses/",
    "https://www.theiconic.com.au/womens-clothing-dresses/?page=2&sort=new",
    "https://www.theiconic.com.au/womens-clothing-dresses/?special_price=1&sort=popularity",
    "https://www.theiconic.com.au/catalog/?q=t-shirt&price=10-50&gender=female&size=M",
    "https://www.theiconic.com.au/aere",
    "https://www.theiconic.com.au/aere/?page=1&sort=popularity&special_price=1",
    "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html",
    "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html?utm_source=x&utm_medium=y",
    "https://www.theiconic.com.au/sale/",
    "https://www.theiconic.com.au/new-arrivals/",
    "https://www.theiconic.co.nz/leigh-boxy-tshirt-2498829.html",
    "https://sitemap.theiconic.com.au/sitemap_index_product.xml"
  ],
  "fetchDetails": true,
  "fetchReviews": true,
  "maxReviews": 20,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "changeScope": "all",
  "compactUpdates": false,
  "expireAfterMissedScans": 1,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

## `sizes` (type: `string`):

No description

## `reviews` (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": [
        "t-shirt"
    ],
    "categories": [],
    "brands": [],
    "urls": [
        "https://www.theiconic.com.au/catalog/?q=t-shirt",
        "https://www.theiconic.com.au/womens-clothing-dresses/",
        "https://www.theiconic.com.au/womens-clothing-dresses/?page=2&sort=new",
        "https://www.theiconic.com.au/womens-clothing-dresses/?special_price=1&sort=popularity",
        "https://www.theiconic.com.au/catalog/?q=t-shirt&price=10-50&gender=female&size=M",
        "https://www.theiconic.com.au/aere",
        "https://www.theiconic.com.au/aere/?page=1&sort=popularity&special_price=1",
        "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html",
        "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html?utm_source=x&utm_medium=y",
        "https://www.theiconic.com.au/sale/",
        "https://www.theiconic.com.au/new-arrivals/",
        "https://www.theiconic.co.nz/leigh-boxy-tshirt-2498829.html",
        "https://sitemap.theiconic.com.au/sitemap_index_product.xml"
    ],
    "fetchReviews": true,
    "maxReviews": 20,
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "changeScope": "all",
    "compactUpdates": false,
    "expireAfterMissedScans": 1,
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/theiconic-com-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": ["t-shirt"],
    "categories": [],
    "brands": [],
    "urls": [
        "https://www.theiconic.com.au/catalog/?q=t-shirt",
        "https://www.theiconic.com.au/womens-clothing-dresses/",
        "https://www.theiconic.com.au/womens-clothing-dresses/?page=2&sort=new",
        "https://www.theiconic.com.au/womens-clothing-dresses/?special_price=1&sort=popularity",
        "https://www.theiconic.com.au/catalog/?q=t-shirt&price=10-50&gender=female&size=M",
        "https://www.theiconic.com.au/aere",
        "https://www.theiconic.com.au/aere/?page=1&sort=popularity&special_price=1",
        "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html",
        "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html?utm_source=x&utm_medium=y",
        "https://www.theiconic.com.au/sale/",
        "https://www.theiconic.com.au/new-arrivals/",
        "https://www.theiconic.co.nz/leigh-boxy-tshirt-2498829.html",
        "https://sitemap.theiconic.com.au/sitemap_index_product.xml",
    ],
    "fetchReviews": True,
    "maxReviews": 20,
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "changeScope": "all",
    "compactUpdates": False,
    "expireAfterMissedScans": 1,
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/theiconic-com-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": [
    "t-shirt"
  ],
  "categories": [],
  "brands": [],
  "urls": [
    "https://www.theiconic.com.au/catalog/?q=t-shirt",
    "https://www.theiconic.com.au/womens-clothing-dresses/",
    "https://www.theiconic.com.au/womens-clothing-dresses/?page=2&sort=new",
    "https://www.theiconic.com.au/womens-clothing-dresses/?special_price=1&sort=popularity",
    "https://www.theiconic.com.au/catalog/?q=t-shirt&price=10-50&gender=female&size=M",
    "https://www.theiconic.com.au/aere",
    "https://www.theiconic.com.au/aere/?page=1&sort=popularity&special_price=1",
    "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html",
    "https://www.theiconic.com.au/leigh-boxy-tshirt-2498829.html?utm_source=x&utm_medium=y",
    "https://www.theiconic.com.au/sale/",
    "https://www.theiconic.com.au/new-arrivals/",
    "https://www.theiconic.co.nz/leigh-boxy-tshirt-2498829.html",
    "https://sitemap.theiconic.com.au/sitemap_index_product.xml"
  ],
  "fetchReviews": true,
  "maxReviews": 20,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "changeScope": "all",
  "compactUpdates": false,
  "expireAfterMissedScans": 1,
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/theiconic-com-au-scraper --silent --output-dataset

```

## MCP server setup

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