# Rugs.com Area Rug Catalog & Price Scraper (`maximedupre/rugs`) Actor

Collect public Rugs.com rugs from the full catalog or submitted product, collection, and category pages. Save one row per rug with source-backed size and SKU variants, current prices, availability, and product details. Filter and sort by price, rating, sale, stock, color, material, or review count.

- **URL**: https://apify.com/maximedupre/rugs.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** E-commerce, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.45 / 1,000 rug products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### 🧶 Find Rugs.com rugs with current prices

Rugs.com shoppers, retail researchers, and developers can use this Actor to collect public rug data. It saves one row per rug product with size and SKU variants, current prices, availability, and source-backed product details, so you can compare catalog data with less manual page work.

Choose full catalog discovery or submit product, collection, or category pages. Apply price, rating, sale, stock, color, or material filters and sort by current price, rating, or review count.

**Use cases**

- Find source products by availability with [**In Stock Rugs**](https://apify.com/maximedupre/rugs/examples/in-stock-rugs).
- Check a price-limited product list with [**Rugs Under 100**](https://apify.com/maximedupre/rugs/examples/rugs-under-100).
- Narrow products by material with [**Wool Rugs**](https://apify.com/maximedupre/rugs/examples/wool-rugs).
- Narrow products by color with [**Blue Rugs**](https://apify.com/maximedupre/rugs/examples/blue-rugs).
- Narrow products by sale flag with [**Rugs On Sale**](https://apify.com/maximedupre/rugs/examples/rugs-on-sale).
- Explore a broader product category with [**Area Rugs**](https://apify.com/maximedupre/rugs/examples/area-rugs).

#### 📦 See each rug with its size variants

Each dataset row describes one eligible Rugs.com product. The row keeps source-backed identity and merchandising fields, links to the product and primary image when available, review signals, and a `variants` array with size, SKU, price, availability, and physical details. Optional source fields are left out when Rugs.com does not provide them.

If the same source product is found again from another submitted page, the first eligible match is saved and later matches are ignored. The saved row describes that first match rather than every later submitted value.

#### ▶️ Run a Rugs.com catalog or page search

Choose `full_catalog` to discover products from the public Rugs.com catalog, or choose `product_or_collection_pages` and add public product, collection, or category URLs. Filters and sorting apply to either choice. Leave **Maximum results** empty to return all available results until the source is exhausted, or enter a positive integer to stop after that many saved rows.

**Run choices**

- Full catalog discovery for public catalog results.
- Product, collection, or category pages for focused retrieval.
- Price, rating, sale, stock, color, and material filters.
- Sort order by current price, customer rating, or review count.

#### ⚙️ Input

Choose a discovery method and add filters when needed. The URL list is used only with `product_or_collection_pages`. The form starts with `full_catalog`; the example below also sets `maxItems` to `3`.

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `discoveryMethod` | string | Chooses `full_catalog` or `product_or_collection_pages`. |
| `startUrls` | array of objects | Adds public Rugs.com product, collection, or category pages for page discovery. |
| `startUrls[].url` | URL string | Gives one public Rugs.com page URL inside a `startUrls` object. |
| `minimumPrice` | number | Keeps rugs with a current variant price at or above this USD amount. Leave blank for no minimum. |
| `maximumPrice` | number | Keeps rugs with a current variant price at or below this USD amount. Leave blank for no maximum. |
| `minimumRating` | number | Keeps rugs with a customer rating from 0 to 5 at or above this value. Leave blank for no rating filter. |
| `saleStatus` | string | Keeps rugs marked on sale or not on sale. Leave blank to include both. |
| `stockStatus` | string | Keeps rugs marked in stock or out of stock. Leave blank to include both. |
| `colors` | array of strings | Keeps rugs whose source-backed color data matches any entered value. Leave blank for all colors. |
| `materials` | array of strings | Keeps rugs whose source-backed material data matches any entered value. Leave blank for all materials. |
| `sortBy` | string | Orders rows by current price, customer rating, or review count. Leave blank to keep source order. |
| `maxItems` | integer | Stops after this many saved rows. Leave it empty to return all available results until the source is exhausted. |

**Input example**

This is the smallest successful common input from a full-catalog run:

```json
{
  "discoveryMethod": "full_catalog",
  "maxItems": 3
}
```

#### 🧾 Output

The Output tab links to the default dataset. The dataset contains one product shape. Required product fields are always present; other fields appear when Rugs.com provides them.

**Run output**

| Field | Type | What it does |
|---|---|---|
| `dataset` | link string | Opens the discovered rug rows in the default dataset. |

**Rug product rows**

| Field | Type | What it does |
|---|---|---|
| `productId` | string | Identifies the Rugs.com product. |
| `title` | string | Gives the source product title. |
| `collection` | string | Gives the collection name when available. |
| `type` | string | Gives the source rug type when available. |
| `style` | string | Gives the source style when available. |
| `materials` | array of strings | Lists source-backed material names when available. |
| `construction` | string | Gives the source construction method when available. |
| `colors` | array of strings | Lists source-backed color names when available. |
| `categoryPath` | array of strings | Lists source categories from broadest to most specific when available. |
| `productUrl` | URL string | Links to the canonical public Rugs.com product page when available. |
| `imageUrl` | URL string | Links to the primary source-hosted product image when available. |
| `rating` | number | Gives the customer rating on a 0 to 5 scale when available. |
| `reviewCount` | integer | Gives the source review count when available. |
| `variants` | array of objects | Lists the source-backed size and SKU variants for the product. |
| `variants[].sku` | string | Identifies one size variant. |
| `variants[].size` | string | Gives one source size label. |
| `variants[].price` | number | Gives the current variant price in USD. |
| `variants[].compareAtPrice` | number | Gives the variant compare-at price in USD when available. |
| `variants[].discount` | string | Gives the source discount label when available. |
| `variants[].availability` | string | Gives the source availability status. |
| `variants[].dimensions` | object | Groups the variant length, width, and unit when available. |
| `variants[].dimensions.length` | number | Gives the variant length in the named unit. |
| `variants[].dimensions.width` | number | Gives the variant width in the named unit. |
| `variants[].dimensions.unit` | string | Names the unit for the variant dimensions. |
| `variants[].pileHeight` | object | Groups the pile height value and unit when available. |
| `variants[].pileHeight.value` | number | Gives the pile height in the named unit. |
| `variants[].pileHeight.unit` | string | Names the unit for the pile height value. |

**Example rug product row**

This genuine row comes from a successful full-catalog run. The example is shortened: the `"..."` string in `variants` stands for the remaining real size variants.

```json
{
  "productId": "3129005",
  "title": "4' x 6' Easy-Clean Solid Indoor / Outdoor Rug",
  "collection": "Outdoor Solid",
  "type": "rug",
  "materials": [
    "100% Polypropylene"
  ],
  "construction": "Machine Made",
  "colors": [
    "Light Gray",
    "Gray"
  ],
  "categoryPath": [
    "All Rugs",
    "Solid Rugs",
    "Outdoor Solid"
  ],
  "productUrl": "https://rugs.com/light-gray-4x6-outdoor-solid-area-rug-6258010",
  "imageUrl": "https://assets.rugimg.com/rug_generations/58434ec6-e83f-4135-81ec-bf3c0986387f.jpg?width=1160&quality=75&auto=webp,avif",
  "rating": 4.69,
  "reviewCount": 1058,
  "variants": [
    {
      "sku": "6258010",
      "size": "4' x 6'",
      "price": 109,
      "availability": "Online",
      "compareAtPrice": 209,
      "discount": "48% off",
      "dimensions": {
        "length": 4,
        "width": 6,
        "unit": "ft"
      },
      "pileHeight": {
        "value": 0.16666666666666666,
        "unit": "in"
      }
    },
    "..."
  ]
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The primary event costs `$0.00045` for each saved rug product row. Set **Maximum results** to a positive integer when you want a bounded run.

#### 🔌 Integrations

Open the default dataset in Apify Console or use its dataset API link from the Output tab. The dataset can be exported for catalog research, price checks, and other workflows that use structured product data.

Watch the Actor walkthrough:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What happens when the same rug appears more than once?

The first eligible match is saved. Later matches for the same source rug are ignored, so the saved row describes the first match rather than every submitted page.

##### Can I use a product URL or a collection page?

Yes. Choose Product or collection pages and add public Rugs.com product, collection, or category URLs. Product pages target specific rugs; collection and category pages can return broader source results.

##### What does Full catalog do?

It discovers products from the public Rugs.com catalog. Leave Maximum results blank to return all available results until the source is exhausted, or set a positive limit.

##### Can I filter and sort the rows?

Yes. Price, rating, sale status, stock status, color, and material filters work with either discovery method. Sort by current price, rating, or review count.

##### Are prices and availability historical?

No. Rows reflect public source data at run time. This Actor does not provide historical price or availability tracking or change alerts.

##### Why are some fields missing?

Optional attributes are kept only when Rugs.com provides them. Missing source data is left unasserted instead of being filled in.

##### Does the Actor download product images?

No. It returns source-hosted image links when available. It does not download or mirror image files.

##### Does it compare other retailers?

No. It reads Rugs.com only. Use separate runs for separate configurations rather than combining independent search batches.

### 📝 Changelog

**v0.0** (28-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~rugs/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [John Lewis Product Scraper](https://apify.com/maximedupre/john-lewis-product-scraper) helps compare product and variant prices, stock, and specifications on another retailer.
- [Amazon Price Tracker](https://apify.com/maximedupre/amazon-price-tracker) helps check current Amazon prices and availability as a second retail source.
- [Trendyol Scraper: Products & Reviews](https://apify.com/maximedupre/trendyol-scraper) helps research marketplace products, ratings, sellers, and reviews.
- [MercadoLibre Search Scraper](https://apify.com/maximedupre/mercado-libre-search-scraper) helps compare marketplace product prices, sellers, shipping, and search positions.
- [Rugs.com Area Rug Catalog & Price Scraper](https://apify.com/jungle_synthesizer/rugs-com-area-rug-catalog-price-scraper) offers another Rugs.com catalog and price research workflow.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose one way to find rug SKU records. Full catalog scans the public catalog. The Product or collection pages option uses the URLs you enter.

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

Add one or more public Rugs.com product, collection, or category page URLs. Use product pages for specific rugs and collection or category pages for broader results. This field is required when Find rugs by is Product or collection pages.

## `minimumPrice` (type: `number`):

Only include rugs with a current variant price at or above this USD amount. Leave blank for no minimum.

## `maximumPrice` (type: `number`):

Only include rugs with a current variant price at or below this USD amount. Leave blank for no maximum.

## `minimumRating` (type: `number`):

Only include rugs with a customer rating at or above this value from 0 to 5. Leave blank for no rating filter.

## `saleStatus` (type: `string`):

Choose whether to include rugs marked on sale or rugs not marked on sale. Leave blank to include both.

## `stockStatus` (type: `string`):

Choose whether to include rugs marked in stock or rugs marked out of stock. Leave blank to include both.

## `colors` (type: `array`):

Enter one or more color names. A rug is included when its source-backed color data matches any entered value. Leave blank for all colors.

## `materials` (type: `array`):

Enter one or more material names. A rug is included when its source-backed material data matches any entered value. Leave blank for all materials.

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

Choose an order by current price, customer rating, or review count. Leave blank to keep the source order.

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

Optional stop for a run that could return many rug records. Enter a positive integer to stop after that many saved rows. Leave blank to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "discoveryMethod": "full_catalog",
  "maxItems": 3
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the discovered rug rows in the default dataset.

# 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 = {
    "discoveryMethod": "full_catalog",
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/rugs").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 = {
    "discoveryMethod": "full_catalog",
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/rugs").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 '{
  "discoveryMethod": "full_catalog",
  "maxItems": 3
}' |
apify call maximedupre/rugs --silent --output-dataset

```

## MCP server setup

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

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/KOyXydK0spIOxr7va/builds/LfbX0elPiaKTKtPs7/openapi.json
