Fruugo Scraper - Products, Prices, Sellers & GTIN/EAN avatar

Fruugo Scraper - Products, Prices, Sellers & GTIN/EAN

Pricing

from $1.60 / 1,000 product records

Go to Apify Store
Fruugo Scraper - Products, Prices, Sellers & GTIN/EAN

Fruugo Scraper - Products, Prices, Sellers & GTIN/EAN

Scrape Fruugo marketplace products by keyword or URL across country storefronts. Extract product names, prices, currencies, merchants, seller counts, GTIN/EAN product identifiers and images.

Pricing

from $1.60 / 1,000 product records

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Fruugo Scraper: Products, Prices and Sellers

Fruugo Scraper turns Fruugo into a clean product data API. Search the marketplace by keyword or paste product links, and get titles, brands, prices with currency, list prices and discounts, merchant names, seller counts, shipping costs, stock state, GTIN/EAN codes, descriptions, attributes and image galleries, priced the way local shoppers see them. Then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • Two ways in. Search by keyword, or paste Fruugo product and search links. No need to build URLs by hand.
  • Country storefront pricing. Prices, currency, merchant offers and availability are served per country. The Australian storefront is verified end to end; the United Kingdom storefront also serves and is offered on the same basis. Every storefront sits behind the same protective challenge whose availability opens and closes in short windows, Australia included: a closed window fails the run loudly instead of returning an empty dataset, and a retry a few minutes later usually lands in an open window.
  • Seller depth on demand. Switch product details on for the merchant name, shipping cost, stock state, GTIN/EAN, description, attributes and the full image gallery, and pay the surcharge only for what you enrich.
  • Discounts included. List price and discount percent ride on every enriched row, ready for price monitoring and MAP tracking.
  • GTIN/EAN on every enriched row. Join Fruugo rows with your other retail datasets on the barcode.
  • Built for schedules. Incremental mode returns only new and changed products on recurring runs, and a refused run fails loudly instead of returning an empty dataset.

Use Cases

  • Local-market pricing: read the catalogue at Australian shopper prices, with currency, merchant offers and availability exactly as local shoppers see them.
  • Brand and MAP monitoring: track list prices, discounts and merchant offers per product over time.
  • Dropshipping and sourcing research: find merchants, seller counts and shipping costs behind any listing.
  • Catalog enrichment: fill GTIN/EAN codes, descriptions, attributes and image galleries into your own product database.
  • Market analytics and data science: build historical price and availability datasets for modelling.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
recordId"fruugo:AU:307014223"
urlFruugo link to the product
productId / skuId / fruugoId"307014223" / "687617615" / "307014223-687617615"
title"Sample Eye Drops 15ml"
brand"Sample Brand"
category / breadcrumbs"Eye Drops" / "Shop > Health > Eye Drops"
price / priceCurrency / priceText18.95 / "AUD" / "From $18.95"
listPrice / discountPercent34.95 / 28.6
availability / inStock"In Stock" / true
merchantName"Sample Merchant"
sellerCount4
shippingPrice / shippingText15.99 / "+ $15.99 Shipping"
description"Sample product description."
ean / gtin / sku"9312345678901" / "9312345678901" / "687617615"
imageUrl / imageUrlscover image / full gallery
attributes["Age Group: kids", "Gender: male"]
returnDays14
country"AU"
changeType / changedFields / firstSeenAt / lastSeenAtincremental mode only

Card fields (title, brand, price, seller count, link) are on every row either way. Detail fields (description, merchant, shipping, stock, GTIN/EAN, gallery, attributes, return terms) need Fetch product details.

How to Use

  1. Pick a mode: search (by keyword) or url (paste links).
  2. Pick the country storefront whose prices you want.
  3. Leave Fetch product details on for the full row, or switch it off for a fast crawl.
  4. Set Max items to control run size and cost, then click Start.
  5. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search for a keyword:

{
"mode": "search",
"searchTerms": ["lego"],
"country": "AU",
"fetchDetails": true,
"maxItems": 5
}

One product in full:

{
"mode": "url",
"urls": ["https://www.fruugoaustralia.com/visine-eye-drops-red-eye-comfort-05-oz-15ml/p-307014223"],
"country": "AU",
"fetchDetails": true
}

Cheapest first, details on:

{
"mode": "search",
"searchTerms": ["lego"],
"country": "AU",
"sort": "prasc",
"fetchDetails": true,
"maxItems": 10
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/fruugo-com-scraper").call(run_input={"mode": "search", "searchTerms": ["lego"], "country": "AU", "maxItems": 5})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["title"], product["price"], product["priceCurrency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/fruugo-com-scraper').call({ mode: 'search', searchTerms: ['lego'], country: 'AU', maxItems: 5 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips everything already collected there, so you don't pay twice.
  • Incremental mode (incrementalMode) is for scheduled runs over the same scope. Each record is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that scanned the whole scope, and only with emitExpired). stateKey names or shares the stored state. Price moves and stock changes ARE reported as UPDATED: on a store they are the signal, not noise. With incremental mode off, output is exactly as before. Note the store's search results rotate between runs, so a scheduled incremental run can legitimately classify most rows as NEW even when nothing you care about changed.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch or url.
searchTermsarray["lego"]Keywords to search (search mode).
urlsarraysampleFruugo product or search links (url mode). Both product link shapes (/p-307014223, /p-307014223-687617615) and search links (/search?q=..., &page=N, a sorting= on the link wins for that walk) are accepted, and each link is read on the storefront its host names (a fruugo.co.uk link returns UK-priced rows stamped country GB, whatever the country input says); a Fruugo link whose storefront cannot be mapped fails the run loudly.
countrystringAUCountry storefront: Australia (verified end to end) or the United Kingdom (serves through the same connection handling). Both flap in short windows like every storefront, Australia included; a refused run fails loudly. The United States storefront is not offered yet: it has not been verified. Pasted URL-mode links are honored for the storefront their host names.
sortstringrecommendedStore ordering: recommended or prasc (price lowest first; sorted cards omit the from-price, details fill it).
minPricenumber(none)Keep rows in this price range (storefront currency).
maxPricenumber(none)Keep rows in this price range (storefront currency).
fetchDetailsbooleantrueProduct page read per record (description, merchant, GTIN/EAN, gallery); charged once per record.
maxItemsinteger20Stop after this many records (0 = no limit).
maxPagesinteger0Safety bound on pages per source (0 = no page limit).
proxyobjectApify ProxyConnection settings. Residential is recommended for large or frequent runs.
resumeFromRunIdstring(none)Continue one interrupted run.
incrementalModebooleanfalseReturn only new and changed records on scheduled runs.
stateKeystring(none)Name or share an incremental-mode state.
emitUnchangedbooleanfalseAlso return (and bill) unchanged records.
emitExpiredbooleanfalseAlso return (and bill) expired records.
ignoreFieldsForChangesarray(none)Extra fields to exclude from change detection.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

Enriched product record:

{
"recordId": "fruugo:AU:000000000",
"url": "https://www.fruugoaustralia.com/sample-product/p-000000000",
"productId": "000000000",
"title": "Sample Eye Drops 15ml",
"brand": "Sample Brand",
"category": "Eye Drops",
"price": 18.95,
"priceCurrency": "AUD",
"listPrice": 24.95,
"discountPercent": 24.0,
"availability": "In Stock",
"inStock": true,
"merchantName": "Sample Merchant",
"sellerCount": 2,
"shippingPrice": 15.99,
"description": "Sample product description.",
"ean": "9312345678901",
"gtin": "9312345678901",
"imageUrl": "https://img.fruugo.com/product/1/28/0000000000_max.jpg",
"imageUrls": ["https://img.fruugo.com/product/1/28/0000000000_max.jpg"],
"attributes": ["Age Group: adult"],
"returnDays": 14,
"country": "AU"
}

Plan Requirement

The default proxy setting works out of the box, and the actor rotates connections automatically when one is refused. The storefront is read through ordinary shared connections once the session is established; for large or frequent runs, the residential proxy group gives more headroom and is recommended. If your Apify plan does not include proxy access, the run fails with a clear message instead of returning an empty result; a paid plan with proxy access is required.

FAQ

How much does it cost?

You pay per record returned, with product details billed only when Fetch product details is on. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.

This actor collects only publicly available marketplace data. You are responsible for how you use it: follow the store terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices and availability are generally facts, but photos, descriptions and brand assets may be subject to third-party rights.

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 run then returns only new and updated records, and unchanged ones are not billed.

Why did a run return fewer products than Max items?

The walk stops at the natural end of the results. Set a higher Max items, or 0, to collect the whole scope. Sorted searches return the store order, so a capped run keeps the cheapest rows first.

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 "nothing matched" is never confused with "nothing could be read". Run it again in a few minutes. If only some sources could be read, you still get what was found.

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.

🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

🛒 Idealo.de
Scrape Idealo.de products with identity details, GTIN, price ranges, specifications...
🛒 BIG W Marketplace Scraper
Scrape BIG W Marketplace seller listings from bigw.com.au: name, brand, price, was-price...
🧩 Miravia Spain Scraper
Scrape Miravia Spain by keyword, seller store or URL. Every row carries the selling price...
🔌 Currys UK Scraper
Scrape Currys UK electronics by keyword or URL. Extract prices, brands, stock status...
🧩 Allegro Scraper
Scrape Allegro by keyword or URL. Extract offers, prices, delivery, seller details, and...
🧩 eBay Scraper
Scrape eBay by keyword, category, seller or pasted link across 16 country storefronts...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.