Bershka Product Scraper — Prices, Sizes & Stock
Pricing
from $2.70 / 1,000 scraped products
Bershka Product Scraper — Prices, Sizes & Stock
Scrape Bershka into a clean 58-column dataset: price, old price, discount, currency, colours, images, per-SKU sizes, stock and GTIN barcodes, across 200+ country stores. Sweep the catalogue, one category, the sitemap, or paste product URLs. No account or proxy needed.
Pricing
from $2.70 / 1,000 scraped products
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Bershka API & Product Scraper — Prices, Sizes & Stock 👕
🎉 The Bershka API nobody publishes: 200+ country stores, each price in its own currency, 58 columns per product with per-SKU stock, GTIN barcodes and promotion end dates
Built for price analysts, assortment planners and resellers who need bershka.com as clean rows instead of screenshots.
🔎 What is the Bershka Product Scraper — and when should you use it?
The Bershka Product Scraper turns bershka.com's public catalogue into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.
Use it when you need: Bershka products with current price, pre-discount price, discount percentage and the market's own currency. Also colours, images, the full category path, composition, care, and per-SKU sizes with stock, GTIN barcodes, dimensions and weight.
Use something else when: you want a different Inditex brand. Use Stradivarius Product Scraper or Pull&Bear Product Scraper for the sibling young-fashion brands, or Inditex Product Scraper when you want several brands in one dataset with one schema.
🤖 Use with AI agents
Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/bershka-product-scraper
Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want Bershka product data using the Apify Actor `sian.agency/bershka-product-scraper`.Use it when I need: Bershka products with current price, pre-discount price, discount percentage and the market's own currency, plus colours, images, full category taxonomy, composition, care, and per-SKU sizes with stock, GTIN barcodes, dimensions and weight.Don't use it when: I want a different Inditex brand — use `stradivarius-product-scraper` or `pull-and-bear-product-scraper`, or `inditex-product-scraper` for several brands at once.How to call it: `mode` is either "overview" (walks the category tree and returns every product) or "detail" (takes product URLs I paste). In overview mode set `country` to the two-letter market, keep `allCategories` on, and cap the run with `maxItems`.Start with this input:{"mode": "overview","country": "DE","allCategories": true,"maxItems": 100}Ask me which market and how many products, then run the Actor and summarise the results as a table.
Things you can ask your agent for:
- Compare the same Bershka product across the German, Spanish and British stores and show me the price gaps in local currency.
- Pull 300 Bershka products and list everything that is discounted, with the date the promotion ends.
- Give me every Bershka SKU in this category with its size, stock state and barcode.
Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/bershka-product-scraper.md.
📋 Overview
The Bershka Product Scraper reads bershka.com the way the site reads itself. It talks to the same catalogue endpoints, so you get the real record — not whatever survived an HTML parse. The whole product comes back from the cheap sweep, sizes and all.
What you get:
- ✅ 58 columns per product: price, old price, discount, currency, colours, images, taxonomy, description, composition, care, per-SKU sizes
- 🌍 217 country stores: each priced in its own currency, with the market's divisor already applied
- 📐 Per-SKU sizes and stock in the cheap sweep: colour by size, with buyable and back-soon flags, no second request needed
- 🏷️ GTIN barcodes: the join key to every other retail dataset
- 🗓️ Promotion windows: per-SKU price start and end dates, so you know the date a markdown ends, not only that one is running
- 🧾 A bill you can audit: the
sourcecolumn on every row says which call produced it, so your invoice reconciles against the dataset - 💰 $3.00 per 1,000 products on the category sweep, and the price steps down as your Apify plan tier goes up
✨ Features
- 🗂️ Category sweep: walk the whole tree, or name one category and take just that
- 🗺️ Sitemap sweep: pick up catalogue items no category lists, for genuine full-catalogue coverage
- 🔗 Paste your own URLs: hand it product links or bare ids and get one full record each
- 🎚️ Facet filters:
color=,size=,category=anddiscount=shortcuts, or any facet group the site publishes - 💶 Price bounds: keep only what falls between your floor and ceiling, in the market's major units
- ↕️ Sort: catalogue order, price ascending or price descending
- 🧹 Deduplicated: the same product reached from two categories is counted and charged once
- 📉 Honest run summary: products pushed, duplicates skipped, ids that no longer exist, and fetches that genuinely failed — reported apart, never merged
🎬 Quick Start
Pick a market, leave the category sweep on, cap the run, press Run.
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~bershka-product-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"mode": "overview","country": "DE","allCategories": true,"maxItems": 100}'
🚀 Getting Started (3 Simple Steps)
Step 1: Choose your market
Set Market to a two-letter country code — DE, ES, FR, GB, JP and around 210 more. Prices, names and stock are per market, and the country column travels with every row.
Step 2: Choose what to scrape
Leave Sweep All Categories on for the catalogue. Turn it off and fill Single Category to take one grid. Or switch Run Mode to detail and paste product URLs.
Step 3: Run and download
Set Max Products so the first run is cheap, press Run, and export as JSON, CSV or Excel from the dataset tab.
That's it. Within a couple of minutes you'll have:
- Every product in your market with price, old price, discount and currency
- Colours, full image galleries and the complete category path
- Per-SKU sizes with stock, barcodes, dimensions and weight
- A run summary telling you exactly what was and was not fetched
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| mode | string | No | overview walks the categories, detail reads the URLs you paste. Default overview |
| country | string | No | Two-letter store country, e.g. DE, ES, FR, GB, JP. Default DE |
| language | string | No | Two-letter language for names and descriptions. Empty takes the store default |
| allCategories | boolean | No | Sweep every category. On by default, and it wins over Single Category |
| category | string | No | One category by slug or numeric id. Only used when the sweep is off |
| fromSitemap | boolean | No | Also crawl the product sitemap for anything the categories missed. Bills at the detail rate |
| maxItems | integer | No | Stop after this many distinct products. 0 means no cap. Default 100 |
| productUrls | array | No | Product URLs or bare product ids, one per line. Required in detail mode |
| sort | string | No | default, price_asc or price_desc, applied over the ids the category ships |
| filters | array | No | Facet filters as GROUP=VALUE, one per line. Same group OR-ed, different groups AND-ed |
| minPrice | integer | No | Drop products below this price, in the market's major units |
| maxPrice | integer | No | Drop products above this price, in the market's major units |
| batchSize | integer | No | Product ids per call. Default 100, maximum 200 |
| jitterMs | integer | No | Random pause before each request, in milliseconds. Default 0 |
| proxyConfiguration | object | No | Leave it off. The Actor reaches the API directly and a proxy adds cost without adding success |
Example — sweep one market:
{"mode": "overview","country": "DE","allCategories": true,"maxItems": 500}
Example — one category, filtered by colour and price-capped:
{"mode": "overview","country": "DE","allCategories": false,"category": "1010850209","filters": ["color=Blau"],"maxPrice": 40}
Facet values are published per category and change with the season. discount= takes the markdown percentages that category currently carries (30, 50, …), not a yes/no flag — name a value the category does not offer and the run stops and prints the ones it does.
Example — specific products:
{"mode": "detail","country": "DE","productUrls": ["https://www.bershka.com/de/-c0p123456789.html","123456789"]}
📤 Output
Results are saved to the Apify dataset with 58 columns per product. Export as JSON, CSV or Excel.
| Field | Type | Description |
|---|---|---|
| brand | string | Brand key stamped on every row. Always bershka on this Actor |
| product_id | integer/string | Catalogue id. The only column that is never null — the join key for everything else |
| url | string | Canonical product page for the market you scraped |
| source | string | Which call produced the row: overview or detail |
| url_id | integer/string | Numeric id used in the product URL |
| reference | string | Internal style reference, stable across markets |
| display_reference | string | The shorter reference printed on the page and the label |
| seo_product_id | string | Zara SEO id. Null on this brand |
| seo_keyword | string | Zara URL slug. Null on this brand |
| name | string | Product name in the market language |
| name_en | string | English product name, when the catalogue carries one |
| product_type | string | Catalogue type of the record, e.g. Product or Bundle |
| kind | string | Zara grid classification. Null on this brand |
| country | string | Market the prices and names belong to |
| language | string | Language the names and descriptions came back in |
| store_id | integer/string | Internal store id for the market |
| catalog_id | integer/string | Internal catalogue id for the market |
| section_name | string | Zara-only column. Null on this brand — this catalogue publishes the section in English only, in section_name_en |
| section_name_en | string | English name of the section |
| family_name | string | Product family in the market language |
| family_name_en | string | English product family — group on this across markets |
| subfamily_name | string | Sub-level of the family in the market language |
| subfamily_name_en | string | English sub-level of the family |
| categories | array | Every category the product is filed under, as {id, name} |
| category_id | integer/string | Zara-only column. Null on this brand |
| category_name | string | Zara-only column. Null on this brand |
| price | number | Current price in major units, divisor already applied |
| old_price | number | Pre-discount price. Null when the product is not reduced |
| currency | string | ISO currency of the market, e.g. EUR, GBP, JPY |
| discount_pct | number | Percentage off, computed from price and old price |
| on_special | boolean | Catalogue flag for a promotional product |
| main_image | string | First image of the shown colour, full resolution |
| images | array | Every image URL for the shown colour, in catalogue order |
| description | string | Long product description, falling back to the short one |
| additional_info | string | Extra copy the catalogue attaches to the product. Measured empty on every product we sampled — treat it as a bonus |
| keywords | string | Merchandising keywords attached to the product. Measured empty on every product we sampled — treat it as a bonus |
| assembly_url | string | Link to an assembly or instruction sheet, where one exists |
| color_name | string | Name of the colour this row represents |
| colors | array | Colour objects with id, name and reference |
| available_color_names | array | Zara-only column. Null on this brand |
| composition | array | Material breakdown per garment part, with the percentage of each fibre |
| care | array | Washing and care instructions as {id, name, description} |
| variants | array | One entry per colour and size — see the table below |
| size_guide | string | Zara-only column. Null on this brand |
| availability | string | Zara-only column. Null here — this brand reports stock per SKU in variants |
| is_buyable | boolean | Whether the product can currently be added to a basket |
| back_soon | boolean | Catalogue flag for a restock that is already scheduled |
| visibility | string | Catalogue visibility state, e.g. visible or hidden |
| availability_date | string | Date the product becomes or became available |
| first_visible_date | string | Zara detail column. Null on this brand |
| is_continuity | boolean | True for a carryover line, false for a seasonal drop |
| is_pinned | boolean | Zara grid column. Null on this brand |
| grid_position | integer | Zara grid column. Null on this brand |
| join_life | string | Join Life sustainability label text, when the product carries one |
| sustainability_show | boolean | Whether the product page shows a sustainability badge |
| sustainability | object | Full sustainability node off the shown colour |
| traceability | object | Supply-chain traceability node off the shown colour |
| certified_materials | array | Certified material entries off the shown colour |
Inside variants — one entry per colour and size:
| Field | Description |
|---|---|
| sku | Stock-keeping unit id for this colour and size |
| color / color_id | Colour name and id of the SKU |
| size | Size label as the market prints it |
| partnumber | Catalogue part number |
| price / old_price | SKU price and pre-discount price in major units |
| barcode | GTIN barcode of the SKU — the join key to other retail datasets |
| price_start_date / price_end_date | When the current price took effect and when it expires |
| old_price_start_date / old_price_end_date | The same window for the pre-discount price |
| is_buyable / back_soon | Whether this SKU can be bought now, and whether a restock is scheduled |
| dimensions / weight | Named physical axes and gram weight of the SKU |
| origin | Manufacturing country of the SKU |
Example row (trimmed):
{"brand": "bershka","product_id": 123456789,"url": "https://www.bershka.com/de/-c0p123456789.html","source": "overview","price": 19.99,"old_price": 29.99,"currency": "EUR","discount_pct": 33.3,"country": "DE","family_name_en": "TOPS","is_continuity": false,"variants": [{ "sku": 44112233, "size": "M", "barcode": "8445123456789", "price": 19.99, "is_buyable": true,"price_start_date": "2026-08-01T00:00:00Z", "price_end_date": "2026-08-31T23:59:59Z", "weight": 180 }]}
One field to know about before you buy. Bershka fills description on roughly 30% of products. That is the catalogue rather than the scraper, and the number is measured, not guessed: price, images and GTIN barcode all came back at 100% on the same check. The paragraph below lists the columns that belong to other brands and stay null here.
Columns that belong to other brands. first_visible_date, grid_position, is_pinned, available_color_names, seo_keyword, section_name, category_id, category_name and size_guide come from Zara and stay null here. traceability and certified_materials are in the schema and often empty — treat them as a bonus rather than a guarantee. No Inditex brand publishes ratings or reviews, so no scraper can return them.
💼 Use Cases & Examples
1. Price and markdown tracking
A retail analyst wants to see how deep and how long the markdowns run.
Input: a weekly sweep of the market
Output: old_price, discount_pct, on_special, and per-SKU promotion start and end dates
Use: markdown cadence and depth, and the date each promotion ends
2. Size and stock monitoring
A reseller wants to know which sizes are actually available before sourcing.
Input: a category sweep, or product URLs in detail mode
Output: per-SKU size, stock, buyable and back-soon flags
Use: sourcing decisions, restock alerts, sell-through estimates
3. Barcode-keyed catalogue matching
A marketplace needs to match these products against its own inventory.
Input: a full sweep of one market Output: GTIN barcodes per SKU alongside price, size and stock Use: joining to any other retail dataset without fuzzy name matching
4. Cross-market price comparison
A pricing analyst wants to know what the same product costs in several countries.
Input: the same run repeated per country
Output: price, old price, discount and currency per market
Use: grey-market spotting, launch pricing, currency-adjusted benchmarks
5. Assortment and range analysis
A category manager wants the shape of the range, not only its contents.
Input: a full category sweep
Output: family and subfamily taxonomy, colours, is_continuity, price distribution
Use: range width per family, carryover versus seasonal split, price architecture
🔗 Integration Examples
JavaScript/Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/bershka-product-scraper').call({mode: 'overview',country: 'DE',allCategories: true,maxItems: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Got ${items.length} products`);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/bershka-product-scraper').call(run_input={'mode': 'overview','country': 'DE','allCategories': True,'maxItems': 500,'maxPrice': 40,})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['name'], item['price'], item['currency'])
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~bershka-product-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"mode": "detail","country": "DE","productUrls": ["123456789"]}'
Automation Tool Workflows (n8n, Zapier, Make, etc.)
- Trigger: schedule or webhook
- HTTP Request: start a run and wait for the dataset
- Process: diff against last week's
product_idandprice - Action: write to your warehouse, or alert on new markdowns
📊 Performance & Pricing
Performance
- ~20 products per second on the category sweep
- 512 MB memory, no proxy, no browser — direct API reads
- Duplicates removed before anything is charged, so you pay once per distinct product
How you are billed
Two product events, and the source column on every row tells you which one applied. Your invoice reconciles against the dataset.
| What you ran | source on the row | Event | Price |
|---|---|---|---|
| Run start | — | Actor start | $0.005 once |
| Category sweep | overview | Scraped product | $0.003 |
| Pasted URL, or a sitemap row | detail | Scraped product detail | $0.0075 |
One switch moves a row onto the higher-priced event. Also Crawl the Sitemap cannot use the bulk endpoint — it is one request per product instead of one per hundred, so those rows bill at $0.0075 instead of $0.003, 2.5× the sweep price. A 1,000-product sitemap sweep costs $7.50 where the same 1,000 products from the category sweep cost $3.00. Sitemap mode buys completeness, and the category sweep is the default and the cheap path.
Cost examples
- 100 products, category sweep: $0.305
- 1,000 products, category sweep: $3.005
- 100 pasted product URLs: $0.755
Prices shown are the BRONZE tier. They step down at SILVER, GOLD, PLATINUM and DIAMOND, so heavier use costs less per row.
❓ Frequently Asked Questions
Q: Do I need a second run to get sizes? A: No. This brand's catalogue returns colours, sizes, per-SKU stock, barcodes, dimensions and weight in the cheap category sweep. Detail mode exists for pasted URLs, not because the sweep is missing anything.
Q: Can I search by keyword? A: No, and neither can anything else. The site publishes no server-side search endpoint. Name a category or sweep them all and filter the results yourself.
Q: Which markets are supported? A: Around 210 country stores. Set Market to a two-letter country code. Prices come back in that market's own currency with the correct divisor applied.
Q: Does it return customer reviews? A: No. This brand does not publish ratings or reviews through its catalogue, so no scraper can return them.
Q: How complete is the data? A: Measured coverage on Bershka: price, images and GTIN barcode at 100%, description at roughly 30%. Every column in the table above is documented with what it holds and which brands fill it.
Q: Do I need a proxy? A: No. Leave the proxy off. The Actor reaches the catalogue API directly from Apify, verified on the platform, and a proxy only adds cost.
Q: What output formats are available? A: JSON, CSV and Excel, exported straight from the dataset. There is also a run summary in the key-value store with the counts for the run.
🐛 Troubleshooting
Zero products returned
- The category you named is a container rather than a product grid — those return no ids
- Your filters or price bounds excluded everything; widen them
- Leave Sweep All Categories on and let the Actor find the grids
The run summary says complete: false
- Some fetches failed for transport reasons, so the dataset is short. Re-run to fill the gap
- Ids reported as gone are a different thing: those products no longer exist in that market
A response timed out on a large market
- Lower Batch Size from 100. Some markets return very large product records
Sitemap mode is slower and dearer than expected
- That is the trade: it is one request per product instead of one per hundred, and those rows bill at the detail rate. Use the category sweep unless you need the products no category lists
⚖️ Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
Trademarks. Bershka is a trademark of Industria de Diseño Textil, S.A. This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Inditex or any of its brands, and it reads only publicly available catalogue pages.
🤝 Support
Join our active support community
- 🐛 Found a bug? File an issue in the Apify Console Issues tab
- ⭐ Loving the tool? Leave a 5-star review — it helps us build more
- Check SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools