REMA 1000 Denmark Scraper — Groceries & EAN avatar

REMA 1000 Denmark Scraper — Groceries & EAN

Pricing

from $2.00 / 1,000 result scrapeds

Go to Apify Store
REMA 1000 Denmark Scraper — Groceries & EAN

REMA 1000 Denmark Scraper — Groceries & EAN

Scrape the REMA 1000 Denmark discount-grocery chain by keyword: product names, prices in DKK, unit prices, categories, images and EAN barcodes. No login or cookies.

Pricing

from $2.00 / 1,000 result scrapeds

Rating

0.0

(0)

Developer

Studio Amba

Studio Amba

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

16 days ago

Last modified

Categories

Share

REMA 1000 Denmark Scraper

Scrape REMA 1000 (rema1000.dk), Denmark's largest discount-grocery chain, by keyword and get clean, structured product data: names, prices in DKK, unit prices, categories, images and EAN barcodes.

REMA 1000 runs its own public product-search API. This actor calls it directly, so you get fast, reliable grocery data without a login, cookies or a browser — and every result already carries its EAN barcode, no extra product-page fetch required.

Why use this actor?

If you track Danish grocery prices, match products by barcode, build a price-comparison tool, or feed a market-research dataset, you need structured product data you can rely on. This actor turns any REMA 1000 search into a table of products with current prices in DKK, unit prices and EAN barcodes.

Typical users:

  • Price-intelligence and price-comparison platforms tracking Danish retail.
  • Brands and suppliers matching their catalogue by EAN barcode.
  • Market researchers and analysts building Nordic grocery datasets.
  • Developers who need a clean product feed instead of scraping HTML themselves.

How to scrape REMA 1000 data

  1. Open the actor in the Apify Console.
  2. Enter a search query in Danish — for example mælk, kylling, øl or brød. Leave it empty to browse the full catalogue.
  3. Set maxResults to how many products you want.
  4. Leave the proxy on the default Apify setting and click Start.
  5. When the run finishes, download the results as JSON, CSV, Excel or feed them to an API.

The actor calls REMA 1000's own search API directly, walks the pagination for your query at 200 products per request, and writes one clean record per product — including the EAN barcode, which comes back in the same response as the price, so there's no separate detail-page fetch.

Input

FieldTypeRequiredDescription
searchQueryStringNoKeyword to search in Danish (default: mælk)
maxResultsIntegerNoMaximum products to return (default: 100)
proxyConfigurationObjectNoApify proxy settings (default Apify proxy works)

Example input

{
"searchQuery": "mælk",
"maxResults": 20,
"proxyConfiguration": { "useApifyProxy": true }
}

Output

Each result contains:

FieldTypeExample
nameString"Sødmælk 3,5%"
brandString"Arla"
priceNumber7.95
currencyString"DKK"
pricePerUnitString"15.9 kr/ltr"
sizeString"0.5 LTR. / ARLA"
discountString"campaign"
campaignEndsAtString"2026-07-18T00:00:00+00:00"
eanString"5700426101026"
skuString"20302"
productIdString"20302"
categoryString"Mejeri > Mælk m.v."
imageUrlStringPrimary product image URL
urlStringFull product page URL
scrapedAtStringISO 8601 timestamp
retailerString"REMA 1000"
gtinString"5700426101026" (same value as ean — EAN-13 is the GTIN-13 standard)
normalPriceNumber or null7.95 — regular shelf price, equals price when not on campaign
campaignPriceNumber or null5.95 — current weekly-offer price, null when not on campaign
priceValidFromString"2026-09-06T00:00:00+00:00" — start of the current price's validity window
priceValidToString"2026-09-12T00:00:00+00:00" — end of the current price's validity window (far-future date when there's no scheduled end)
unitPriceNumber or null15.9 — numeric counterpart of pricePerUnit
unitOfMeasureString or null"ltr"
packageQuantityNumber or null0.5 — best-effort, parsed from size
packageUnitString or null"LTR" — best-effort, parsed from size
inStocknullAlways null — see limitations below

discount and campaignEndsAt are present only when a product is on a running weekly offer ("kampagne"); normalPrice/campaignPrice/priceValidFrom/priceValidTo give the same information in a structured, always-present form so you don't have to branch on discount. brand is a best-effort read of REMA 1000's free-text size/description field and is not always available — some products only carry an origin tag (e.g. "DANSK") instead of a brand name, in which case brand is omitted.

Example output

{
"name": "Sødmælk 3,5%",
"brand": "Arla",
"price": 7.95,
"currency": "DKK",
"pricePerUnit": "15.9 kr/ltr",
"size": "0.5 LTR. / ARLA",
"ean": "5700426101026",
"sku": "20302",
"productId": "20302",
"category": "Mejeri > Mælk m.v.",
"imageUrl": "https://rema-product-images.digital.rema1000.dk/20302/1-large-kAonyAjPx8.webp",
"url": "https://shop.rema1000.dk/varer/20302",
"scrapedAt": "2026-09-09T14:43:42.939Z",
"retailer": "REMA 1000",
"gtin": "5700426101026",
"normalPrice": 7.95,
"campaignPrice": null,
"priceValidFrom": "2026-01-29T00:00:00+00:00",
"priceValidTo": "2099-12-31T00:00:00+00:00",
"unitPrice": 15.9,
"unitOfMeasure": "ltr",
"packageQuantity": 0.5,
"packageUnit": "LTR",
"inStock": null
}

Notes and limitations

  • Prices are the current online prices in DKK, matched to today's date against REMA 1000's own price-validity windows (so you always get the price that's actually active, campaign or not). normalPrice and campaignPrice split this into the everyday shelf price and the running promo price, so a price-comparison feed doesn't have to infer it.
  • The shop.rema1000.dk website itself is geo-blocked outside Denmark, but the underlying product API this actor calls is not — no residential proxy needed.
  • REMA 1000's full catalogue is around 3,900 SKUs. A broad or empty search query walks the whole catalogue at 200 products per request.
  • brand is best-effort only — REMA 1000's API does not expose a clean, dedicated brand field.
  • packageQuantity/packageUnit are also best-effort, parsed from the same free-text field as brand — present when the field starts with a recognizable "
  • Some products carry more than one barcode (multi-pack variants); this actor returns the first one as ean (and the identical value as gtin).
  • inStock is always null. REMA 1000's public search API is a catalogue/pricing feed — it does not expose live per-store inventory or stock levels, so this actor never guesses a stock status.

Cost

Pricing is pay-per-result. Because the actor calls a JSON API directly (no browser, no per-product detail fetch), a run of a few hundred products typically finishes in well under a minute.

Build a complete view of European grocery retail with these sibling scrapers from Studio AMBA: