Mango Scraper at a glance
Mango Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes product id, product, change type (incremental mode), brand and section, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 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
- Ecommerce, Developer Tools, Automation
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 20 options
Scrape Mango (shop.mango.com) fashion products: current price plus strike-through Rebajas (sale) discount, full colour/size variant matrix, section and category, and (with full detail) composition, care, materials, origin, fit and per-size availability. Search by keyword or Rebajas, or paste links.
What Mango Scraper can do
- Was-price and discount, straight from Mango's own pricing service. When a product is marked down, both the current and original prices are captured, plus the discount percentage and Mango's own promotion label.
- Rebajas, first class. A specialsOnly toggle browses Mango's own, real, queryable Rebajas (sale) catalog for the chosen section, with genuine server-side pagination, not a guessed category filter. Mango Outlet is a separate site and out of scope here.
- Full colour/size matrix. Every colourway and size Mango sells for a product, each colour with its own price, discount and image gallery. Turn on full detail and each size also carries real-time availability (in stock, last units, or delayed).
- Composition, care, materials, origin and fit. With full detail on, every product also returns its fabric composition, wash-care instructions, a material breakdown by percentage, country of origin, and garment fit measurements.
- Two ways in. Keyword search or Rebajas browse, or paste any product or category link and the actor continues pagination forward automatically from wherever the link points.
- Built for recurring monitoring. Incremental mode returns only new and changed products on repeated runs against the same search, and a rejected scan fails loudly instead of quietly returning an empty dataset.
Choose what to collect
These inputs let you configure Mango Scraper - Prices, Rebajas, Variants & Composition. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | 'search' finds products by keyword and/or Mango's own Rebajas (sale) feed for a chosen section. 'url' scrapes any product or category/Rebajas listing page URL you paste, walking pagination forward automatically. |
marketstring | Mango's own market path prefix, e.g. 'es/es' (Spain, Castellano) or 'gb/en' (UK, English). Applies to search mode; a pasted URL in url mode carries its own market instead. |
sectionstring | Which Mango nav section to search/browse. Only Women and Men are wired to keyword search and the Rebajas feed below; other sections (Teen, Kids, Home) can still be scraped via pasted URLs in url mode. |
searchTermstring | Free-text keyword, e.g. 'vestido' or 'pantalon lino'. Mango's own search results page does not paginate (verified live), so a keyword search always returns a single page of results. Leave empty and use Rebajas only below to browse the sale feed without a keyword. |
specialsOnlyboolean | Browse Mango's own, real, queryable Rebajas (sale) catalog for the chosen section, with genuine server-side pagination -- verified live (2000+ items across dozens of pages). Does not combine with a keyword (mango.com's search and its Rebajas catalog are two separate systems); a keyword is ignored when this is on. Mango has no separate 'Outlet' catalog on shop.mango.com itself (Mango Outlet is a distinct site, out of scope here), so Rebajas is the site's one real specials taxonomy. |
urlsarray | Paste one or more mango.com product pages (/p/), category listing pages (/c/, including the current promotion/sale listing, which replaced the old Rebajas link) or keyword search pages (/search/...?q=), in any market. Other link shapes are skipped with a warning. Pagination continues forward automatically from any ?page= already in the URL. Search-mode fields are ignored here. The fields in the Filters section still apply, including to a pasted product URL. |
minPricenumber | Only return products priced at or above this amount, in the market's own currency. Applies in BOTH search mode and URL mode, including a pasted product URL. |
Show 13 more inputs
| Input | What it controls |
|---|---|
maxPricenumber | Only return products priced at or below this amount, in the market's own currency. Applies in BOTH search mode and URL mode, including a pasted product URL. |
fetchDetailsboolean | Adds composition, care instructions, material breakdown by percentage, country of origin, fit/garment measurements, and per-size availability (in stock / last units / delayed) from the product page. Current price, was-price/discount, and the colour/size matrix (without per-size availability) are already included without this toggle. A pasted product URL in url mode always fetches full detail regardless of this toggle. |
maxPagesinteger | Stop after this many result pages per Rebajas/URL entry. Only applies to Rebajas browsing and pasted category URLs (keyword search is always a single page). 0 (default) = unlimited -- walk every page until the site stops returning new products or Max products total is hit. |
maxItemsinteger | Hard cap on total products returned across every search/URL entry. 0 = unlimited (still bounded by Max pages per search). |
resumeFromRunIdstring | Paste a previous run id (or its dataset id) to continue a large crawl without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product pull in another run. For recurring monitoring of the same search/section/URLs, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. A product counts as UPDATED when any output field other than the volatile ones changes -- price, original price, discount, promo, currency, name, category, colours, sizes and (with Fetch details) per-size availability and composition; reviews fields are placeholders and never drive changes. Never compared: the headline image, colors.images, galleryImages and scrapedAt (links, order and timestamps churn between scrapes), and the derived convenience fields site, isSale, color, sizes, details, rating and ratingCount (they duplicate fields that are already compared), plus anything you list in "Ignore fields when detecting changes" below. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately for each mode/section/search/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/section/search/URL and detail settings -- different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search/URLs -- not when Max products capped it, or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names that must NOT count as a change, so a product is not reported UPDATED just because they moved. They stay in the output rows. Use a top-level name (for example name) or a dotted path that walks through lists (for example colors.sizes.available, colors.label). Built in and always ignored: the headline image, colors.images, galleryImages and scrapedAt (links, order and timestamps churn without the product changing), plus the derived convenience fields site, isSale, color, sizes, details, rating and ratingCount (they duplicate fields that are already compared, or are placeholders). productId can never be ignored. Changing this list never causes a one-time wave of UPDATED rows: unchanged products are re-checked against the saved copy using the current list. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
productIdProduct ID (text)nameProduct (text)changeTypeChange type (incremental mode) (text)brandBrand (text)sectionSection (text)categoryCategory (text)pricePrice (number)currencyCurrency (text)originalPriceOriginal price (number)discountPercentDiscount % (number)isOnSpecialOn Rebajas (boolean)urlURL (link)Show 18 more fields
imageImage (image)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)siteSite (text)isSaleOn sale (boolean)colorColour (text)ratingRating (number)sizesSizes (array)galleryImagesGallery images (array)detailsDetails (object)scrapedAtScraped at (date)colorsColours (sizes, price, availability when detail is on) (object)compositionsComposition (array)careCare instructions (array)materialsMaterials (name, percent) (object)originCountryMade in (text)measuresFit / garment measures (array)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"productId": "37021368",
"name": "Sample Linen Trousers",
"brand": "Mango",
"section": "Women",
"collection": "OI2026",
"model": "SACO",
"category": "Trousers",
"families": [
{
"id": "26",
"label": "Trousers",
"labelEn": "Trousers"
}
],
"url": "https://shop.mango.com/es/es/p/mujer/pantalones/sample-linen-trousers/37021368",
"price": 19.99,
"currency": "EUR",
"originalPrice": 29.99,
"discountAmount": 10,
"discountPercent": 33.3,
"isOnSpecial": true,
"promoLabel": "PROMOCION HASTA REBAJAS",
"image": "https://media.mango.com/is/image/punto/37021368-99-002",
"defaultColorId": "99",
"colors": [
{
"id": "99",
"label": "Black",
"rgb": "36,36,36",
"sizes": [
{
"id": "36",
"label": "36",
"plusSize": false,
"available": true,
"isDelayed": false,
"lastUnits": false
}
],
"images": [
{
"code": "002",
"url": "https://media.mango.com/is/image/punto/37021368-99-002",
"alt": "Sample Linen Trousers"
}
],
"price": 19.99,
"currency": "EUR",
"originalPrice": 29.99,
"discountAmount": 10,
"discountPercent": 33.3,
"isOnSpecial": true,
"promoLabel": "PROMOCION HASTA REBAJAS"
}
],
"compositions": [
"Composition: 55% linen, 45% viscose"
],
"care": [
"Machine wash max 30°C, short spin",
"Do not bleach"
],
"materials": [
{
"name": "LINEN",
"percent": 55
},
{
"name": "VISCOSE FSC",
"percent": 45
}
],
"originCountry": "China",
"measures": [
"Inseam 76 cm",
"Side length 104 cm"
],
"lastUnits": false,
"isSellable": true,
"isUniqueSize": false,
"reviews": {
"averageRating": null,
"totalReviewCount": 0,
"items": []
}
}Ways to use this data
- Price monitoring and repricing: track current price, was-price and discount percentage across a catalog or a competitor's Rebajas feed.
- Sale and markdown tracking: watch Mango's own Rebajas feed for new markdowns, or monitor a specific search for pieces that go on sale.
- Merchandising and content teams: pull product names, categories, colours and imagery to power a storefront, lookbook, or newsletter.
- Size and stock monitoring: use full detail mode to track per-size availability (in stock, last units, delayed) for a product line.
- Catalog and assortment research: build a dataset of category, composition, materials and origin across a section for market or sustainability research.
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 Mango Scraper return?
The documented output for Mango Scraper includes product id, product, change type (incremental mode), brand, section, category, price and currency. Availability of each field depends on the source page and the selected mode.
How much does Mango Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each later run against the same search/section/URL set returns only NEW and UPDATED products by default; unchanged ones are suppressed and not billed unless you turn on Emit unchanged products.
Does a returning product ever come back marked REAPPEARED?
Only if it was previously marked EXPIRED. That itself requires Emit expired products to have been on for an earlier run that scanned the tracked scope completely, with no Max products or Max pages cap, no Resume, and no rejected page. Without that history, a product that disappears and later comes back is classified UPDATED if anything about it changed, or suppressed UNCHANGED if it did not; its state record is never deleted, so it is never NEW again.
What's the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues ONE specific interrupted run: paste its run or dataset id and already-collected products are skipped. Incremental mode is for running the same search again and again, daily or weekly, and getting only what changed; it remembers its own state between runs, keyed by the search/section/URL/detail settings or by your own State key.
Why did my run fail instead of returning an empty dataset?
If the run returns nothing and at least one page or product request (a search page, a Rebajas catalog page, a pasted listing page, or a product detail fetch) was rejected by the site (for example, the Rebajas catalog can go offline outside its own sale season), the run stops with a clear error message instead of finishing successfully with 0 items, so "nothing matched" is never confused with "nothing could be read". A price filter that legitimately narrows a successfully loaded catalog to zero rows, with no rejected requests, still finishes as a normal, empty run.
