Skip to content
    ↑↓ to choose · Enter to open

    · 16 min read

    Trolley Grocery Price Comparison Scraper: $5.00 per 1,000 Results

    By CrawlerBros Engineering Team

    When using the byProductIds mode, each record returns 19 fields covering names, brands, sizes, images, comprehensive multi-retailer price comparisons, up to 52 weeks of price history, ratings, and review snippets. This Actor extracts structured product information from Trolley.co.uk, a UK-focused grocery price comparison service. This Actor is suited for developers building price tracking tools or market research applications. It is not for anyone needing real-time in-store pricing, as prices reflect online listings, nor for those seeking retailer prices that require a login on Trolley.co.uk.

    Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 1,000 results at $0.005 each before platform usage. Open Trolley Grocery Price Comparison Scraper on Apify and run the prefilled example.

    How reliable is Trolley Grocery Price Comparison Scraper in production?

    Across the last 30 days of public runs on the Apify platform, Trolley Grocery Price Comparison Scraper recorded 950 runs with the following outcomes.

    Outcome Runs Share
    Succeeded 942 99.2%
    Failed 7 0.7%
    Aborted by the user 1 0.1%
    Timed out 0 0.0%
    Total 950 100.0%

    In the last 30 days, about 1 run in a hundred failed or timed out. This makes it suitable for unattended scheduling. You can expect most runs to complete successfully, and for mission-critical workflows, implement a simple retry mechanism for the few runs that might fail or time out.

    What does it cost to run Trolley Grocery Price Comparison Scraper?

    Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.

    Apify plan Per result Per 1,000 results
    FREE $0.005 $5.00
    BRONZE $0.00433 $4.33
    SILVER $0.00367 $3.67
    GOLD $0.003 $3.00
    PLATINUM $0.003 $3.00
    DIAMOND $0.003 $3.00

    Worked example: collecting 10,000 results costs $50.00 in result charges before run-start fees and platform usage. With 0.7% of runs failing or timing out in the last 30 days, budget for re-running a portion of those batches rather than assuming every run completes.

    The most significant factor influencing your bill is the total number of records emitted, directly controlled by the maxItems input. To manage costs effectively, always set a maxItems limit for your initial runs. You can use the free plan to test the Actor and confirm it meets your needs, covering up to 1,000 results before result charges apply.

    How do you run Trolley Grocery Price Comparison Scraper from the API?

    The schema marks 1 of its 13 controls as required: mode. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.

    Call the synchronous endpoint to start a run and receive dataset items in one request:

    curl -X POST "https://api.apify.com/v2/acts/crawlerbros~trolley-grocery-price-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"mode":"search","searchQuery":"milk","categorySlug":"vanilla-ice-creams","productIds":[],"store":"tesco","sortOrder":"relevance","dietary":"","maxItems":20}'
    

    The same run from Python, using the official client:

    from apify_client import ApifyClient
    
    client = ApifyClient("<YOUR_APIFY_TOKEN>")
    
    run_input = {
      "mode": "search",
      "searchQuery": "milk",
      "categorySlug": "vanilla-ice-creams",
      "productIds": [],
      "store": "tesco",
      "sortOrder": "relevance",
      "dietary": "",
      "maxItems": 20
    }
    
    run = client.actor("crawlerbros~trolley-grocery-price-scraper").call(run_input=run_input)
    
    for item in client.dataset(run["defaultDatasetId"]).iterate_items():
        print(item)
    

    And from Node.js:

    import { ApifyClient } from 'apify-client'
    
    const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
    
    const input = {
      "mode": "search",
      "searchQuery": "milk",
      "categorySlug": "vanilla-ice-creams",
      "productIds": [],
      "store": "tesco",
      "sortOrder": "relevance",
      "dietary": "",
      "maxItems": 20
    }
    
    const run = await client.actor('crawlerbros~trolley-grocery-price-scraper').call(input)
    const { items } = await client.dataset(run.defaultDatasetId).listItems()
    console.log(items)
    

    That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.

    Which Trolley Grocery Price Comparison Scraper inputs matter, and which can you skip?

    The mode control is central, determining whether you search by keyword, browse a category, look up specific products, or find deals by store. For a first run, most users should start with a mode of "search" and a simple "searchQuery". Consider leaving other controls at their default settings until you confirm the Actor delivers the expected data.

    • mode (string): What to fetch. Default: "search".
    • searchQuery (string): Free-text product search, e.g. milk, chocolate, washing pods. Default: "milk".
    • categorySlug (string): A Trolley.co.uk /explore/ category slug, e.g. vanilla-ice-creams, salted-butter, single-malt-whiskeys. Also accepts a full https://www.trolley.co.uk/explore/... URL.
    • productIds (array): Trolley.co.uk product IDs (e.g. MOZ184), product paths (/product/x/MOZ184), or full product URLs. Default: [].
    • store (string): Retailer to pull current deals from. Default: "tesco".
    • sortOrder (string): How to order search results. Lowest price first sorts by each product's best listed price across all retailers. Default: "relevance".
    • dietary (string): Only return search results tagged with this dietary attribute on Trolley.co.uk. Default: "".
    • maxItems (integer): Hard cap on emitted records. Default: 20.
    • brandFilter (string): Only return search results from this brand, e.g. Arla, Tesco, Yeo Valley. Must match a brand name Trolley.co.uk shows for the given search query - check a plain search first if unsure.
    • sizeFilter (string): Only return search results of this pack size, e.g. 1l, 500ml, 2l. Must match a size Trolley.co.uk shows for the given search query - check a plain search first if unsure.
    • minPrice (number): Drop products cheaper than this (best/lowest listed price).
    • maxPrice (number): Drop products more expensive than this (best/lowest listed price).

    The other 1 controls, with their defaults, are listed in the input schema on Trolley Grocery Price Comparison Scraper on Apify.

    Fixed-choice controls: mode accepts search (Search products by keyword), byCategory (Browse a curated category (Top products)), byProductIds (Lookup full price comparison by product ID), dealsByStore (Current deals at a specific retailer); store accepts 16 values (default tesco), including tesco, asda, sainsburys (Sainsbury's), morrisons; sortOrder accepts relevance, price (Lowest price first); dietary accepts "" (Any (no filter)), vegetarian, organic, vegan, halal, kosher, not tested on animals.

    What does Trolley Grocery Price Comparison Scraper return?

    The records returned are suitable for price comparison and historical analysis, providing product names, brands, sizes, and price points across various UK retailers. Notably, the output does not include any retailer prices that require a Trolley.co.uk account login to view. For byProductIds mode, you also get weekly price history and detailed product information like allergens.

    Output: per-product (mode = search / byCategory / dealsByStore)

    • productId - Trolley.co.uk product ID (e.g. MOZ184)
    • productUrl - canonical product page URL
    • name - full product title, including pack size
    • brand
    • description - short product description (without brand/size)
    • size - pack size / volume (e.g. 2l, 900ml)
    • imageUrl
    • price - lowest listed price found on the page (GBP)
    • currency - always GBP
    • pricePerUnit - e.g. £0.13 per 100ml (mode = search / dealsByStore)
    • rating - average shopper star rating, 0-5
    • storePrices[] - per-retailer {store, price, currency} snapshot (mode = byCategory only)
    • storeCount - number of retailers with a listed price (mode = byCategory only)
    • promotionalOffer - e.g. 2 FOR £4, when present
    • wasPrice, savingText - original price and saving description, for deals
    • dealAge - how long ago the deal was spotted (mode = dealsByStore)
    • store - retailer name (mode = dealsByStore)
    • reviewCount
    • sampleReviews[] - a few real shopper review snippets (mode = byCategory only)
    • relatedSearches[] - related keyword suggestions shown alongside the results (mode = search only)
    • recordType, scrapedAt

    Output: per-product detail (mode = byProductIds)

    • productId, productUrl, name, brand, description, size, imageUrl
    • storePrices[] - full per-retailer comparison: {store, price, currency, pricePerUnit, promotionalOffer, visitUrl}
    • storeCount - number of retailers compared
    • price, currency - the lowest price across all compared retailers
    • lowestPriceStore - which retailer has the lowest price
    • priceHistory[] - {week, price} for up to the last 52 weeks
    • rating - average shopper star rating, 0-5
    • sampleReviews[] - real shopper review text from the product page
    • productInfo - allergen/ingredient/origin facts shown in the product's "Good to know" panel, e.g. {"Contains": "Milk and Lactose"}
    • dietaryBadges[] - dietary badges shown on the product, e.g. ["Vegetarian"]
    • categoryRankings[] - {rank, category, categorySlug} for any "#1 in X" category leaderboard the product appears on
    • otherSizes[] - alternate pack sizes of the same product, each {productId, size, price, currency, pricePerUnit, badge, isCurrentSize}
    • relatedProducts[] - other products from the same brand shown on the product page
    • recordType, scrapedAt

    These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.

    How do you build the workflow end to end?

    Open Trolley Grocery Price Comparison Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.

    1. Set mode to "search" and enter a searchQuery like "chocolate", ensuring maxItems is set to a low number like 20 for a quick test.
    2. Inspect the name and brand fields in the results to confirm they match your expectations for the product query.
    3. If the initial search results are good, you can adjust maxItems to your desired volume and then experiment with filters like dietary, brandFilter, or sizeFilter to refine your dataset.
    4. To get comprehensive price comparisons and historical data for specific known products, change mode to "byProductIds" and provide productIds as an array, for example, ["MOZ184"].
    5. To find current promotions, set mode to "dealsByStore" and specify a store like "tesco".
    6. Examine the storePrices array for detailed retailer comparisons, or the promotionalOffer and wasPrice fields to identify active deals.
    7. If weekly price history is essential, verify that mode is set to "byProductIds" and check the priceHistory array in the output for up to 52 weeks of data.

    How do you apply it? Three worked playbooks

    These are Trolley Grocery Price Comparison Scraper's own documented use cases, each worked through as an operating pattern rather than a description.

    Use case 1: Price-comparison shopping apps

    Outcome: Power a "cheapest place to buy X" feature across UK supermarkets

    Configure: Set mode to "search", input a specific searchQuery, and set sortOrder to "price". You may also use filterByStore if you want to limit comparisons to a subset of retailers.

    Working method: Start with a single search query for a representative product. Examine the output to confirm that various retailers and their prices appear in the storePrices array. Once satisfied, expand to a broader range of search queries or integrate with a user input mechanism.

    Deliverable: A dataset of products with their lowest available price and a comparison of prices across specified UK supermarkets.

    Stop condition: Product results consistently lack prices from major retailers, or the storePrices array is often empty.

    Use case 2: Grocery budgeting tools

    Outcome: Track weekly price history to time purchases

    Configure: Set mode to "byProductIds" and provide an array of specific productIds you wish to track.

    Working method: Begin by supplying a small list of product IDs to ensure the priceHistory array is populated. Schedule this Actor to run weekly for the selected products, then compare successive runs to identify price changes and trends.

    Deliverable: A time-series dataset of weekly prices for a defined set of grocery products, enabling historical analysis.

    Stop condition: The priceHistory array consistently returns empty or incomplete data for tracked products.

    Use case 3: Market research

    Outcome: Monitor retailer pricing strategy and promotional cadence for a product category

    Configure: Set mode to "byCategory" with a relevant categorySlug. Alternatively, set mode to "dealsByStore" for a specific store.

    Working method: For category monitoring, run the Actor for a target category and analyze the price, promotionalOffer, and storePrices fields over time. For promotional cadence, schedule runs for dealsByStore on different retailers and observe the frequency and types of deals.

    Deliverable: Structured data revealing pricing patterns, promotional offers, and category rankings for specific product categories or retailers.

    Stop condition: Significant discrepancies between the scraped promotional offers and those observed directly on the Trolley.co.uk website.

    What breaks, and how do you design around it?

    • Over the last 30 days, 0.7% of public runs failed and 0.0% timed out. Build retries and alerting around those rates rather than assuming every run completes.

    When dealing with large volumes, break your requests into smaller batches to prevent potential rate limiting, especially when using complex filters. If you notice incomplete retailer prices, it is because Trolley.co.uk requires a login for some data, which this Actor does not provide. Adjust your expectations or consider supplementing with data from a different source if these missing details are critical.

    When should you not use Trolley Grocery Price Comparison Scraper?

    This Actor is not suitable if your primary need is real-time in-store prices, as it reflects online listings that may differ. You should also look elsewhere if you require competitor prices that Trolley.co.uk gates behind an account login, as this Actor only extracts publicly visible data. If your project is specifically focused on US or Canadian weekly grocery deals, consider Flipp Weekly Deals & Grocery Ad Scraper for broader coverage of US retailers. Similarly, for deep dives into a specific US regional grocery chain, an Actor like Wegmans Grocery Scraper might offer more targeted data. For comparing UK broadband deals, the uSwitch Scraper - UK Broadband Deals Comparison is purpose-built and would be superior.

    What should you check before trusting the output?

    • Verify that the name field accurately reflects the product, watching for generic titles for specific products.
    • Check that the price field is present and a valid GBP value for all critical records.
    • For mode="byProductIds", ensure the storePrices array contains entries for the expected retailers and that prices are not null.
    • When using dietary, brandFilter, or sizeFilter, confirm that the returned records adhere to these criteria.
    • If deals are being monitored, confirm the promotionalOffer and wasPrice fields are present when expected.
    • Monitor for runs with 0 results despite a broad query, which could indicate a change in site structure or filtering.

    None of this proves a record is correct. It gives a scheduled Trolley Grocery Price Comparison Scraper run defined points where it should stop instead of quietly passing bad data downstream.

    Frequently asked questions

    Can I try this Actor before I commit to payment?

    Yes, Apify's free plan includes $5.00 of monthly usage with no credit card required. This covers up to 1,000 results from this Actor. A first run using the example input is capped at 20 results, costing at most $0.10 in result charges, making it very affordable to evaluate the output quality. There is also a small run-start fee, which applies whether or not results are returned.

    How reliable is this Actor for scheduled, unattended runs?

    In the last 30 days, 942 out of 950 public runs succeeded, showing a 99.2% success rate. Only 7 runs failed and 0 timed out during this period. This indicates a high level of reliability, and you can expect that less than 1 run in a hundred will fail or time out. For maximum resilience, implement simple retry logic for any rare failures.

    Which UK retailers are covered by this scraper?

    Trolley.co.uk tracks 16 major UK retailers: Tesco, Asda, Sainsbury's, Morrisons, Co-op, ALDI, Waitrose, Ocado, Iceland, Boots, Superdrug, Poundland, Savers, Amazon, Ebay and Pets At Home. It is important to note that product availability and price comparison across all these retailers will vary depending on the specific product. This Actor pulls all publicly visible data from Trolley.co.uk for these stores.

    What kind of historical price data is available?

    When using the byProductIds mode, the Actor can provide up to 52 weeks of historical pricing data for individual products, where available on Trolley.co.uk. This is captured in the priceHistory array within the output records. This feature is particularly useful for tracking long-term price trends and making informed purchasing or market analysis decisions.

    Why are some retailer prices missing in the output?

    Trolley.co.uk sometimes requires a free account login to display a full list of retailer prices beyond the initial few for certain products. This Actor operates by extracting only the data that is publicly visible without any authentication. Therefore, if a price is behind a login wall on Trolley.co.uk, it will not appear in the Actor's output.

    Where to go next

    When you are ready to run it, open Trolley Grocery Price Comparison Scraper on Apify; the free plan covers up to 1,000 results a month.

    Start with the Trolley Grocery Price Comparison Scraper Actor page for the current input schema, pricing tier, and run history.

    If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:

    Other Actors we maintain for related data:

    Related guides:

    Resources

    • Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-25.

    • Actor last updated by its maintainers on 2026-07-05.

    • Run outcome figures cover the 30 day public window ending 2026-09-25.

    • Trolley Grocery Price Comparison Scraper on Apify

    Featured actors

    Trolley Grocery Price Comparison Scraper

    Scrape UK grocery prices from Trolley.co.uk - compare Tesco, Asda, Sainsbury's, Morrisons, Waitrose, Ocado & more. Search, browse categories, get per-retailer price comparisons with weekly history, or list current retailer deals.

    Run on Apify ↗