# Matalan Scraper — UK Fashion & Homeware Product Data (`studio-amba/matalan-scraper`) Actor

Scrape Matalan.co.uk product data — prices, was-prices, stock status, sizes and images across fashion, kids and homeware categories. Search by keyword or category URL. No login required.

- **URL**: https://apify.com/studio-amba/matalan-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Matalan Scraper — UK Fashion & Homeware Product Data

Scrape product data from [Matalan.co.uk](https://www.matalan.co.uk) — the UK value fashion and homeware retailer with 200+ stores. Get prices, was-prices, stock status per size, and images by keyword search or category URL.

### Why use this scraper?

Matalan has no public product API. This actor reads the same structured product data the site itself publishes for search engines (schema.org JSON-LD), so it's accurate to what's live on the site and doesn't rely on fragile page-layout scraping.

- **Price monitoring** — track current price and RRP ("was" price) across Matalan's clothing, kids and homeware ranges
- **Stock tracking** — per-size availability (in stock / out of stock), not just a single yes/no flag for the whole product
- **Catalog research** — new arrivals, discontinued lines, seasonal ranges
- **Competitive intelligence** — compare Matalan pricing against Primark, ASOS, Boohoo, Next and other UK value/fast-fashion retailers

### Features

- Scrape by **keyword search** or **category URL**
- Automatic **pagination** through search and category listings
- **Per-size stock and SKU** breakdown, not just an overall in-stock flag
- Was-price / RRP extraction for discounted items
- **Deduplication** — no duplicate product URLs in output
- No login, no cookies, no headless browser required — Matalan serves fully server-rendered pages with no active bot protection

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Search Matalan by keyword (e.g. `"jeans"`, `"bedding set"`). Takes precedence over `startUrls`. |
| `startUrls` | Array | No | Matalan category or product URLs to scrape instead of a search. Max 50 entries. |
| `maxResults` | Integer | No | Maximum number of products to return (default 100, max 5,000). |
| `proxyConfiguration` | Object | No | Proxy settings. The free automatic Apify proxy pool works — Matalan has no active bot protection as of this writing. |

#### Example input — search

```json
{
    "searchQuery": "jeans",
    "maxResults": 50
}
```

#### Example input — category

```json
{
    "startUrls": [
        { "url": "https://www.matalan.co.uk/c/womens/coats-and-jackets/" }
    ],
    "maxResults": 200
}
```

### Output

Each result is one product page (one colourway — Matalan gives each colour its own URL, sizes are the in-page variant).

| Field | Type | Description |
|-------|------|-------------|
| `name` | String | Product name |
| `brand` | String | Brand name — Matalan own-label or a stocked brand (e.g. Brave Soul) |
| `price` | Number | Current selling price |
| `originalPrice` | Number | null | RRP shown struck-through when the item is discounted |
| `currency` | String | Always `"GBP"` |
| `inStock` | Boolean | null | `true` if any size is in stock, `false` if all sizes are explicitly out of stock, `null` if the source gave no signal — never guessed |
| `sizes` | Array | null | Per-size breakdown: `size`, `sku`, `inStock` |
| `sku` | String | null | SKU of the default/first size variant |
| `productId` | String | null | Matalan product group ID (from the URL) |
| `category` | String | null | Category breadcrumb, e.g. `"Women's > Women's Coats & Jackets"` |
| `imageUrl` | String | null | Primary product image URL |
| `imageUrls` | Array | null | All product images, when more than one |
| `description` | String | null | Product description text |
| `url` | String | Full product page URL |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "name": "Mid Wash Paperbag Jeans",
    "brand": "Matalan",
    "price": 8,
    "originalPrice": 22,
    "currency": "GBP",
    "inStock": true,
    "sizes": [
        { "size": "8", "sku": "17439078", "inStock": true },
        { "size": "10", "sku": "17439079", "inStock": true },
        { "size": "22", "sku": "17439085", "inStock": true }
    ],
    "sku": "17439078",
    "productId": "17439077",
    "category": "Women's > Women's Jeans > Mid Wash Paperbag Jeans",
    "imageUrl": "https://main.thgimages.com/?url=https://ml.thcdn.com/productimg/original/17439077-6885312961838698.jpg&format=webp&width=1500&height=1500&fit=cover",
    "description": "A comfy update to a denim favourite, these mid wash paperbag jeans are designed to define the waist while offering everyday comfort...",
    "url": "https://www.matalan.co.uk/p/clothing/mid-wash-paperbag-jeans/17439077/",
    "scrapedAt": "2026-09-09T09:30:32.364Z"
}
```

### Cost estimate

Pay-per-result pricing: ~$0.005 per run start plus ~$0.002 per scraped product. A 100-product run costs roughly $0.21; a 1,000-product run roughly $2.01. Usage cost only settles in your Apify billing after the run reports **SUCCEEDED** — reading the dataset mid-run, before the run finishes, will undercount what you're actually charged.

### Limitations

- `category` is only as good as Matalan's own breadcrumb data. When you scrape via a category URL, the category is accurate. When you scrape via `searchQuery`, the category reflects the search results page context (e.g. `Results for "jeans"`), not a taxonomy category.
- `originalPrice` (RRP) is only populated when Matalan is actually showing a struck-through was-price on the page — full-price items correctly have no `originalPrice`.
- Data is scraped from the public website and may change without notice.
- Respect the website's terms of service and use responsibly.

### How to scrape Matalan data

1. Go to this actor's page on the [Apify Store](https://apify.com/store).
2. Click **Try for free** to open it in Apify Console.
3. Enter a search keyword, or paste a Matalan category URL into Start URLs.
4. Set the maximum number of results and adjust proxy settings if needed.
5. Click **Start** and wait for the run to finish.
6. Download your data in JSON, CSV, Excel, or connect it to your workflow via the [Apify API](https://docs.apify.com/api).

You can also schedule regular runs to track price and stock changes over time, or set up webhooks for real-time notifications when a run finishes.

### Related scrapers

Studio Amba runs scrapers for other UK fashion and value retailers, including Primark, ASOS, Boohoo, Debenhams and Marks & Spencer — useful for cross-retailer price comparison in the same vertical.

### Maintained by Studio Amba

We run 700+ scrapers for European websites, and the priority is keeping every one of them working. Automated runs test this actor against the live site and verify the output is complete. When the website changes, the scraper usually gets repaired the same day, without you having to report anything. Questions and issues go straight to the people who built it, and most get an answer the same day.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs, deduplication, delta detection, and delivery to your inbox, Google Sheets, or API, maintenance included. We can also build a custom version with your exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email <hello@studioamba.dev> for a free data sample.

# Actor input Schema

## `searchQuery` (type: `string`):

Search Matalan by keyword (e.g. 'jeans', 'bedding set', 'kids coat'). Uses the site's own search page. Takes precedence over Start URLs when both are set.

## `startUrls` (type: `array`):

Matalan category or product URLs to scrape instead of a search. Example: https://www.matalan.co.uk/c/womens/coats-and-jackets/ or a direct product URL like https://www.matalan.co.uk/p/clothing/black-faux-leather-jacket/17862702/. Ignored when Search Query is filled in.

## `maxResults` (type: `integer`):

Maximum number of products to return.

## `proxyConfiguration` (type: `object`):

Proxy settings. Matalan.co.uk has no active bot protection (confirmed live Sep 2026) — the free automatic Apify proxy pool works fine.

## Actor input object example

```json
{
  "searchQuery": "jeans",
  "startUrls": [
    {
      "url": "https://www.matalan.co.uk/c/womens/coats-and-jackets/"
    }
  ],
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "jeans",
    "startUrls": [
        {
            "url": "https://www.matalan.co.uk/c/womens/coats-and-jackets/"
        }
    ],
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/matalan-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 = {
    "searchQuery": "jeans",
    "startUrls": [{ "url": "https://www.matalan.co.uk/c/womens/coats-and-jackets/" }],
    "maxResults": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/matalan-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 '{
  "searchQuery": "jeans",
  "startUrls": [
    {
      "url": "https://www.matalan.co.uk/c/womens/coats-and-jackets/"
    }
  ],
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/matalan-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/matalan-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/PsgkMVfBtW2MpkQ4f/builds/Nj6HwSf03jFGPK12C/openapi.json
