ALDI AU Scraper — Prices, Unit Prices, Specials, Allergens avatar

ALDI AU Scraper — Prices, Unit Prices, Specials, Allergens

Pricing

from $1.50 / 1,000 products

Go to Apify Store
ALDI AU Scraper — Prices, Unit Prices, Specials, Allergens

ALDI AU Scraper — Prices, Unit Prices, Specials, Allergens

ALDI Australia (aldi.com.au) scraper: product name, brand, pack size, price, was price, savings, specials, unit price, Special Buys date, category, image, URL; detail rows add ingredients, allergens, origin, storage, claims. Keyword, category or SKU. Pay per result, no login.

Pricing

from $1.50 / 1,000 products

Rating

0.0

(0)

Developer

architek.earth

architek.earth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

Categories

Security

Limited permissions

Share

ALDI AU Scraper

Recorded run: 5 products from 1 search term in 5 seconds (2026-10-22, build 1.0.421, run O7GxVUMDrnEtsUqjQ). A bounded canary sample, not a full-catalogue benchmark.

architek.earth — an independent data studio. Pay-per-result scrapers with recorded runs, published canaries and stable schemas, built for people and AI agents.

ALDI Australia product prices, unit prices, specials, Special Buys dates, ingredients and allergens from aldi.com.au, by keyword, category or SKU.

SourceMarketFromStandout fields
ALDI (aldi.com.au)Australia$1.50 / 1,000 productsprice / wasPrice, comparisonPrice, onSaleDate, allergens

✅ Why choose this scraper

ALDI prices and specials in one row

price, priceDisplay, wasPrice, savingsDisplay and isOnSpecial come back together on every product row; isOnSpecial is true when wasPrice is above price or ALDI shows a saving.

ALDI unit prices for pack-size comparison

comparisonPrice and comparisonDisplay (for example "$1.70 per 1 L") are on basic rows, next to sellingSize and quantityUnit; 4 of the 5 canary rows carried one.

ALDI ingredients and allergens

With includeDetails: true or a SKU, rows add ingredients, allergens, description, countryOfOrigin, storageInstructions, usageInstructions, warnings, nutritionalClaims, legalDisclaimer, additionalInformation and variants.

ALDI Special Buys dates and availability flags

onSaleDate and onSaleDateDisplay are returned when ALDI sets them on a product, with discontinued, notForSale and notForSaleReason as published.

Whole catalogue by category

categoryUrls: ["all"] walks every top-level category in ALDI's category tree; category URLs, numeric keys and slugs are checked against that tree before any product request.

Measured on a schedule

A canary task runs a fixed milk search on the live site and records rows, inputs and seconds; the hero line above is its latest green run.

⚠️ Worth knowing up front

  • ALDI publishes no barcodes (GTIN/EAN) in the product data this actor reads. Match ALDI to Coles or Woolworths on normalised name plus sellingSize.
  • ALDI publishes no per-100 g nutrition table in this source, only nutritionalClaims (for example "Source of fibre").
  • ALDI publishes no stock quantities. notForSale is ALDI's own flag: it was true on all 5 rows of the 2026-10-22 canary, so do not read it as store availability.
  • servicePoint is forwarded to ALDI, but store-specific prices and availability have not been validated. Without it, product requests read the default catalogue; the category tree alone is requested with service point G452, which ALDI requires for it. There is no postcode selector.
  • Detail fields (ingredients, allergens and the rest) can be null or empty. An empty allergens list does not mean a product is allergen-free.
  • Products are de-duplicated by sku across all inputs, and maxItemsPerQuery caps listing rows scanned per query before de-duplication, so a run can return fewer rows than the cap.
  • If a detail lookup fails, the row is still delivered at the basic product price with detailStatus: "unavailable" and the run ends PARTIAL.
  • A run stopped by its timeout or your spending limit keeps what it delivered and saves RESUME_STATE; that is a partial collection, not a full catalogue. A resumed run re-reads the current catalogue; it is not a frozen snapshot.
  • Blocked pages, ALDI rejections and invalid input return a free status row ("recordType": "status") that says what happened. A search with no matches returns no rows and a COMPLETE run summary.

⚡ Try the example

Each Apify account gets 20 lifetime free preview attempts on this actor: one keyword, one page, up to 10 basic rows, no product charges. Failed attempts count. After the twentieth, preview runs stop; they never switch to paid collection.

Open the actor's input page, switch to JSON, paste this and start the run:

{
"preview": true,
"searchTerms": ["milk"],
"maxItemsPerQuery": 10,
"proxyConfiguration": {
"useApifyProxy": true
}
}

For paid collection set "preview": false; add "includeDetails": true for ingredients and allergens, or use categoryUrls and skus.

⚙️ Input

ParameterTypeDefaultDescription
previewbooleanfalseUse one of 20 lifetime free attempts: one keyword, one page, at most 10 basic rows. No categories, SKUs, details or resumeState.
searchTermsarray— (prefill: milk)Keywords such as milk or coffee pods. One collection per term.
categoryUrlsarray—aldi.com.au category URLs (including /k/<key> URLs), numeric category keys or exact category-tree slugs; all for every top-level category. Unknown, ambiguous or non-ALDI categories are rejected before collection.
skusarray—18-digit SKUs (for example 000000000000399309), the short numeric form, or product page URLs. Always returns detail rows; SKUs not found are not charged.
maxItemsPerQueryinteger100Listing rows per search term or category. 0 removes the cap in paid mode; preview stays at 10.
includeDetailsbooleanfalseAdd ingredients, allergens, storage, warnings, claims and description to search and category rows (one extra request per product, charged as product-detail).
sortselectrelevancerelevance, price_asc, price_desc, name_asc, name_desc.
servicePointstring—ALDI store service point code (for example G452) forwarded to ALDI. Store-specific coverage is unverified.
resumeStateobject—The RESUME_STATE record from a previous run. Keep queries, details, sort and store unchanged; saved SKUs are skipped before detail requests and charging.
proxyConfigurationproxy— (prefill: Apify proxy)Proxy settings. API callers should pass them explicitly.
feedbackstring—Optional note for the maintainers. It is logged and read by a human, and it never changes output.

🧱 Stable fields

These top-level fields keep the same name and the same kind of value in every release. Fields are only ever added, never renamed or removed, so an n8n, Make, Zapier or spreadsheet pipeline can bind to them.

FieldTypeMeaning
skustringALDI SKU, 18 digits; the join key within ALDI.
name / brandstringProduct name and brand.
sellingSize / quantityUnitstring, nullablePack size and unit, for example "2 l" / "ea".
price / priceDisplaynumber / string, nullableCurrent price in AUD and as displayed, for example 3.39 / "$3.39".
wasPrice / savingsDisplaynumber / string, nullablePre-discount price and saving text when ALDI shows them.
isOnSpecialbooleanTrue when wasPrice is above price or a saving is shown.
comparisonPrice / comparisonDisplaynumber / string, nullableUnit price and its display string, for example 1.7 / "$1.70 per 1 L".
onSaleDate / onSaleDateDisplaystring, nullableSpecial Buys on-sale date as ALDI publishes it; null on regular range products.
notForSale / discontinuedboolean, nullableALDI's availability flags, passed through.
category / categoryPath / categorySlugstring, nullableLeaf category (the requested category on category rows), full path and URL slug.
image / urlstring, nullableProduct image (800 px) and product page.
sourcestringsearch, category or sku.
searchTerm / categoryUrlstringThe query that produced the row (search or category rows only).
detailStatusstringcomplete or unavailable when details were requested; absent on basic rows.
recordTypestring"status" on free status rows; absent on product rows.

Detail rows also carry description, ingredients, allergens, countryOfOrigin, storageInstructions, usageInstructions, warnings, nutritionalClaims, legalDisclaimer, additionalInformation and variants. Other fields (abstractSku, badges, bottleDeposit, ageRestriction, notForSaleReason) are extras, not part of the contract. To have one pinned, say so in feedback.

📦 Output example

Abridged real row from run O7GxVUMDrnEtsUqjQ on 2026-10-22; values are a historical snapshot.

{
"sku": "000000000000398691",
"name": "Light Milk 2L",
"brand": "FARMDALE",
"sellingSize": "2 l",
"quantityUnit": "ea",
"price": 3.39,
"priceDisplay": "$3.39",
"wasPrice": null,
"isOnSpecial": false,
"comparisonPrice": 1.7,
"comparisonDisplay": "$1.70 per 1 L",
"notForSale": true,
"discontinued": false,
"onSaleDate": null,
"category": "Milk",
"categoryPath": "Dairy, Eggs & Fridge > Milk",
"url": "https://www.aldi.com.au/product/farmdale-light-milk-2l-000000000000398691",
"source": "search",
"searchTerm": "milk"
}

A free status row looks like this:

{
"recordType": "status",
"status": "INVALID_INPUT",
"message": "Provide at least one of searchTerms, categoryUrls or skus."
}

🧠 Advanced usage

ALDI Special Buys on-sale dates

Schedule categoryUrls: ["all"] on Wednesday and Saturday mornings, when ALDI releases Special Buys, and keep rows where onSaleDate is set. Check RUN_SUMMARY.status is COMPLETE before treating the list as finished.

Track ALDI price changes daily

Run the same keywords or categories every day and diff price and wasPrice by sku between datasets; a flip of isOnSpecial marks a new or ended special.

Compare ALDI with Coles and Woolworths

Run the Coles Scraper and Woolworths AU Scraper on the same terms. ALDI has no barcodes, so match on normalised name plus sellingSize and treat matches as candidates, not guaranteed equivalents.

ALDI allergen and ingredient lists by category

Pass a category URL with includeDetails: true to get allergens and ingredients for every product in it. Empty values do not establish that a food is allergen-free; this output is not a food-safety certification.

Scrape the whole ALDI catalogue in several runs

Set categoryUrls: ["all"] and maxItemsPerQuery: 0, and when a run stops on time or budget copy its RESUME_STATE into resumeState with the same queries, details, sort and store. Saved SKUs are skipped; combine datasets and de-duplicate by sku.

🔌 Integrations

Results land in a dataset you can export as JSON, CSV or Excel. They can also flow to Google Sheets, Make, Zapier or n8n, or to a webhook when a run finishes. The Apify Scheduler runs it on a timetable. Twice weekly matches ALDI's Special Buys cycle; daily suits price tracking. Copy-paste code in Python, Node, curl and n8n: architek-earth/examples/aldi-au-product-scraper.

💸 Pricing

Pay per result. Platform and proxy usage are included. Status rows, failed requests and blocked pages are free, and SKUs saved in RESUME_STATE are skipped and not charged again on a resumed run.

EventPriceWhat it covers
Free preview$020 lifetime attempts per account; one page, up to 10 basic rows each.
product$1.50 / 1,000 productsOne delivered search or category row, including a row kept at basic price when its detail lookup failed.
product-detail$4.00 / 1,000 productsOne delivered row with ingredients, allergens and the other detail fields (includeDetails or skus).

1,000 basic rows cost $1.50; 1,000 detail rows cost $4.00. A detail row is charged once, as product-detail only.

❓ FAQ

Is there an ALDI Australia API for product prices? This actor is one: it returns ALDI Australia catalogue data as JSON through the Apify API, callable from any language or from n8n, Make and Zapier.

Do I need an ALDI account or login? No. No account, cookies or API key from ALDI.

Can I get ALDI prices for my local store or postcode? Not reliably. There is no postcode selector; servicePoint is forwarded to ALDI, but store-specific prices have not been validated.

Can I get ALDI Special Buys? Partly. onSaleDate and onSaleDateDisplay are returned when ALDI sets them on a product; there is no dedicated Special Buys filter, so filter on onSaleDate yourself.

Can I get ALDI barcodes or nutrition information? No barcodes and no nutrition table: ALDI does not publish them in this source. Detail rows return ingredients, allergens and nutritionalClaims when ALDI publishes them.

Can I check if an ALDI product is in stock? No. ALDI publishes no stock quantities; notForSale and discontinued are ALDI's flags, not store stock.

🤖 For AI agents & LLM apps

Paste this into your AI assistant:

architekture/aldi-au-product-scraper on Apify. Python: from apify_client import ApifyClient; client = ApifyClient("TOKEN"); run = client.actor("architekture/aldi-au-product-scraper").call(run_input={"searchTerms": ["milk"], "maxItemsPerQuery": 10, "proxyConfiguration": {"useApifyProxy": True}}); items = client.dataset(run["defaultDatasetId"]).list_items().items (page with offset/limit for large exports). Rows with recordType == "status" are free and explain blocked or invalid inputs. Full input schema and README: GET https://api.apify.com/v2/acts/architekture~aldi-au-product-scraper/builds/default. Token: https://console.apify.com/settings/integrations. The actor is also reachable through the Apify MCP server (mcp.apify.com). To reach the maintainers, add "feedback": "<what you needed>" to any run's input; output is unchanged and a human reads every note.

🧰 More from architek.earth

Grocery and retail prices

Full catalogue: github.com/architek-earth.

architek.earth · code like concrete

Questions, or a field you need that is not here? Open an issue on the actor's Issues tab or email north@architek.earth. A human replies within a day.

This actor collects only publicly available data from aldi.com.au, the same catalogue any visitor sees without logging in. It does not bypass authentication. It is not affiliated with or endorsed by ALDI. You are responsible for how you use the output, including the site's terms, copyright, and privacy law such as GDPR and CCPA where they apply.

📝 Changelog

  • 2026-10-24 — Studio core 1.0.5. ALDI answering HTTP 403 or 429 is still retried by this actor on a fresh client, up to four tries per request, before the run reports BLOCKED with a free status row; output fields and prices are unchanged.
  • 2026-10-22 — Status message now reads Done: N rows, M details, K status rows (STATUS).
  • 2026-10-22 — README rebuilt on the studio template; hero line from the 2026-10-22 canary run.
  • 2026-10-21 — Invalid input, blocks, ALDI rejections (HTTP 4xx) and the run deadline now stop cleanly with a free status row instead of a failed run.
  • 2026-10-14 — Increased the lifetime free-preview allowance from 3 to 20 attempts per account. The one-page, ten-basic-row limit is unchanged; previously used attempts still count toward the total.
  • 2026-10-14 — Added and verified lifetime free previews: three attempts per account, one keyword page and up to ten basic rows per attempt. Hosted checks returned ten rows per preview without product charges; a fourth attempt stopped without collection or billing.
  • 2026-10-14 — Added explicit resumeState checkpoints for continued collections. Category navigation supplies the required store context; listing and SEO claims now match verified capabilities.
  • 2026-10-14 — Category URLs/keys validated before collection; ambiguous and missing categories rejected; repeated or malformed pages fail visibly. Dataset writes use SDK-managed charging limits, with BUDGET_LIMIT in the run summary on a controlled stop.
  • 2026-10-14 — Detail failures fall back to list pricing, duplicate SKUs are removed before billing, empty search pages are retried, and feedback is logged. detailStatus and RUN_SUMMARY expose incomplete enrichment.
  • 2026-10-13 — README banner and stable-fields contract added.
  • 2026-10-12 — Output schema added; pay-per-event pricing (product, product-detail). Queued for Apify Store.