# Apex Hali Scraper (`sovanza.inc/apex-hali-scraper`) Actor

Apex Hali Scraper extracts carpet and rug product data from apexhali.com, including prices, availability, images, variants, descriptions, breadcrumbs, SEO metadata, and collection details for catalog building, price monitoring, and e-commerce research.

- **URL**: https://apify.com/sovanza.inc/apex-hali-scraper.md
- **Developed by:** [Sovanza](https://apify.com/sovanza.inc) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 product scrapeds

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/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

### 🧵 Apex Hali Scraper – Carpet & Rug Product Data Extractor

A powerful e-commerce scraper that extracts structured product data from Apex Hali, a leading Turkish carpet and rug store built on Shopify.
This actor helps you collect complete product catalogs, monitor prices, and analyze collections with clean, structured output ready for automation.

### 🚀 Start Scraping Carpet Data

Turn Apex Hali’s catalog into structured data in minutes.
👉 Extract product prices, images, and variants
👉 Crawl full collections or specific product URLs
👉 Monitor carpet pricing and availability
👉 Export data to CSV, JSON, or Excel
Click “Run” and start building your product dataset.

### 🧠 What Makes This Scraper Powerful?

Scraping e-commerce sites is not just about collecting product names.
You need:
Clean structured data
Consistent pricing formats
Reliable extraction despite theme changes
Full catalog coverage
This scraper solves that with:
Multi-selector extraction (CSS + JS + meta fallback)
Shopify-aware crawling and pagination handling
Normalized Turkish Lira pricing
Extraction confidence scoring

### 🔄 Flexible Scraping Modes

Choose how you want to scrape:

🔹 Full Catalog Mode (discover_and_scrape)
Crawls collections
Discovers all product URLs
Extracts full product data

🔹 Product URL Mode (product_urls_only)
Scrape only specific product pages
No discovery crawling

🔹 Category Mode (category_urls_only)
Extract collection structure only
Skip product-level scraping

### ⚡ Key Features

Apex Hali product scraper (Shopify-based)
Carpet and rug catalog extraction
Turkish Lira price normalization
Variant extraction (size, options)
Image and media scraping
SEO metadata extraction
Breadcrumb and category mapping
Extraction confidence scoring
Anti-detection with human-like delays

### 📊 Data You Can Extract

Each product may include:
Product name & URL
Price (text + numeric)
Currency (TRY)
Availability status
Product description
Variants (size, color, options)
Images (all + primary)
Breadcrumb categories
SKU and product type
SEO metadata (title + description)
Clean, structured, and ready for analytics.

### 🎯 Real-World Use Cases

🛒 Product Catalog Building
Create structured datasets for carpet and rug products.

💰 Price Monitoring
Track price changes and compare products across collections.

📊 Market Research
Analyze product categories, pricing strategies, and catalog depth.

🤖 AI & Data Pipelines
Feed product data into machine learning or recommendation systems.

📦 Inventory Systems
Build internal product feeds for business workflows.

### 🛠️ How to Use

Add Apex Hali URLs (homepage, collection, or product pages)
Select scraping mode
Set limits (products/pages)
Enable proxy (recommended: TR residential)
Run the actor
Download or integrate data via API

### 🛠️ How to Use Apex Hali Scraper on Apify (aligned to this implementation)

1. Add one or more Apex Hali URLs in `startUrls` (homepage, `/collections/...`, or `/products/...`).  
2. Choose `mode`:
   - `discover_and_scrape` (default): crawl collections and scrape products  
   - `product_urls_only`: scrape only the provided product URLs  
   - `category_urls_only`: output collection/category rows without visiting product pages  
3. Set `maxProducts` and `maxPages` to control scale.  
4. Keep `maxConcurrency` ≤ 8 for stability.  
5. Enable `proxyConfiguration` (Residential + country `TR` recommended).  
6. Run and export from Dataset as JSON/CSV/Excel (or via API).  

#### Input example

Full schema: `INPUT_SCHEMA.json`. Example:

```json
{
  "startUrls": [
    { "url": "https://www.apexhali.com/en" },
    { "url": "https://www.apexhali.com/en/collections/machine-carpet" },
    { "url": "https://www.apexhali.com/en/products/hare-plus-8917-mavi-makine-halisi" }
  ],
  "mode": "discover_and_scrape",
  "maxProducts": 10,
  "maxPages": 5,
  "categoryFilters": [],
  "includeCollections": true,
  "includeProductDetails": true,
  "includeBreadcrumbs": true,
  "includeImages": true,
  "includeVariants": true,
  "includeDescription": true,
  "includeSeoMetadata": true,
  "includeAvailabilitySignals": true,
  "includePriceHistoryFields": false,
  "language": "en",
  "requestTimeoutSecs": 45,
  "maxConcurrency": 3,
  "blockAssets": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "TR"
  },
  "debugMode": false,
  "saveHtmlSnapshot": false,
  "saveScreenshot": false,
  "saveParsedRows": false
}
````

#### Output example

Results are stored in the Actor’s **default dataset**. Example product row (illustrative):

```json
{
  "type": "product",
  "productName": "Hare Plus 8917 Mavi - Makine Halısı",
  "productUrl": "https://www.apexhali.com/en/products/hare-plus-8917-mavi-makine-halisi",
  "priceText": "From ₺12,880.00 TL",
  "priceNumeric": 12880.0,
  "currency": "TRY",
  "availabilitySignal": "in_stock",
  "timestamp": "2026-04-29T12:00:00.000Z"
}
```

### 📦 Output

Each dataset row represents:
Product record
Collection summary
Error row (if extraction fails)
Final summary
👉 Only meaningful fields included
👉 No empty values
👉 Optimized for pipelines

### 🔐 Reliability & Anti-Blocking

To ensure stable scraping:
Use Turkish residential proxy
Keep concurrency ≤ 8
Enable debug mode for troubleshooting
Use fallback selectors for stability

### ❓ Frequently Asked Questions

What is Apex Hali Scraper used for?
This is a carpet product scraper that extracts structured data from apexhali.com, including prices, images, variants, and catalog information.

Can I scrape the full Apex Hali catalog?
Yes. Use discover\_and\_scrape mode to crawl collections and extract all product data automatically.

Does this work as a Shopify scraper?
Yes. Apex Hali is built on Shopify, and this actor is optimized for Shopify-based product extraction and pagination.

Can I track carpet prices over time?
Yes. Schedule runs and compare priceNumeric values to monitor price changes and trends.

What makes this different from a basic product scraper?
This scraper includes:
Price normalization
Extraction confidence scoring
Multi-mode scraping
SEO metadata extraction

Why is a Turkish proxy recommended?
Using a TR residential proxy improves success rate by avoiding geo-restrictions and reducing blocking from apexhali.com.

Can I scrape only specific product URLs?
Yes. Use product\_urls\_only mode to target specific products without crawling.

What type of data can I extract from carpet products?
You can extract product details such as:
Prices
Variants (sizes, options)
Images
Descriptions
SEO metadata

Is this useful for e-commerce research?
Yes. This tool is widely used for product research, competitor analysis, and catalog extraction.

What formats can I export data in?
You can export in JSON, CSV, or Excel, or access via the Apify platform API.

### 📈 Why Use This Scraper?

Manual product data collection is slow and inconsistent.
This actor gives you:
Automated catalog extraction
Structured product datasets
Reliable scraping performance
Scalable data workflows

### 🚀 Get Started

Add your Apex Hali URLs and start extracting carpet product data instantly.

### Output

Results are stored in the Actor's **default dataset**. Each item is one of four record types.

Typical product record fields:

- **Identity:** `type`, `productName`, `productUrl`, `canonicalUrl`, `pageType`, `sourceCollection`, `language`.
- **Pricing:** `priceText`, `priceNumeric`, `compareAtPriceText`, `compareAtPriceNumeric`, `currency`.
- **Availability:** `availabilityText`, `availabilitySignal` (`in_stock` / `out_of_stock` / `unknown`).
- **Content:** `description`, `breadcrumb`, `variants`, `productType`, `sku`.
- **Media:** `images`, `primaryImage`.
- **SEO:** `metaTitle`, `metaDescription`.
- **Quality:** `extractionConfidence` (`high` / `medium` / `low`), `extractionConfidenceReason`.
- **Meta:** `timestamp`.
- **Errors:** `error`, `errorType` on failure rows.

Example product item:

```json
{
  "type": "product",
  "productName": "Hare Plus 8917 Mavi - Makine Halısı",
  "productUrl": "https://www.apexhali.com/en/products/hare-plus-8917-mavi-makine-halisi",
  "canonicalUrl": "https://www.apexhali.com/en/products/hare-plus-8917-mavi-makine-halisi",
  "pageType": "product",
  "sourceCollection": "Hare - Dokuda Derinlik",
  "breadcrumb": ["Machine Carpets", "Blue Carpets"],
  "priceText": "From ₺12,880.00 TL",
  "priceNumeric": 12880.0,
  "compareAtPriceText": null,
  "compareAtPriceNumeric": null,
  "currency": "TRY",
  "availabilityText": "Available",
  "availabilitySignal": "in_stock",
  "description": "High-quality machine-woven carpet in blue tones...",
  "images": ["https://cdn.shopify.com/s/files/..."],
  "primaryImage": "https://cdn.shopify.com/s/files/...",
  "variants": [
    { "name": "Size", "values": ["80x150", "120x180", "160x230", "200x290"] }
  ],
  "productType": "Machine Carpet",
  "sku": "8917-MAVI",
  "metaTitle": "Hare Plus 8917 Mavi - Makine Halısı | Apex Hali",
  "metaDescription": "Buy Hare Plus 8917 Mavi...",
  "language": "en",
  "extractionConfidence": "high",
  "extractionConfidenceReason": "Product title, URL, price, and image all extracted successfully",
  "timestamp": "2026-04-18T01:00:00.000Z"
}
```

Example collection summary row:

```json
{
  "type": "collection",
  "collectionName": "Machine Carpets",
  "collectionUrl": "https://www.apexhali.com/en/collections/machine-carpet",
  "productCountVisible": 24,
  "timestamp": "2026-04-18T01:00:00.000Z"
}
```

Error row (`type: "__error__"`) and final summary row (`type: "__summary__"`) are also pushed to the dataset.

➡️ Output is structured for pipelines, spreadsheet export, or direct use via the Apify API.

### Use Cases

- 🛒 Carpet product research and catalog building
- 💰 Price monitoring and compare-at price tracking
- 📊 Market and competitor analysis across collections
- 📦 Inventory feed generation for internal systems
- 🤖 AI training data and product embedding pipelines
- 🔁 Scheduled catalog snapshots and change detection

### Integrations & API

- Run and fetch results through the **Apify API**
- Use **Python**, **Node.js**, or HTTP clients against run and dataset endpoints
- Connect **Zapier**, **Make**, **Google Sheets**, and other Apify integrations
- **Webhooks** and **schedules** for recurring catalog monitoring runs

### Why Choose This Actor?

- Scrapes the full public Apex Hali catalog — collections, products, and metadata in one run
- Multi-selector extraction with JS and `og:` fallbacks — resilient to minor theme changes
- Turkish Lira price normalization with numeric field for direct comparison
- Extraction confidence scoring so you always know how reliable each record is
- Three modes for full catalog export, targeted product scraping, or structure-only discovery
- Clean structured output ready for analytics, warehouses, or spreadsheet export

### FAQ

#### How does Apex Hali Scraper work?

It opens apexhali.com in a headless Chrome browser, crawls category and collection pages to discover product links, then visits each product page and extracts all visible structured data using CSS selectors, JavaScript fallbacks, and Open Graph meta tags.

#### Can I scrape multiple collections in one run?

Yes. Add multiple collection URLs to `startUrls`, or leave it empty to start from the homepage and discover all collections automatically.

#### Do I need an Apex Hali account?

No. Only publicly visible pages are scraped — no login, cookies, or account credentials are required.

#### Why is a Turkish proxy recommended?

apexhali.com is a Turkish site. Using a Turkish (`TR`) residential proxy reduces the chance of geo-based blocks or captcha challenges.

#### Can I filter to specific product categories?

Yes. Use `categoryFilters` to restrict crawling to URLs or page titles containing your keywords (e.g. `["machine carpet", "bamboo"]`).

#### What does extraction confidence mean?

Each product record carries `extractionConfidence` (`high` / `medium` / `low`) based on whether the title, URL, price, and image were all found. Low confidence means some fields are missing.

#### Can I scrape only specific product URLs?

Yes. Set `mode` to `product_urls_only` and put your product URLs in `startUrls`. No discovery crawl will run.

#### Can I monitor prices over time?

Yes. Schedule periodic runs, then compare `priceNumeric` values across datasets to detect changes.

#### What formats can I download?

**JSON**, **CSV**, and **Excel** from the Apify dataset UI, plus full access via the **Apify API**.

#### Is scraping apexhali.com legal?

Only publicly visible, non-authenticated catalog data is scraped. You are responsible for ensuring compliance with apexhali.com's terms of service and applicable local laws.

### SEO Keywords

apex hali scraper
apex hali product scraper
apexhali.com scraper
turkish carpet scraper
carpet catalog scraper
rug price scraper
apify carpet scraper
shopify catalog scraper
halı fiyat scraper
carpet product data extractor
apexhali data export
turkish rug catalog scraper

### Actor permissions

This Actor is designed to work with **limited permissions**: it reads your input and writes to its **default dataset** only. It does not require access to other user storages, queues, or account data.

**To set limited permissions in Apify Console:**

1. Open your Actor on the Apify platform.
2. Go to **Source** or **Settings**.
3. Open **Review permissions** / **Permissions**.
4. Choose **Limited permissions** and save.

### Limitations

- Apex Hali uses a Shopify-based theme; if CSS class names change, selector updates in `main.py` may be required.
- Some images and variant options are lazy-loaded; the scraper uses `eager` load strategy and explicit waits to capture them, but infinite-scroll catalogs may need additional JS scroll handling.
- Very high concurrency or frequent runs may trigger rate limiting — use residential proxies and keep `maxConcurrency` moderate (≤ 8).
- Only data visible on public pages without login is scraped.
- Turkish Lira price formats cover the most common patterns; unusual edge-case formats may require parser updates.

### Future Roadmap

- Scheduled price monitoring with change-detection alerts
- Full variant enumeration by navigating option selectors
- Feed export to Google Sheets or Airtable
- Image download to Apify key-value store
- Improved handling of JS-rendered infinite scroll catalogs
- Collection hierarchy mapping (parent → child categories)
- Multi-language parallel runs (EN + TR comparison)

### License

This project is licensed under the MIT License — see the LICENSE file for details.

### Get Started

Add your Apex Hali collection or product URLs, enable a residential proxy for Turkey, and run your first catalog scrape on Apify today. 🚀

# Actor input Schema

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

One or more Apex Hali collection, category, or product URLs to start from. If empty, defaults to the English homepage. Each item should have a 'url' field. Supports collection pages (/en/collections/...), product pages (/en/products/...), and the homepage.

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

discover\_and\_scrape: crawl category/collection pages and scrape all found products. product\_urls\_only: scrape only the provided product URLs without discovery. category\_urls\_only: extract category/collection structure without scraping product detail pages.

## `maxProducts` (type: `integer`):

Maximum number of product pages to scrape. Set to 0 for unlimited (not recommended for large catalogs).

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

Maximum number of category, collection, or pagination pages to visit during discovery.

## `categoryFilters` (type: `array`):

Optional list of category keywords to restrict scraping (case-insensitive). For example: \['machine carpet', 'bamboo', 'living room']. Leave empty to scrape all discovered categories.

## `includeCollections` (type: `boolean`):

When enabled, collection/category summary rows are pushed to the dataset in addition to product rows.

## `includeProductDetails` (type: `boolean`):

When enabled, each discovered product URL is visited and full product details are extracted. When disabled, only product URL rows are emitted from listing pages.

## `includeBreadcrumbs` (type: `boolean`):

Extract category path breadcrumbs from product and collection pages.

## `includeImages` (type: `boolean`):

Collect all product image URLs found on the page.

## `includeVariants` (type: `boolean`):

Extract size, color, and other option groups if visible on the product page.

## `includeDescription` (type: `boolean`):

Extract product description text from product detail pages.

## `includeSeoMetadata` (type: `boolean`):

Extract meta title and meta description from each page.

## `includeAvailabilitySignals` (type: `boolean`):

Extract and normalize availability/stock signals from product pages.

## `includePriceHistoryFields` (type: `boolean`):

Extract visible compare-at / original price fields where shown. Does NOT fabricate historical pricing — only captures what is visible on the page.

## `language` (type: `string`):

Language variant of the site to scrape. 'en' uses apexhali.com/en, 'tr' uses apexhali.com/tr. 'auto' keeps URLs as provided.

## `requestTimeoutSecs` (type: `integer`):

Maximum seconds to wait for each page to load.

## `maxConcurrency` (type: `integer`):

Maximum number of pages being processed in parallel (browser tabs/instances). Lower values are gentler on the target server.

## `blockAssets` (type: `boolean`):

Block images, fonts, and tracking scripts to speed up page loads. Disable if product images fail to resolve.

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

Apify proxy settings. Residential proxy with country TR (Turkey) is recommended for apexhali.com.

## `proxyCountry` (type: `string`):

Country code for proxy selection. TR (Turkey) is recommended for apexhali.com. Overrides the country in proxyConfiguration when set.

## `debugMode` (type: `boolean`):

Enable extra logging, raw row text, and link discovery details in output records.

## `saveHtmlSnapshot` (type: `boolean`):

Save page HTML to a local file (debug\_page.html) when extraction returns null fields. Only useful when running locally or in Apify with KV store access.

## `saveScreenshot` (type: `boolean`):

Save a PNG screenshot alongside the HTML snapshot when saveHtmlSnapshot is also enabled.

## `saveParsedRows` (type: `boolean`):

Include debug fields (titleSource, priceSource, imageSource, rawRowText, normalizationWarnings) in product records.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.apexhali.com/en"
    },
    {
      "url": "https://www.apexhali.com/en/collections/machine-carpet"
    }
  ],
  "mode": "discover_and_scrape",
  "maxProducts": 200,
  "maxPages": 20,
  "categoryFilters": [],
  "includeCollections": true,
  "includeProductDetails": true,
  "includeBreadcrumbs": true,
  "includeImages": true,
  "includeVariants": true,
  "includeDescription": true,
  "includeSeoMetadata": true,
  "includeAvailabilitySignals": true,
  "includePriceHistoryFields": false,
  "language": "en",
  "requestTimeoutSecs": 45,
  "maxConcurrency": 8,
  "blockAssets": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "TR"
  },
  "proxyCountry": "AUTO_SELECT_PROXY_COUNTRY",
  "debugMode": false,
  "saveHtmlSnapshot": false,
  "saveScreenshot": false,
  "saveParsedRows": false
}
```

# Actor output Schema

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

Scraped Apex Hali products and collection rows in the default dataset.

## `runSummary` (type: `string`):

End-of-run counters and statistics (JSON in the default key-value store).

# 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 = {
    "startUrls": [
        {
            "url": "https://www.apexhali.com/en"
        },
        {
            "url": "https://www.apexhali.com/en/collections/machine-carpet"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sovanza.inc/apex-hali-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 = { "startUrls": [
        { "url": "https://www.apexhali.com/en" },
        { "url": "https://www.apexhali.com/en/collections/machine-carpet" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("sovanza.inc/apex-hali-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 '{
  "startUrls": [
    {
      "url": "https://www.apexhali.com/en"
    },
    {
      "url": "https://www.apexhali.com/en/collections/machine-carpet"
    }
  ]
}' |
apify call sovanza.inc/apex-hali-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apex Hali Scraper",
        "description": "Apex Hali Scraper extracts carpet and rug product data from apexhali.com, including prices, availability, images, variants, descriptions, breadcrumbs, SEO metadata, and collection details for catalog building, price monitoring, and e-commerce research.",
        "version": "0.0",
        "x-build-id": "g4hLVuKo9n0reEjhw"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sovanza.inc~apex-hali-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sovanza.inc-apex-hali-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/sovanza.inc~apex-hali-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sovanza.inc-apex-hali-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/sovanza.inc~apex-hali-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sovanza.inc-apex-hali-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",
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "One or more Apex Hali collection, category, or product URLs to start from. If empty, defaults to the English homepage. Each item should have a 'url' field. Supports collection pages (/en/collections/...), product pages (/en/products/...), and the homepage.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "mode": {
                        "title": "Scraping mode",
                        "enum": [
                            "discover_and_scrape",
                            "product_urls_only",
                            "category_urls_only"
                        ],
                        "type": "string",
                        "description": "discover_and_scrape: crawl category/collection pages and scrape all found products. product_urls_only: scrape only the provided product URLs without discovery. category_urls_only: extract category/collection structure without scraping product detail pages.",
                        "default": "discover_and_scrape"
                    },
                    "maxProducts": {
                        "title": "Max products",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of product pages to scrape. Set to 0 for unlimited (not recommended for large catalogs).",
                        "default": 200
                    },
                    "maxPages": {
                        "title": "Max category/list pages",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of category, collection, or pagination pages to visit during discovery.",
                        "default": 20
                    },
                    "categoryFilters": {
                        "title": "Category filters",
                        "type": "array",
                        "description": "Optional list of category keywords to restrict scraping (case-insensitive). For example: ['machine carpet', 'bamboo', 'living room']. Leave empty to scrape all discovered categories.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeCollections": {
                        "title": "Include collection rows",
                        "type": "boolean",
                        "description": "When enabled, collection/category summary rows are pushed to the dataset in addition to product rows.",
                        "default": true
                    },
                    "includeProductDetails": {
                        "title": "Include full product detail",
                        "type": "boolean",
                        "description": "When enabled, each discovered product URL is visited and full product details are extracted. When disabled, only product URL rows are emitted from listing pages.",
                        "default": true
                    },
                    "includeBreadcrumbs": {
                        "title": "Include breadcrumbs",
                        "type": "boolean",
                        "description": "Extract category path breadcrumbs from product and collection pages.",
                        "default": true
                    },
                    "includeImages": {
                        "title": "Include images",
                        "type": "boolean",
                        "description": "Collect all product image URLs found on the page.",
                        "default": true
                    },
                    "includeVariants": {
                        "title": "Include variants",
                        "type": "boolean",
                        "description": "Extract size, color, and other option groups if visible on the product page.",
                        "default": true
                    },
                    "includeDescription": {
                        "title": "Include description",
                        "type": "boolean",
                        "description": "Extract product description text from product detail pages.",
                        "default": true
                    },
                    "includeSeoMetadata": {
                        "title": "Include SEO metadata",
                        "type": "boolean",
                        "description": "Extract meta title and meta description from each page.",
                        "default": true
                    },
                    "includeAvailabilitySignals": {
                        "title": "Include availability signals",
                        "type": "boolean",
                        "description": "Extract and normalize availability/stock signals from product pages.",
                        "default": true
                    },
                    "includePriceHistoryFields": {
                        "title": "Include compare-at price fields",
                        "type": "boolean",
                        "description": "Extract visible compare-at / original price fields where shown. Does NOT fabricate historical pricing — only captures what is visible on the page.",
                        "default": false
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "tr",
                            "auto"
                        ],
                        "type": "string",
                        "description": "Language variant of the site to scrape. 'en' uses apexhali.com/en, 'tr' uses apexhali.com/tr. 'auto' keeps URLs as provided.",
                        "default": "en"
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 10,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Maximum seconds to wait for each page to load.",
                        "default": 45
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of pages being processed in parallel (browser tabs/instances). Lower values are gentler on the target server.",
                        "default": 8
                    },
                    "blockAssets": {
                        "title": "Block non-essential assets",
                        "type": "boolean",
                        "description": "Block images, fonts, and tracking scripts to speed up page loads. Disable if product images fail to resolve.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Residential proxy with country TR (Turkey) is recommended for apexhali.com.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "TR"
                        }
                    },
                    "proxyCountry": {
                        "title": "Proxy country override",
                        "enum": [
                            "AUTO_SELECT_PROXY_COUNTRY",
                            "TR",
                            "DE",
                            "GB",
                            "US",
                            "NL"
                        ],
                        "type": "string",
                        "description": "Country code for proxy selection. TR (Turkey) is recommended for apexhali.com. Overrides the country in proxyConfiguration when set.",
                        "default": "AUTO_SELECT_PROXY_COUNTRY"
                    },
                    "debugMode": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "Enable extra logging, raw row text, and link discovery details in output records.",
                        "default": false
                    },
                    "saveHtmlSnapshot": {
                        "title": "Save HTML snapshot",
                        "type": "boolean",
                        "description": "Save page HTML to a local file (debug_page.html) when extraction returns null fields. Only useful when running locally or in Apify with KV store access.",
                        "default": false
                    },
                    "saveScreenshot": {
                        "title": "Save screenshot",
                        "type": "boolean",
                        "description": "Save a PNG screenshot alongside the HTML snapshot when saveHtmlSnapshot is also enabled.",
                        "default": false
                    },
                    "saveParsedRows": {
                        "title": "Save parsed row debug fields",
                        "type": "boolean",
                        "description": "Include debug fields (titleSource, priceSource, imageSource, rawRowText, normalizationWarnings) in product records.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
