How do you get IGA Australia prices and specials as JSON when every store prices differently?
Call ReefAPI's iga search action with a store_id or postcode and read products with id, title, brand, price_aud, was_price_aud, special, unit_price and pack_size back as JSON, together with the store the prices belong to. Use specials for everything on special at that store and stores for the directory. The one thing to get right: IGA stores set their own prices, so a price without its store is not a price.
This guide demonstrates the real IGA Australia supermarket: per-store prices, specials, nutrition and store finder API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.
Australian supermarket price comparison, independent-grocer price tracking, specials monitoring and store analytics.
Call the live endpoint
- 1
Choose stores first
Call stores by state or postcode and keep the store_id values you want to compare.
- 2
Always pass a store
Send store_id on every product call, and store the store block with the prices. A price without its store cannot be compared.
- 3
Read specials with their dates
specials lists everything on special at one store. Keep valid_until so expired specials drop out of your data.
- 4
Separate weighted produce
Rows with price_basis average_each are averages; use weight_price for a per-kilo comparison.
- 5
Walk a department with category/products
categories gives the department ids; category/products pages through one at one store.
Copy the request
These snippets use the captured request params for iga/v1/search.
curl -X POST https://api.reefapi.com/iga/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk","limit":12}'import requests
r = requests.post(
"https://api.reefapi.com/iga/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milk",
"limit": 12
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/iga/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milk",
"limit": 12
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.iga.search with {"query":"milk","limit":12}.Captured output from ReefAPI
Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.
{
"method": "POST",
"url": "https://api.reefapi.com/iga/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milk",
"limit": 12
}
}{
"ok": true,
"meta": {
"api": "iga",
"endpoint": "search",
"mode": "live",
"latency_ms": 922.8,
"record_count": 12,
"bytes": 47480,
"cache_hit": false,
"warnings": [
"Unknown parameters ignored: include_pii"
],
"upstream_requests": 1,
"charged_credits": 2,
"version": "1.0.0",
"request_id": "ece723dbd40a4ff1",
"queue_ms": 1.8,
"fetched_at": "2026-10-13T10:56:26.550Z"
},
"data": {
"products": [
{
"id": "726347",
"title": "A2 Milk Full Cream Milk",
"brand": "A2 Milk",
"url": "https://www.igashop.com.au/product/726347",
"store_id": "32600",
"price_aud": 10.5,
"price_display": "$10.50",
"was_price_aud": null,
"currency": "AUD",
"discount_percent": null,
"special": null,
"price_label": null,
"price_source": "regular",
"unit_price": "$3.50/l",
"pack_size": {
"size": 3,
"unit": "l",
"label": "Litre"
},
"sold_by": "Each",
"available": true,
"price_basis": "each",
"category_path": "Grocery/Dairy, Eggs and Fridge/Milk and Cream/Full Cream",
"category_id": "Full_Cream",
"image": "https://cdn.metcash.media/image/upload/w_1500,h_1500,c_pad,b_auto/igashop/images/726347.jpg"
},
{
"id": "882761",
"title": "A2 Full Cream Milk",
"brand": "A2",
"url": "https://www.igashop.com.au/product/882761",
"store_id": "32600",
"price_aud": 7.3,
"price_display": "$7.30",
"was_price_aud": null,
"currency": "AUD",
"discount_percent": null,
"special": null,
"price_label": null,
"price_source": "regular",
"unit_price": "$3.65/l",
"pack_size": {
"size": 2,
"unit": "l",
"label": "Litre"
},
"sold_by": "Each",
"available": true,
"price_basis": "each",
"category_path": "Grocery/Dairy, Eggs and Fridge/Milk and Cream/Full Cream",
"category_id": "Full_Cream",
"image": "https://cdn.metcash.media/image/upload/w_1500,h_1500,c_pad,b_auto/igashop/images/882761.jpg"
},
{
"id": "882575",
"title": "A2 Milk Full Cream",
"brand": "A2",
"url": "https://www.igashop.com.au/product/882575",
"store_id": "32600",
"price_aud": 4.1,
"price_display": "$4.10",
"was_price_aud": null,
"currency": "AUD",
"discount_percent": null,
"special": null,
"price_label": null,
"price_source": "regular",
"unit_price": "$4.10/l",
"pack_size": {
"size": 1,
"unit": "l",
"label": "Litre"
},
"sold_by": "Each",
"available": true,
"price_basis": "each",
"category_path": "Grocery/Dairy, Eggs and Fridge/Milk and Cream/Full Cream",
"category_id": "Full_Cream",
"image": "https://cdn.metcash.media/image/upload/w_1500,h_1500,c_pad,b_auto/igashop/images/882575.jpg"
}
],
"total": 2157,
"skip": 0,
"take": 12,
"page": 1,
"last_page": 180,
"has_more": true,
"facets": {
"Brand": [
{
"value": "Cadbury",
"count": 136
},
{
"value": "Nestlé",
"count": 99
},
{
"value": "Arnott's",
"count": 70
}
],
"Category": [
{
"value": "Chocolate Bars",
"count": 113
},
{
"value": "Chocolate Share Packs",
"count": 103
},
{
"value": "Multipacks",
"count": 90
}
]
},
"store_id": "32600",
"store": {
"store_id": "32600",
"name": "Ashcroft's IGA Erskine Park",
"state": "NSW",
"postcode": "2759",
"chosen_by": "default"
}
}
}Why this is hard manually
One product, many prices. IGA stores are independently owned and set their own shelf prices. Two stores we compared shared 27 milk products and priced 25 of them differently. A scraper that reads the site without fixing a store gets whichever default the site picks, and its numbers cannot be compared with anything.
Some produce prices are averages. Loose fruit and vegetables sold by weight show a price "avg/ea" with a per-kilo price behind it; a strict price parser drops them or, worse, records the average as if it were a fixed pack price.
Specials carry dates in two different formats depending on where you read them, and a special without its dates is a number that silently expires.
Some filters on the site look available and are always empty, and combining two filters the obvious way is rejected. A scraper that trusts the filter panel builds queries that return nothing.
There is no barcode: products carry IGA's own number only, so joining IGA to another retailer means matching on brand, title and size.
Why ReefAPI solves it
Six actions: search, category/products, specials, product/detail, categories and stores. Every product action is tied to one store, chosen by store_id, by postcode, or by the nearest store to a latitude and longitude, and every response carries a store block with the store and chosen_by, the rule that picked it. With no store given, the site's own default store is used and the response says so.
stores is the directory: every IGA store with its address, coordinates, opening hours and which online modes it offers, filterable by state, postcode or distance. It is how you pick stores to compare.
Prices are per store, as published. price_aud and price_display are what that store shows, was_price_aud is the price before a special, and special carries the label, its price and valid_from and valid_until, both as ISO dates whichever format the source used. 14 of 14 sampled products matched their own product page for the same store.
Weighted produce is labelled, not guessed. A price shown as an average each comes back with price_basis average_each and the per-kilo weight_price beside it, so a tracker can keep the two apart.
product/detail adds the label: ingredients, the nutrition panel per serving and per 100 g, servings, the aisle section where the store sets one, age restrictions, and IGA Cash points promotions.
Filters that work are the ones offered: brand and category name from the response's own facets, combined correctly. The always-empty filters are not offered at all. No IGA account or login is involved.
Questions developers ask
Do I need an IGA account?
No. Everything is public and logged-out. You send a ReefAPI key; there is no IGA login.
Why do I get a different price than my local IGA?
Because IGA stores set their own prices. Without a store the site's default store is used. Pass your store's store_id, a postcode or coordinates, and check store.chosen_by in the response.
How do I find a store_id?
Call stores with a state or postcode. Every store comes back with its store_id, address, coordinates and opening hours.
How long does a special last?
Each special carries valid_from and valid_until as ISO dates, taken from the source. The label, such as "30% Off", is kept exactly as IGA shows it.
What does average_each mean?
The product is sold by weight and the shown price is an average for one item. weight_price is the per-kilo price behind it.
Is there a barcode?
No. Products carry IGA's own product number only. barcode_status says so.
Can I compare many stores at once?
Call the same search or specials once per store_id. Each response names its store, so the results line up row by row on the product id.