Coles API & Scraper
The Coles API turns coles.com.au, the online store of one of Australia's two largest supermarket chains, into clean JSON in five actions: search, product/detail, deals, category and categories.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Every product comes back with its shelf price, the was-price and saving when Coles shows one, and the special kept as its own fields - half_price, a multi-buy offer such as 2 for $9.40 with the per-item deal price, online-only specials - so a deal is never mistaken for the shelf price. Rows also carry the unit price per kg, litre or 100 g, whether a product is sold by weight (fresh produce prices are an estimate for one item, and the API says so), availability, order limits, brand, size and every category the product is shelved in. product/detail adds the barcode, every image, ingredients, allergen statement, storage and usage instructions, the nutrition panel per serving and per 100 g or ml, country of origin, and the other sizes and varieties of the same product. deals reads Coles's specials: 7,290 products on special on 2026-09-15, 1,181 of them half price. Verification on 2026-09-15: 20 of 20 searches and 44 of 44 product reads succeeded, 42/42 controlled cases passed, 7/7 products matched an independent read of the source on title, price, was-price, availability and barcode, and search rows agreed with product records on 44 of 44 products. Prices are AUD. No Coles account needed - one ReefAPI key and the standard { ok, data, meta, error } envelope.
A Coles special is not always a lower shelf price
Coles marks many products as on special, but the special takes three different shapes, and only one of them changes the shelf price. The API keeps each one in its own field. Measured on 2026-09-15.
| Coles product | price | Special fields | Unit price |
|---|---|---|---|
| Western Star Dairy Butter Pat 250g | 4.70 AUD | original_price 5.90, save_amount 1.20, discount_percent 20 | 1.88 AUD per 100g |
| Coles Water 12x600ml | 5.35 AUD | multi_buy_offer 2 for $9.40 (4.70 each), price unchanged | 0.74 AUD per L (0.65 on the deal) |
| Arnott's Tim Tam Chocolate Biscuits Original 200g | 6.00 AUD | multi_buy_offer Pick any 2 for $8 | 3.00 AUD per 100g |
| Coles Broccoli Medium approx. 340g | 1.67 AUD (estimate, sold_by weight) | promotion_type special, no was-price | 4.90 AUD per kg |
| a2 Milk Full Cream Milk 1L | 4.10 AUD | none | 4.10 AUD per L |
original_price is set only when Coles shows a was-price above the current price. A multi-buy deal leaves price as the single-item price and returns the deal in multi_buy_offer and multi_buy.unit_price. For fresh produce sold by weight, price is Coles's estimate for one item of the stated approximate weight; the unit price per kg is the real shelf price and price_is_estimate is true.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/coles/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milk"
}
}{
"ok": true,
"meta": {
"api": "coles",
"endpoint": "search",
"mode": "live",
"latency_ms": 6591.5,
"record_count": 48,
"bytes": 240547,
"cache_hit": false,
"pagination": {
"page": 1,
"has_more": true,
"page_size": 48,
"total": 146
}
},
"data": {
"results": [
{
"product_id": "8150288",
"title": "Coles Full Cream Milk",
"name": "[redacted-name]",
"brand": {
"id": "3955134709",
"name": "Coles"
},
"size": "3L",
"category": {
"id": "8881801",
"name": "[redacted-name]",
"level": 3
},
"breadcrumb": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
}
],
"category_paths": [
[
"[trimmed-depth]",
"[trimmed-depth]",
"[trimmed-depth]"
]
],
"url": "https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288",
"image": "https://cdn.productimages.coles.com.au/productimages/8/8150288.jpg",
"price": 4.95,
"price_display": "$4.95",
"currency": "AUD",
"original_price": null,
"original_price_display": null,
"discount_percent": null,
"save_amount": null,
"member_price": null,
"member_price_display": null,
"member_discount_percent": null,
"member_program": null,
"unit_price": 1.65,
"unit_price_unit": "1L",
"unit_price_display": "$1.65/ 1L",
"member_unit_price": null,
"sold_by": "piece",
"price_per": "piece",
"price_is_estimate": false,
"promotion_type": null,
"special_type": null,
"price_description": null,
"half_price": false,
"online_only_special": false,
"multi_buy_offer": null,
"multi_buy": null,
"badges": [],
"availability": "in_stock",
"in_stock": true,
"available_quantity": 1504,
"max_order_quantity": 20,
"max_promotional_quantity": 12,
"age_restricted": false,
"rating": null,
"review_count": null,
"rating_scale": null,
"sponsored": false
},
{
"product_id": "439693",
"title": "Coles Full Cream Milk",
"name": "[redacted-name]",
"brand": {
"id": "3955134709",
"name": "Coles"
},
"size": "2L",
"category": {
"id": "8881801",
"name": "[redacted-name]",
"level": 3
},
"breadcrumb": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
}
],
"category_paths": [
[
"[trimmed-depth]",
"[trimmed-depth]",
"[trimmed-depth]"
]
],
"url": "https://www.coles.com.au/product/coles-full-cream-milk-2l-439693",
"image": "https://cdn.productimages.coles.com.au/productimages/4/439693.jpg",
"price": 3.4,
"price_display": "$3.40",
"currency": "AUD",
"original_price": null,
"original_price_display": null,
"discount_percent": null,
"save_amount": null,
"member_price": null,
"member_price_display": null,
"member_discount_percent": null,
"member_program": null,
"unit_price": 1.7,
"unit_price_unit": "1L",
"unit_price_display": "$1.70/ 1L",
"member_unit_price": null,
"sold_by": "piece",
"price_per": "piece",
"price_is_estimate": false,
"promotion_type": null,
"special_type": null,
"price_description": null,
"half_price": false,
"online_only_special": false,
"multi_buy_offer": null,
"multi_buy": null,
"badges": [],
"availability": "in_stock",
"in_stock": true,
"available_quantity": 1520,
"max_order_quantity": 20,
"max_promotional_quantity": 12,
"age_restricted": false,
"rating": null,
"review_count": null,
"rating_scale": null,
"sponsored": false
},
{
"product_id": "7667368",
"title": "Coles Australian Full Cream Long Life Milk",
"name": "[redacted-name]",
"brand": {
"id": "3955134709",
"name": "Coles"
},
"size": "1L",
"category": {
"id": "98660",
"name": "[redacted-name]",
"level": 3
},
"breadcrumb": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
}
],
"category_paths": [
[
"[trimmed-depth]",
"[trimmed-depth]",
"[trimmed-depth]"
],
[
"[trimmed-depth]",
"[trimmed-depth]",
"[trimmed-depth]"
]
],
"url": "https://www.coles.com.au/product/coles-australian-full-cream-long-life-milk-1l-7667368",
"image": "https://cdn.productimages.coles.com.au/productimages/7/7667368.jpg",
"price": 1.75,
"price_display": "$1.75",
"currency": "AUD",
"original_price": null,
"original_price_display": null,
"discount_percent": null,
"save_amount": null,
"member_price": null,
"member_price_display": null,
"member_discount_percent": null,
"member_program": null,
"unit_price": 1.75,
"unit_price_unit": "1L",
"unit_price_display": "$1.75/ 1L",
"member_unit_price": null,
"sold_by": "piece",
"price_per": "piece",
"price_is_estimate": false,
"promotion_type": "everyday",
"special_type": null,
"price_description": null,
"half_price": false,
"online_only_special": false,
"multi_buy_offer": null,
"multi_buy": null,
"badges": [
{
"type": "[trimmed-depth]",
"text": "[trimmed-depth]"
}
],
"availability": "in_stock",
"in_stock": true,
"available_quantity": 3567,
"max_order_quantity": 20,
"max_promotional_quantity": 12,
"age_restricted": false,
"rating": null,
"review_count": null,
"rating_scale": null,
"sponsored": false
}
],
"count": 48,
"total_results": 146,
"page": 1,
"page_size": 48,
"page_count": 4,
"sponsored_dropped": 4,
"sort_applied": "relevance",
"alternate_result": false,
"alternate_results_dropped": 0,
"alternate_results": [],
"did_you_mean": [],
"filters_available": {
"brands": [
{
"id": "2780582535",
"name": "a2 Milk",
"count": 12
},
{
"id": "239341655",
"name": "[redacted-name]",
"count": 7
},
{
"id": "2842560423",
"name": "Bonsoy",
"count": 1
}
],
"allergens": [
{
"id": "10",
"name": "[redacted-name]",
"count": 37
},
{
"id": "9",
"name": "[redacted-name]",
"count": 29
},
{
"id": "1003",
"name": "[redacted-name]",
"count": 21
}
],
"dietary": [
{
"id": "1030",
"name": "GMO Free",
"count": 35
},
{
"id": "1024",
"name": "Source of Calcium",
"count": 31
},
{
"id": "1019",
"name": "Cholesterol free",
"count": 20
}
],
"specials": [
{
"id": "allspecials",
"name": "All specials",
"count": 22
},
{
"id": "multi_buy",
"name": "Multi buy",
"count": 4
},
{
"id": "online_only",
"name": "Online only",
"count": 1
}
]
},
"categories": [
{
"id": "1300",
"name": "Dairy, Eggs & Fridge",
"level": 1,
"slug": "dairy-eggs-fridge",
"count": 142
},
{
"id": "674112512",
"name": "Health & Dietary",
"level": 1,
"slug": "health-dietary",
"count": 48
},
{
"id": "11456",
"name": "Drinks",
"level": 1,
"slug": "drinks",
"count": 72
}
],
"query": "milk"
}
}What the Coles API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search coles.com.au by keyword. Each product comes with its shelf price, the was-price and saving when on special, the half-price / multi-buy / online-only flags, the unit price per kg, litre or 100 g, availability, brand, size and category path. Sort by price or unit price and filter by brand, special type, dietary and free-from facets. Paid placements are removed unless you ask for them. | Pricing teams call search to search coles.com.au by keyword. | query, page, sort, brand_ids, special, ... |
| product/detail | The full Coles product record by `product_id` (or product URL): title, brand, size, barcode (GTIN), every image, shelf price, was-price and saving, special and multi-buy details, unit price, availability and order limits, the label (ingredients, allergens, storage and usage instructions), the nutrition panel per serving and per 100 g/ml, country of origin, and the other sizes and varieties of the same product. | Marketplace operators call product/detail to get the full Coles product record by `product_id` (or product URL). | product_id, max_rotations |
| deals | Coles's specials: every product on special, or only half-price, multi-buy or online-only specials, optionally within one category. Same rows, sorting and brand filter as search. | Catalog enrichment teams call deals to get coles's specials. | type, category, page, sort, brand_ids, ... |
| category | Every product in one Coles category (one to three levels deep), paged, with the same rows, sorting and filters as search. Category slugs come from `categories`. | Retail analysts call category to get every product in one Coles category (one to three levels deep), paged, with the same rows, so…. | category, page, sort, brand_ids, special, ... |
| categories | Coles's full online category tree — every department, category and aisle with its id, slug path, URL and product count. | Pricing teams call categories to get coles's full online category tree. | max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/coles/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk"}'import requests
r = requests.post(
"https://api.reefapi.com/coles/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milk"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/coles/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milk"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.coles.search with {"query":"milk"}.Who uses this API and why
- Australian grocery price trackers record shelf price, was-price and multi-buy deals separately, so a 2 for $9.40 special never overwrites the single-item price.
- FMCG brands monitor half-price and multi-buy specials across Coles categories with deals and category.
- Retail analysts compare unit prices per kg, litre and 100 g on a like-for-like basis, with weighed produce clearly marked as estimated.
- Nutrition and allergen apps pull barcodes, ingredients, allergen statements and per-100 g nutrition panels with product/detail.
Questions developers ask before integrating
Does Coles have a member or Flybuys price like other supermarkets' loyalty prices?
Not in anything Coles publishes to a visitor. Flybuys offers are personalised to a signed-in account, so member_price, member_program and member_unit_price are always null in this API. They are kept in the response so the fields line up with other grocery APIs, such as Migros, where a loyalty price does exist.
How do I tell half-price, multi-buy and was-price specials apart?
Each has its own field. half_price is true for Coles's 1/2 Price specials; multi_buy_offer holds text such as 2 for $9.40 and multi_buy.unit_price the per-item deal price, while price stays the single price; original_price holds the was-price when Coles shows one. On 2026-09-15 the half-price filter on chocolate returned 68 products, every row on the page half price, and the multi-buy filter 123, every row carrying an offer.
Why is the price of fresh produce an estimate?
Because Coles sells it by weight. Coles Broccoli Medium is listed at 1.67 AUD for one head of about 340 g, charged at 4.90 AUD per kg. sold_by reads weight and price_is_estimate is true; the unit price per kg is the price you can compare.
Do sorting and filters really apply?
Yes, and the API only offers the ones Coles applies. Measured for milk on 2026-09-15: 146 results unfiltered, 21 with two brand ids, 18 with the vegan facet, 29 with the gluten-free facet. Price and unit-price sorts came back in order, and sort_applied is Coles's own confirmation. Coles silently ignores sort orders it does not know, which is why only price_asc, price_desc and unit_price_asc are offered.
What are sponsored products and why are they removed?
Coles places paid products near the top of the first page - 4 on a milk search - and they repeat products that also appear further down the list. They are removed by default and counted in sponsored_dropped; include_sponsored=true keeps them, flagged sponsored: true.
What happens when a search matches nothing?
You get an empty result: results is empty, total_results is 0 and alternate_result is true. Coles itself fills that page with unrelated products - 11 vitamin products for zzqqxxnonexist and 15 glue sticks for blorptangzik on 2026-09-15 - so the API drops them and only counts them in alternate_results_dropped. Set include_alternate_results=true if you want to see them; they still never appear in results. Genuine queries such as milk, chocolat and tim tam were not affected.
Why does a product in a Dairy category show a Drinks breadcrumb?
Because Coles shelves some products in several categories. Lo Bros Kombucha is listed under Drinks and under three Dairy, Eggs & Fridge aisles. breadcrumb is Coles's first listing; category_paths lists every category the product is in, so filtering a category page by category_paths always agrees with the page.
What does Coles NOT publish?
No member or Flybuys price, and no ratings or reviews in its own product data, so rating, review_count and rating_scale are null. Barcodes are missing on fresh produce sold by weight, and nutrition panels on non-food products: on 44 sampled products, barcode was filled on 40 of 44 and nutrition on 25 of 44. Prices are those of Coles's default online store for a visitor with no delivery suburb, named in store.store_id; prices for a chosen store are not offered.
What is the Coles API?
Coles API is a ReefAPI endpoint group for australian supermarket prices: specials, was-prices, unit prices and full nutrition labels. It returns live JSON through POST requests under /coles/v1.
Is the Coles API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Coles calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Coles login or account?
No login to Coles is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Coles data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Coles API use?
Coles actions currently cost 2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Coles from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call coles actions with the same key, credit pool and JSON envelope used by normal REST requests.