VidaXL Scraper at a glance
VidaXL Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes recordid, title, brand, price and oldprice, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.50 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $2.50 per 1,000 results (Free plan), from $1.80 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 20 options
Scrape the vidaXL storefronts by keyword or URL across 6 European markets. Every row carries price, currency, brand, category path, EAN and stock state. Detail enrichment adds description, specifications and the full image gallery. Recurring change tracking is first-class.
What VidaXL Scraper can do
- Two ways in. Search by keyword across the whole catalogue, or paste product, search and category page links. No need to build URLs by hand.
- Six markets, local prices. Germany, the United Kingdom, France, the Netherlands, Spain and Italy each quote their own prices and currency on every row.
- Product depth on demand. Switch the product page read on or off per run: description, specification table, full image gallery and live stock with delivery estimate, billed once per enriched record only.
- Built for price monitoring. Incremental mode returns only new and changed products on recurring runs, and a refused run fails loudly instead of returning an empty dataset.
- Honest empty results. A search that matches nothing succeeds quietly with zero rows; a run the store refused fails with a clear connection message, never a silent empty.
Choose what to collect
These inputs let you configure VidaXL Scraper - Products, Prices, Stock & Change Tracking. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring | How to start the scrape. 'search' runs store searches. 'url' processes the store URLs you paste: a product URL is fetched as a single product, and a search or category page URL is paged like a search, its own scope deciding what is read. The filters below apply to every walk in both modes; a pasted product URL is the exception and returns that single product in full. |
searchTermsarray | One or more things to search the store for, for example 'garden chair', 'greenhouse', 'teak bench'. Each term is scraped independently. Search mode only: in URL mode the scope is read out of each pasted URL instead. Leave this empty and the run browses the whole catalogue of the selected market. |
urlsarray | Paste product URLs (https://www.vidaxl.de/e/vidaxl-gartenstuhl-holz-grau/8719883557076.html), search URLs (https://www.vidaxl.de/catalogsearch/result?q=gartenstuhl) or category page URLs (https://www.vidaxl.de/g/4299/gartenmobel) from any supported market. A pasted URL decides its own scope and market. A product URL returns that one product in full. The filters below narrow what listing walks read. |
marketstring | The storefront search-mode walks read. Each market quotes its own prices and currency. URL mode reads the market out of each pasted URL instead. |
sortBystring | The store's own server-side ordering, sent with every page of every walk. This orders the walk itself (and therefore which rows a capped run keeps), not just the output. Applies in BOTH search mode and URL mode listing walks. |
minPricenumber | Only keep rows whose selling price is at least this amount, in the market currency. The store has no parameter for this, so it is applied to the rows this run reads. Applies in BOTH search mode and URL mode. |
maxPricenumber | Only keep rows whose selling price is at most this amount, in the market currency. The store has no parameter for this, so it is applied to the rows this run reads. Applies in BOTH search mode and URL mode. |
Show 13 more inputs
| Input | What it controls |
|---|---|
onSaleOnlyboolean | Only keep rows the store sells below their original price. Applied to the rows this run reads. Applies in BOTH search mode and URL mode. |
fetchDetailsboolean | Read each product's page for the description, specification table, full image gallery and live stock/delivery state. Charged once per enriched record (the detail-enrichment event); rows whose page could not be read keep their listing fields and are never charged. Turn it off for a fast price-only pull. |
maxItemsinteger | The maximum number of product records this run returns across all searches and URLs. Set to 0 for no limit. |
maxPagesinteger | The maximum number of listing pages read per search or pasted listing URL. Each page holds 20 products. Set to 0 for no page cap; Max items still bounds the run. |
resumeFromRunIdstring | Continue an interrupted run: paste a run id or dataset id and this run skips every record it already collected. Leave empty for a fresh run. Cannot be combined with Incremental mode when that mode already tracks this search; pick one. |
incrementalModeboolean | Schedule this actor against the same search and collect only what changed: every product is classified NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against the remembered baseline for this exact search scope. UNCHANGED rows are skipped unless Emit unchanged rows is on. |
stateKeystring | Name one monitoring campaign so several schedules keep separate baselines. Empty means the baseline is keyed on a hash of this exact search scope. |
emitUnchangedboolean | In Incremental mode, also return rows classified UNCHANGED (marked as such) instead of suppressing them. Off by default: a scheduled monitor then returns only NEW, UPDATED, REAPPEARED and EXPIRED rows. |
emitExpiredboolean | In Incremental mode, after a complete scan also return rows that disappeared from the store, marked EXPIRED. Only runs after a proven complete scan; capped or interrupted runs never tombstone. |
ignoreFieldsForChangesarray | Extra top-level record fields that must never mark a row UPDATED in Incremental mode. The image gallery is ignored by default (its framing rotates without the product changing); name further fields here when a scheduled monitor bills noise as changes. |
mcpConnectorsarray | Connector ids that receive new records as the run collects them (for example a Notion database). Empty means no export; the dataset always holds every record. |
notionParentPageUrlstring | When exporting to Notion, the parent page new database entries are created under. Only used when MCP connectors includes a Notion connector. |
maxNotifyListingsinteger | The maximum number of records forwarded to MCP connectors per run. Only used when MCP connectors is non-empty. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
recordIdrecordIdtitletitlebrandbrandpricepriceoldPriceoldPriceonSaleonSalecurrencycurrencyavailabilityavailabilitystockStatusstockStatuscategoryPathcategoryPatheaneanskuskuShow 15 more fields
imageUrlimageUrlurlurlmarketmarketscrapedAtscrapedAtdescriptiondescriptionspecificationsspecificationsimageUrlsimageUrlsimageCountimageCountdeliveryEstimatedeliveryEstimatevariantsvariantscategoriescategorieschangeTypechangeTypechangedFieldschangedFieldsfirstSeenAtfirstSeenAtlastSeenAtlastSeenAtExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"recordId": "8710000000001",
"title": "Sample Garden Chair",
"brand": "vidaXL",
"price": 49.99,
"oldPrice": 69.99,
"onSale": true,
"currency": "EUR",
"ean": "8710000000001",
"sku": "100001",
"categoryPath": "Furniture > Garden Chairs",
"imageUrl": "https://example.com/image_1.jpg",
"imageUrls": [
"https://example.com/image_1.jpg",
"https://example.com/image_2.jpg"
],
"imageCount": 2,
"description": "A sturdy garden chair made from treated wood...",
"specifications": {
"Colour": "Grey",
"Material": "Wood",
"EAN": "8710000000001"
},
"availability": "InStock",
"stockStatus": "In stock",
"deliveryEstimate": "2-4 working days",
"url": "https://www.vidaxl.de/e/sample-garden-chair/8710000000001.html",
"market": "de",
"scrapedAt": "2026-10-10T00:00:00Z"
}Ways to use this data
- Resellers and dropshippers: collect current vidaXL prices, variants and stock state to compute margins and keep listings in sync.
- Price monitoring teams: schedule the same search daily and collect only NEW, UPDATED and EXPIRED rows with per-field change lists.
- Catalogue builders: bulk-collect names, descriptions, specifications and image galleries to populate a store or database.
- Market researchers: compare the same product across six European storefronts, each with its own price and currency.
- Content teams: reuse product descriptions and specification tables as the base for your own listings.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does VidaXL Scraper return?
The documented output for VidaXL Scraper includes recordid, title, brand, price, oldprice, onsale, currency and availability. Availability of each field depends on the source page and the selected mode.
How much does VidaXL Scraper cost?
It costs $2.50 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Why did a run return fewer products than the store shows?
The run stops at Max items (or Max pages), cheapest walk order first under your sort. Set them higher, or to 0, to collect the whole search.
Why did my run fail instead of returning an empty dataset?
If the store refuses every request, the run stops with a clear message so "no products today" is never confused with "nothing could be read". Run it again in a few minutes.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
