# Article Furniture Scraper (`crawlerbros/article-furniture-scraper`) Actor

Scrape Article.com's furniture catalog - browse any room/category or search by keyword, get prices (incl. sale), color/finish variants, images, and full product detail (dimensions, materials, reviews) by product ID or URL.

- **URL**: https://apify.com/crawlerbros/article-furniture-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Article Furniture Scraper

Scrape **Article.com** — the direct-to-consumer modern furniture brand. Browse any room or category (Living Room, Bedroom, Dining & Kitchen, Home Office, Entryway, Outdoor, Decor), browse by named furniture collection/line, search by keyword, or look up full product detail by product ID/URL. Get prices (including active sale and clearance prices), color/finish variants, images, dimensions, materials, review ratings, related products, and alternate size/configuration options. HTTP-only — no login, no cookies, no proxy required.

### What this actor does

- **Four modes:** `byCategory` (51 curated rooms/categories), `byCollection` (any named furniture collection/line, e.g. "Timber", "Ceni"), `search` (free-text keyword), `byProductId` (direct product lookup)
- **Real-time pricing:** current price, retail (list) price, active sale price, active clearance price, currency
- **Color & finish variants:** every fabric/finish option for a product, each with its own product URL and image
- **Alternate configurations:** non-color product options (e.g. Sofa vs. Loveseat size, Fabric vs. Leather material), each linked to its own product ID
- **Cross-sell data:** related products (with price/image) and similar-SKU product IDs
- **Full product detail:** dimensions (W/D/H in inches), materials, care instructions, features, package dimensions, packaged item quantity, assembly-instructions PDF, review count/rating, taxonomy attributes (material, seating type, comfort level, etc.), SEO meta title/description
- **Delivery/availability signals:** in-stock status, availability status, delivery-risk flag, region shipping restrictions
- **Filters:** price range, on-sale-only, on-clearance-only, sort order (popularity / price / newest)
- **Empty fields are omitted**

### Output: per-product (mode = `byCategory` / `search` / `byCollection`)

- `productId`, `baseProductId`, `sku`, `title`, `slug`, `productUrl`
- `isBundle`, `onSale`, `onClearance`, `isNewProduct`, `isEtaAtRisk`, `badges[]`
- `currency`, `price`, `retailPrice`, `salePrice`, `clearancePrice`, `bundlePrice` (multi-item bundle listings only)
- `imageUrl`, `settingImageUrl`, `images[]`, `videoUrl`
- `colorVariants[]` (each: `productId`, `title`, `colorOrFinish`, `slug`, `productUrl`, `imageUrl`), `colorVariantCount`
- `restrictedRegions[]` (state/region codes where shipping is restricted — only present when applicable)
- `recordType: "product"`, `scrapedAt`

### Output: full product detail (mode = `byProductId`)

- `productId`, `baseProductId`, `sku`, `title`, `marketingTitle`, `slug`, `productUrl`
- `description`, `colorOrFinish`, `availableCountries[]`
- `inStock`, `status`, `isMakeToOrder`, `onSale`, `onClearance`, `isNewProduct`, `isEtaAtRisk`, `badges[]`
- `currency`, `price`, `retailPrice`, `salePrice`, `clearancePrice`, `bundlePrice` (multi-item bundle products only)
- `collectionId`, `collectionName`, `collectionSlug`, `collectionProductCount`
- `reviewCount`, `reviewRating`
- `categoryName`, `categoryBreadcrumb[]`, `categoryBrowseUrl`
- `careInstructions[]`, `features[]`, `specifications[]` (key/value spec sheet), `generalDimensions`, `materials`
- `widthIn`, `depthIn`, `heightIn`, `packageDimensions` (`widthIn`/`depthIn`/`heightIn`), `packagedItemQuantity`
- `assemblyInstructionsUrl`
- `metaTitle`, `metaDescription`
- `images[]`, `videoUrl`
- `colorVariants[]`, `colorVariantCount`
- `configurationOptions[]` (non-color alternate configurations — e.g. size/seating/material — each with `attribute`, `value`, `productId`)
- `configuratorEnabled`
- `relatedProducts[]` (each: `productId`, `sku`, `title`, `slug`, `productUrl`, `imageUrl`, `price`, `currency`), `similarProductIds[]`
- `restrictedRegions[]`
- `taxonomyAttributes[]` (attribute/value pairs — material, seating type, width bucket, comfort level, room, etc.)
- `recordType: "productDetail"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `byCategory` | `byCategory` / `byCollection` / `search` / `byProductId` |
| `category` | string | `224/living-furniture` | Room/category to browse (mode=byCategory) — 51 options covering every room |
| `collectionId` | string | `228/timber` | Named collection/line to browse (mode=byCollection), in `<id>/<slug>` format or a full collection URL |
| `searchQuery` | string | `sofa` | Free-text keyword (mode=search) |
| `productIds` | array | – | Numeric product IDs or full product URLs (mode=byProductId) |
| `sortBy` | string | `popularity` | `popularity` / `price-low` / `price-high` / `newest` |
| `minPrice` | int | – | Drop products priced below this (USD) |
| `maxPrice` | int | – | Drop products priced above this (USD) |
| `onSaleOnly` | bool | `false` | Only emit products currently on sale |
| `onClearanceOnly` | bool | `false` | Only emit products currently on clearance (permanently-discounted discontinuing stock — distinct from a temporary sale) |
| `maxItems` | int | `48` | Hard cap (1–1000) |
| `proxyConfiguration` | object | AUTO | Optional; only used as a fallback if the site briefly rate-limits requests |

#### Example: browse a category, cheapest first

```json
{
  "mode": "byCategory",
  "category": "27/sofas-sectionals",
  "sortBy": "price-low",
  "maxItems": 50
}
````

#### Example: search with a price cap and on-sale filter

```json
{
  "mode": "search",
  "searchQuery": "dining table",
  "maxPrice": 1500,
  "onSaleOnly": true,
  "maxItems": 30
}
```

#### Example: full product detail lookup

```json
{
  "mode": "byProductId",
  "productIds": ["30333", "https://www.article.com/product/24154/timber-90-leather-sofa-charme-chocolat"]
}
```

#### Example: browse a named collection/line, clearance only

```json
{
  "mode": "byCollection",
  "collectionId": "228/timber",
  "onClearanceOnly": true,
  "maxItems": 20
}
```

### Use cases

- **Price monitoring** — track sale/clearance pricing across Article's catalog over time
- **Competitive intelligence** — benchmark DTC furniture pricing and product assortment
- **Interior design / sourcing** — pull dimensions and materials for space planning
- **Affiliate / content sites** — build furniture roundups with live pricing and images
- **Market research** — analyze category breadth, new-arrival cadence, and review sentiment

### FAQ

**Is login required?** No. All data is scraped from Article.com's public pages — no account, cookies, or API key needed.

**Why do `byCategory`/`search` records have fewer fields than `byProductId` records?** The category/search listing pages return a lighter product summary (price, images, color variants). Full specs — dimensions, materials, care instructions, review ratings — are only available on the live product-detail lookup, which the actor fetches directly per product ID.

**What currency are prices in?** USD. Article also serves Canada in CAD, but the CAD price isn't reachable via a plain URL parameter, so this actor reports US pricing only.

**Why are `salePrice`/`clearancePrice` sometimes missing?** They're only included when the product is actually discounted below its standard price. A product not currently on sale won't have those fields — that's expected, not a data gap.

**What does `colorVariantCount` mean?** The number of other color/finish options available for that product (e.g. a sofa offered in 4 fabrics). Each variant is listed in `colorVariants[]` with its own product URL.

**Can I look up a product by URL instead of ID?** Yes — `mode=byProductId` accepts either a bare numeric ID (e.g. `30333`) or a full product URL.

**What's the difference between `byCategory` and `byCollection`?** `byCategory` browses by room/furniture type (e.g. "Sofas", "Coffee Tables") — the taxonomy Article's own navigation menu uses. `byCollection` browses by a named furniture line/design collection (e.g. "Timber", "Ceni") that can span multiple room categories and product types sharing the same design language. Find a `collectionId` by first running `byCategory`/`search`/`byProductId` and reading the `collectionId`/`collectionSlug` fields on any result, then feed `<collectionId>/<collectionSlug>` back in as `collectionId`.

**What's the difference between `onSaleOnly` and `onClearanceOnly`?** Sale items are temporarily discounted (the price recovers later); clearance items are permanently reduced because the SKU is being discontinued. A product can be on sale, on clearance, both, or neither — the two filters are independent and can be combined.

**What are `configurationOptions[]`?** Alternate non-color configurations of the same base design — most commonly size/seating variants (e.g. Sofa vs. Loveseat vs. Sectional) or material variants (e.g. Fabric vs. Leather) — each pointing at the specific product ID for that configuration. Color/finish variants are covered separately by `colorVariants[]` and aren't duplicated here.

**What are `relatedProducts[]` and `similarProductIds[]`?** Article's own "you may also like" and "similar items" recommendations for a product — useful for building product graphs or cross-sell suggestions without additional lookups.

**Does `byProductId` work for bundles (e.g. a rug + rug pad set)?** Bundle IDs look like `BUNDLE-767`. They resolve reliably from `byCategory`/`search` (as a lighter summary record), but Article's bundle detail pages don't expose the same structured product data as regular product pages, so `byProductId` can't return a full detail record for a bundle — it's skipped with a logged notice rather than returning partial/fabricated data.

**Is this affiliated with Article?** No. This is an independent, third-party actor that reads Article.com's public pages.

### Limitations

- Prices and stock reflect what Article's site shows at scrape time and can change without notice.
- `category` covers 51 curated rooms/subcategories from Article's own navigation; a handful of very narrow sub-collections (e.g. seasonal campaign pages) aren't included.
- `collectionId` isn't a closed dropdown (Article publishes 300+ collections and periodically adds/retires them), so it's entered as free text rather than a fixed list — get a current, valid value from any product's `collectionId`/`collectionSlug` output field.
- `restrictedRegions`, `isEtaAtRisk`, `configurationOptions`, and `relatedProducts` are only present when Article's own data has something to report for that specific product (e.g. most products ship everywhere and aren't region-restricted) — this is expected, not a data gap.
- The site applies a short-lived rate limit to bursts of rapid requests; the actor retries automatically and this is not user-visible under normal use.
- The first page of results (~48-50 items) is always reliable for both `byCategory` and `search`. Article's own pagination backend intermittently (non-deterministically) takes a moment to make page 2+ available — a source-side quirk, not specific to this actor. The actor retries automatically and never returns duplicate records, but a run with a high `maxItems` can occasionally return somewhat fewer items than requested if a deep page doesn't become available within the retry budget. Re-running the same request typically fills in the gap.
- `sortBy=price-high`/`price-low` reflects Article's own search ranking, which occasionally interleaves a small number of items slightly out of strict price order (e.g. bundled "sets" priced alongside individual pieces) — the actor passes the sort straight through without re-ordering client-side, so this matches what Article's own site shows for the same query.

# Actor input Schema

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

What to fetch.

## `category` (type: `string`):

Room/category to browse.

## `collectionId` (type: `string`):

A named furniture collection/line to browse, in `<id>/<slug>` format (copy from a collection page URL) or a full collection URL, e.g. `228/timber`, `9/ceni`, or `https://www.article.com/collection/228/timber`. Article publishes 300+ collections — find the current list via any product's `collectionId`/`collectionSlug` output field, or by browsing Article.com's collection pages.

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

Free-text keyword search, e.g. `sofa`, `walnut dresser`, `outdoor dining table`.

## `productIds` (type: `array`):

Numeric product IDs (e.g. `30333`) or full product URLs (e.g. `https://www.article.com/product/30333/timber-90-leather-sofa-charme-tan`).

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

Sort order for byCategory/search/byCollection results.

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

Drop products priced below this (byCategory/search/byCollection only).

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

Drop products priced above this (byCategory/search/byCollection only).

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

Only emit products currently marked on sale (byCategory/search/byCollection only).

## `onClearanceOnly` (type: `boolean`):

Only emit products currently marked on clearance (byCategory/search/byCollection only). Distinct from `onSaleOnly` — clearance items are permanently discounted discontinuing stock, while sale items are temporarily discounted.

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

Hard cap on emitted records.

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

Optional. Article.com works without a proxy; this is used only as a last-resort fallback if the site's rate-limit briefly blocks requests. AUTO (datacenter) is free on all Apify plans.

## Actor input object example

```json
{
  "mode": "byCategory",
  "category": "224/living-furniture",
  "collectionId": "228/timber",
  "searchQuery": "sofa",
  "productIds": [],
  "sortBy": "popularity",
  "onSaleOnly": false,
  "onClearanceOnly": false,
  "maxItems": 48,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset containing all scraped Article.com products.

# 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": "byCategory",
    "category": "224/living-furniture",
    "collectionId": "228/timber",
    "searchQuery": "sofa",
    "productIds": [],
    "sortBy": "popularity",
    "onSaleOnly": false,
    "onClearanceOnly": false,
    "maxItems": 48,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/article-furniture-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": "byCategory",
    "category": "224/living-furniture",
    "collectionId": "228/timber",
    "searchQuery": "sofa",
    "productIds": [],
    "sortBy": "popularity",
    "onSaleOnly": False,
    "onClearanceOnly": False,
    "maxItems": 48,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/article-furniture-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "byCategory",
  "category": "224/living-furniture",
  "collectionId": "228/timber",
  "searchQuery": "sofa",
  "productIds": [],
  "sortBy": "popularity",
  "onSaleOnly": false,
  "onClearanceOnly": false,
  "maxItems": 48,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/article-furniture-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/article-furniture-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Article Furniture Scraper",
        "description": "Scrape Article.com's furniture catalog - browse any room/category or search by keyword, get prices (incl. sale), color/finish variants, images, and full product detail (dimensions, materials, reviews) by product ID or URL.",
        "version": "1.0",
        "x-build-id": "li3ElI0JgbTCTARxd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~article-furniture-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-article-furniture-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~article-furniture-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-article-furniture-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~article-furniture-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-article-furniture-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "byCategory",
                            "search",
                            "byProductId",
                            "byCollection"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "byCategory"
                    },
                    "category": {
                        "title": "Category (mode=byCategory)",
                        "enum": [
                            "224/living-furniture",
                            "12/sofas-sofas",
                            "27/sofas-sectionals",
                            "28/sofas-sofa-beds",
                            "91/sofas-modular-sofas",
                            "2/chairs-lounge-chairs",
                            "87/swivel-chairs",
                            "21/tables-coffee-tables",
                            "83/tables-side-tables",
                            "94/storage-media-units",
                            "8/storage-bookcases-and-shelves",
                            "72/tables-consoles",
                            "17/sofas-ottomans",
                            "23/chairs-benches",
                            "13/bedroom",
                            "14/bedroom-beds",
                            "22/bedroom-dressers",
                            "15/bedroom-nightstands",
                            "95/bedroom-headboards",
                            "64/bedroom-benches",
                            "60/bedroom-mattresses",
                            "222/dining-furniture",
                            "10/tables-dining-tables",
                            "7/chairs-dining-chairs",
                            "47/chairs-stools",
                            "33/dining-benches",
                            "93/storage-sideboards",
                            "36/tables-islands-carts",
                            "223/home-office-furniture",
                            "37/tables-desks",
                            "82/chairs-office-chairs",
                            "702/file-cabinets",
                            "345/entryway-furniture",
                            "19/storage-cabinets",
                            "25/decor-mirrors",
                            "58/outdoor",
                            "103/outdoor-lounging",
                            "104/outdoor-dining",
                            "84/outdoor-sofas",
                            "85/outdoor-sectionals",
                            "62/outdoor-lounge-chairs",
                            "59/outdoor-dining-tables",
                            "61/outdoor-dining-chairs",
                            "99/outdoor-accessories",
                            "48/decor",
                            "50/decor-rugs",
                            "53/decor-lighting",
                            "51/decor-pillows",
                            "65/decor-poufs",
                            "419/decor-planters",
                            "100/new"
                        ],
                        "type": "string",
                        "description": "Room/category to browse.",
                        "default": "224/living-furniture"
                    },
                    "collectionId": {
                        "title": "Collection ID (mode=byCollection)",
                        "type": "string",
                        "description": "A named furniture collection/line to browse, in `<id>/<slug>` format (copy from a collection page URL) or a full collection URL, e.g. `228/timber`, `9/ceni`, or `https://www.article.com/collection/228/timber`. Article publishes 300+ collections — find the current list via any product's `collectionId`/`collectionSlug` output field, or by browsing Article.com's collection pages."
                    },
                    "searchQuery": {
                        "title": "Search query (mode=search)",
                        "type": "string",
                        "description": "Free-text keyword search, e.g. `sofa`, `walnut dresser`, `outdoor dining table`."
                    },
                    "productIds": {
                        "title": "Product IDs or URLs (mode=byProductId)",
                        "type": "array",
                        "description": "Numeric product IDs (e.g. `30333`) or full product URLs (e.g. `https://www.article.com/product/30333/timber-90-leather-sofa-charme-tan`).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "popularity",
                            "price-low",
                            "price-high",
                            "newest"
                        ],
                        "type": "string",
                        "description": "Sort order for byCategory/search/byCollection results.",
                        "default": "popularity"
                    },
                    "minPrice": {
                        "title": "Min price (USD)",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Drop products priced below this (byCategory/search/byCollection only)."
                    },
                    "maxPrice": {
                        "title": "Max price (USD)",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Drop products priced above this (byCategory/search/byCollection only)."
                    },
                    "onSaleOnly": {
                        "title": "On sale only",
                        "type": "boolean",
                        "description": "Only emit products currently marked on sale (byCategory/search/byCollection only).",
                        "default": false
                    },
                    "onClearanceOnly": {
                        "title": "On clearance only",
                        "type": "boolean",
                        "description": "Only emit products currently marked on clearance (byCategory/search/byCollection only). Distinct from `onSaleOnly` — clearance items are permanently discounted discontinuing stock, while sale items are temporarily discounted.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on emitted records.",
                        "default": 48
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. Article.com works without a proxy; this is used only as a last-resort fallback if the site's rate-limit briefly blocks requests. AUTO (datacenter) is free on all Apify plans.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
