# Vidaxl Products Crawler (`alkausari_mujahid/vidaxl-products-crawler`) Actor

Turn vidaXL product pages into a ready-to-sell eBay listings in minutes — prices, images, specs, and categories all extracted automatically— and download results instantly as JSON or CSV. AI handles eBay titles and descriptions. Seamlessly integrate with Make to automate eBay listing workflow.

- **URL**: https://apify.com/alkausari\_mujahid/vidaxl-products-crawler.md
- **Developed by:** [Alkausari M](https://apify.com/alkausari_mujahid) (community)
- **Categories:** E-commerce, Integrations, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## vidaXL Product Scraper — eBay Ready with AI Optimization
 
Extract complete product data from **vidaXL.com** and **vidaXL.de** at scale — with built-in GPT-4o-mini optimization that generates eBay-ready titles, descriptions, categories, and mobile-short summaries in a single run.
 
---
 
### What This Actor Does
 
This Actor crawls vidaXL category listing pages and product detail pages using a real Chromium browser (Playwright), extracting structured product data and optionally enriching it with AI-generated eBay content — all in one automated pipeline.
 
You provide a list of URLs (category pages or direct product pages) paired with your internal SKUs, and the Actor returns a clean, structured dataset ready for eBay listing tools, inventory systems, or dropshipping workflows.
 
---
 
### Key Features
 
**Full product data extraction**
- Product name (with automatic `vidaXL` brand prefix removal)
- Brand, price, and currency
- Category breadcrumbs with category IDs and URLs
- All product images mapped to your SKU (`SKU_1`, `SKU_2`, …) with high-resolution `?sw=1024` URLs
- Selected colour variant
- Short meta description
- Full description (HTML and plain text)
- Specifications as a clean key/value map
- Pros list
 
**AI-powered eBay content generation (optional)**
- Plug in your OpenAI API key to activate GPT-4o-mini enrichment
- Generates an eBay-optimised title (max 80 characters, no brand noise)
- Suggests the correct eBay category ID for each product
- Writes a fully formatted eBay HTML description
- Produces a mobile-short summary (max 800 characters) for compact listings
 
**Built for reliability**
- Playwright Locator API throughout — lazy queries with built-in DOM retry logic
- Pre-counts elements before every extraction — no blind `waitForSelector` timeouts
- Isolated `try/catch` per field — one broken element never blocks the rest
- Tiered price extraction with three fallback selectors
- Rotating proxy support via Apify Proxy
- Configurable request limit and polite crawl delay between pages
 
**Supports both locales**
- `vidaxl.com` (international / English)
- `vidaxl.de` (German)
 
---
 
### Input
 
```json
{
  "startUrls": [
    { "sku": "12345", "url": "https://www.vidaxl.com/e/some-product/123.html" },
    { "sku": "67890", "url": "https://www.vidaxl.com/g/123456" }
  ],
  "open_ai_key": "sk-...",
  "prompt": "You are an eBay listing expert. Return valid JSON with keys: category_id, title, description_html, short_description.",
  "maxRequestsPerCrawl": 100
}
````

| Field | Type | Required | Description |
|---|---|---|---|
| `startUrls` | Array | ✅ | List of `{ sku, url }` objects. Accepts category (`/g/`) or product (`/e/`) URLs |
| `open_ai_key` | String | ❌ | OpenAI API key. Omit to skip AI enrichment and scrape only |
| `prompt` | String | ❌ | System prompt sent to GPT-4o-mini. Controls output format and tone |
| `maxRequestsPerCrawl` | Number | ❌ | Cap on total requests per run |

***

### Output

Each product is saved as one record in the Apify Dataset:

```json
{
  "url": "https://www.vidaxl.com/e/product-name/8720287219385.html",
  "inputSKU": "12345",
  "brand": "vidaXL",
  "name": "Dog Bed Black 70x40x24 cm Velvet",
  "vidaXLPrice": "49.99",
  "ebayPrice": "41.49",
  "currency": "€",
  "breadcrumbs": [
    { "index": 1, "name": "Pet Supplies", "url": "...", "categoryId": "123" },
    { "index": 2, "name": "Dog Beds", "url": "...", "categoryId": "456" }
  ],
  "images": [
    { "fileName": "12345_1", "url": "https://...?sw=1024" },
    { "fileName": "12345_2", "url": "https://...?sw=1024" }
  ],
  "selectedColor": "Black",
  "shortDescription": "...",
  "descriptionHtml": "<p>...</p>",
  "descriptionText": "...",
  "specificationsHtml": "<ul>...</ul>",
  "specifications": {
    "Material": "Velvet",
    "Dimensions": "70 x 40 x 24 cm",
    "Colour": "Black"
  },
  "pros": ["Soft and comfortable", "Easy to clean"],
  "ChatGPTresponse": {
    "ebayCategory_id": "20744",
    "ebayTitle": "Dog Bed Black 70x40x24 cm Velvet Soft Pet Sofa Cushion Cosy",
    "ebayDescriptionHtml": "<div>...</div>",
    "mobileShort": "Cosy velvet dog bed in black..."
  }
}
```

**Pricing note:** `ebayPrice` is pre-calculated at `vidaXLPrice × 0.83` to account for eBay fees and leave a margin buffer.

***

### Use Cases

- **eBay dropshippers** sourcing from vidaXL who need bulk-listed, AI-optimised product content
- **Inventory managers** tracking prices, availability, and specifications across hundreds of SKUs
- **E-commerce agencies** building product feeds for clients reselling vidaXL goods
- **Price monitoring** across the `.com` and `.de` storefronts

***

### Notes

- This Actor uses Apify Proxy for IP rotation. Residential or datacenter proxies are both supported.
- AI enrichment calls OpenAI's API and will consume tokens from your OpenAI account.
- A 5-second polite delay is applied between product page requests to avoid rate limiting.
- The Actor is optimised for vidaXL's current DOM structure. If vidaXL updates their site layout, field-level error logging will pinpoint exactly which selectors need updating.

# Actor input Schema

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

Add one or more vidaXL product URLs. You can also set your own SKU for each item (optional).

## `open_ai_key` (type: `string`):

Provide Openai API Key if you want product description transformed into your desired format

## `prompt` (type: `string`):

ChatGPT Prompt

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

Max requests to process simultaneously

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of requests that can be made by this crawler.

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

Proxy settings to use during crawling.

## Actor input object example

```json
{
  "startUrls": [
    {
      "sku": "27068",
      "url": "https://www.vidaxl.de/e/vidaxl-schaukelliege-akazienholz/8718475502579.html"
    },
    {
      "sku": "27087",
      "url": "https://www.vidaxl.de/e/vidaxl-butterfly-sessel-braun-echtleder/8718475526094.html"
    }
  ],
  "prompt": "You are an expert eBay products details optimiser. Return ONLY a valid JSON object with these exact keys: \n - ebay_title (max 80 characters, never include 'vidaXL')\n - ebay_description_html (full HTML description, never include the keyword'vidaXL')\n - mobile_short (max 800 characters, mobile-optimized summary, never include 'vidaXL')\n\n Note: replace SKU value\n\nDo not add any explanation or markdown.",
  "maxConcurrency": 1,
  "maxRequestsPerCrawl": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [],
    "proxyUrls": []
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "sku": "27068",
            "url": "https://www.vidaxl.de/e/vidaxl-schaukelliege-akazienholz/8718475502579.html"
        },
        {
            "sku": "27087",
            "url": "https://www.vidaxl.de/e/vidaxl-butterfly-sessel-braun-echtleder/8718475526094.html"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [],
        "proxyUrls": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alkausari_mujahid/vidaxl-products-crawler").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": [
        {
            "sku": "27068",
            "url": "https://www.vidaxl.de/e/vidaxl-schaukelliege-akazienholz/8718475502579.html",
        },
        {
            "sku": "27087",
            "url": "https://www.vidaxl.de/e/vidaxl-butterfly-sessel-braun-echtleder/8718475526094.html",
        },
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
        "proxyUrls": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("alkausari_mujahid/vidaxl-products-crawler").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": [
    {
      "sku": "27068",
      "url": "https://www.vidaxl.de/e/vidaxl-schaukelliege-akazienholz/8718475502579.html"
    },
    {
      "sku": "27087",
      "url": "https://www.vidaxl.de/e/vidaxl-butterfly-sessel-braun-echtleder/8718475526094.html"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [],
    "proxyUrls": []
  }
}' |
apify call alkausari_mujahid/vidaxl-products-crawler --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=alkausari_mujahid/vidaxl-products-crawler",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Vidaxl Products Crawler",
        "description": "Turn vidaXL product pages into a ready-to-sell eBay listings in minutes — prices, images, specs, and categories all extracted automatically— and download results instantly as JSON or CSV. AI handles eBay titles and descriptions. Seamlessly integrate with Make to automate eBay listing workflow.",
        "version": "0.0",
        "x-build-id": "WCCpvv36uNTOVePv5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/alkausari_mujahid~vidaxl-products-crawler/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-alkausari_mujahid-vidaxl-products-crawler",
                "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/alkausari_mujahid~vidaxl-products-crawler/runs": {
            "post": {
                "operationId": "runs-sync-alkausari_mujahid-vidaxl-products-crawler",
                "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/alkausari_mujahid~vidaxl-products-crawler/run-sync": {
            "post": {
                "operationId": "run-sync-alkausari_mujahid-vidaxl-products-crawler",
                "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": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Product URLs with SKUs",
                        "type": "array",
                        "description": "Add one or more vidaXL product URLs. You can also set your own SKU for each item (optional)."
                    },
                    "open_ai_key": {
                        "title": "Openai ChatGPT API Key",
                        "type": "string",
                        "description": "Provide Openai API Key if you want product description transformed into your desired format"
                    },
                    "prompt": {
                        "title": "ChatGPT Prompt",
                        "type": "string",
                        "description": "ChatGPT Prompt",
                        "default": "You are an expert eBay products details optimiser. Return ONLY a valid JSON object with these exact keys: \n - ebay_title (max 80 characters, never include 'vidaXL')\n - ebay_description_html (full HTML description, never include the keyword'vidaXL')\n - mobile_short (max 800 characters, mobile-optimized summary, never include 'vidaXL')\n\n Note: replace SKU value\n\nDo not add any explanation or markdown."
                    },
                    "maxConcurrency": {
                        "title": "Max requests to process simultaneously",
                        "type": "integer",
                        "description": "Max requests to process simultaneously",
                        "default": 1
                    },
                    "maxRequestsPerCrawl": {
                        "title": "Max Requests per Crawl",
                        "type": "integer",
                        "description": "Maximum number of requests that can be made by this crawler.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings to use during crawling.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "proxyUrls": []
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
