Checkers API & Scraper
Checkers is one of South Africa's largest grocery chains and its Sixty60 shop prices every product for the store that delivers to your address: on the same day a 6 x 1 L full cream milk was R97.99 for Cape Town, R99.99 for Durban and R104.99 for Pretoria, and a search for "milk" returned 105, 135 and 134 products.
🤖 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 call therefore reads one delivery address, given as latitude and longitude (without one the shop's own default store is used and the answer says so). `search` returns products for a search term, a category or a barcode with the shelf price, was-price and saving, the Xtra Savings card price kept apart from the price, Xtra Savings multi-buys, price per kg and weight range for meat and produce sold by weight, stock on hand, brand, barcodes and categories. `promotions` lists only the products on a deal, `product` returns one product with every offer and its dates plus the description and the attributes the site prints (ingredients, nutrition), `categories` returns the 33 departments with their ids, and `stores` lists physical Checkers, Checkers Hyper, Shoprite, LiquorShop and other group stores near a point with address and opening hours. The sister shop shoprite.co.za is available with site=shoprite.
What a Checkers field actually contains
Fields that read differently from how they look. Every row was measured against live responses on 2026-10-15.
| Field | What it holds |
|---|---|
| store_id, store_defaulted | The store the prices and stock belong to. With an address it is the store that delivers there (a 60-minute store and a next-day store can both appear, so each row also carries its own store_id). store_defaulted is true when you did not pass an address. |
| price | The shelf price anyone pays, in rand. For goods sold by weight (unit KG) it is the price per kg and price_unit is "kg"; weight_range_g gives the pack weight range, for example 1,100 g to 1,300 g. |
| member_price | The Xtra Savings card price, never the shelf price: Clover Fresh Full Cream Milk 2 L showed price 37.99 and member_price 29.99. member_price_basis says whether the shop states it ("Now R29.99") or it is worked out from a "Save R5" or "Save 25%" offer. null when there is no card price. |
| multi_buy | An Xtra Savings bulk deal apart from the single price, for example "Buy 3 For R225" on beer: quantity 3, price 225.00, card_required true. |
| promotions | Every offer on the product with its text, type (fixed price, amount off, percent off, other), value, who it is for and its start and end time. |
| original_price, savings | The was-price and the saving, only when the shop's previous price is above today's price (4 of 528 search rows). null otherwise; on_promotion still tells you when the shop flags the product as on promotion. |
| stock_on_hand, in_stock | The stock count the delivering store reports and whether the product can be ordered (528 of 528 rows carried both). |
| product_id | Article number plus unit, exactly as the product page address ends: 10156094EA is a 1 L carton, 10156094PK1 the 6 x 1 L pack of the same article. |
| categories | The department path of the product ("Milk, Dairy & Eggs" > "Milk & Cream" > "Milk"); ids come from the categories call. |
Checkers does not publish a price per 100 g or 100 ml on its online shop, so none is returned; goods sold by weight carry their price per kg. Search results carry no review counts.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/checkers/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milk",
"latitude": -33.9249,
"longitude": 18.4241
}
}{
"ok": true,
"meta": {
"api": "checkers",
"endpoint": "search",
"mode": "live",
"latency_ms": 2512.6,
"record_count": 24,
"bytes": 263036,
"cache_hit": false,
"total": 105,
"store_defaulted": false,
"upstream_requests": 2,
"charged_credits": 3,
"version": "0.1.0",
"request_id": "c7e7b58cc13642c6",
"queue_ms": 1.7,
"fetched_at": "2026-10-15T17:02:53.715Z"
},
"data": {
"site": "checkers",
"query": "milk",
"category_id": null,
"category_path": null,
"barcode": null,
"store_id": "62dabd7f832d656087c747d8",
"store_defaulted": false,
"location": {
"latitude": -33.9249,
"longitude": 18.4241
},
"delivery_stores": [
{
"store_id": "62dabd7f832d656087c747d8",
"service_options": [
"sixty-min-delivery"
],
"distance_km": 0.69
},
{
"store_id": "62dabedd2aa38c342af94d53",
"service_options": [
"sixty-min-delivery"
],
"distance_km": 0.69
},
{
"store_id": "5ece6935faafe599532665b2",
"service_options": [
"one-day-delivery"
],
"distance_km": 8.24
}
],
"brand": null,
"on_promotion": null,
"sort": "relevance",
"total": 105,
"page": 1,
"page_size": 24,
"returned": 24,
"products": [
{
"rank": 1,
"product_id": "10156094PK1",
"article_number": "10156094",
"unit_of_measure": "PK1",
"title": "Checkers Housebrand Full Cream Milk 6 x 1L",
"brand": "Checkers Housebrand",
"price": 97.99,
"price_unit": "each",
"currency": "ZAR",
"original_price": null,
"savings": null,
"on_promotion": true,
"member_price": null,
"member_price_program": null,
"member_price_basis": null,
"member_price_text": null,
"member_price_ends": null,
"multi_buy": null,
"promotions": [],
"sold_by": "unit",
"weight_range_g": null,
"in_stock": true,
"stock_on_hand": 3255,
"max_per_order": 3,
"barcodes": [
"6001001271059"
],
"categories": [
"Food Cupboard",
"Long Life Milk & Dairy Alternatives",
"Long Life UHT Dairy"
],
"rating": null,
"review_count": 0,
"sponsored": false,
"requires_over_18": false,
"store_id": "62dabd7f832d656087c747d8",
"service_option": "sixty-min-delivery",
"image": "https://catalog.sixty60.co.za/files/6a59726e0ce01d73a4540582",
"url": "https://www.checkers.co.za/product/checkers-housebrand-full-cream-milk-6-x-1l-10156094PK1"
},
{
"rank": 2,
"product_id": "10124887EA",
"article_number": "10124887",
"unit_of_measure": "EA",
"title": "Darling Fresh Full Cream Milk Bottle 2L",
"brand": "Darling",
"price": 32.99,
"price_unit": "each",
"currency": "ZAR",
"original_price": null,
"savings": null,
"on_promotion": false,
"member_price": null,
"member_price_program": null,
"member_price_basis": null,
"member_price_text": null,
"member_price_ends": null,
"multi_buy": null,
"promotions": [],
"sold_by": "unit",
"weight_range_g": null,
"in_stock": true,
"stock_on_hand": 174,
"max_per_order": 10,
"barcodes": [
"6005277000023"
],
"categories": [
"Milk, Dairy & Eggs",
"Milk & Cream",
"Milk"
],
"rating": null,
"review_count": 0,
"sponsored": false,
"requires_over_18": false,
"store_id": "62dabd7f832d656087c747d8",
"service_option": "sixty-min-delivery",
"image": "https://catalog.sixty60.co.za/files/6a5972bc1b43ff82245762e5",
"url": "https://www.checkers.co.za/product/darling-fresh-full-cream-milk-bottle-2l-10124887EA"
},
{
"rank": 3,
"product_id": "10413121EA",
"article_number": "10413121",
"unit_of_measure": "EA",
"title": "Clover Fresh Full Cream Milk 2L",
"brand": "Clover",
"price": 37.99,
"price_unit": "each",
"currency": "ZAR",
"original_price": null,
"savings": null,
"on_promotion": false,
"member_price": null,
"member_price_program": null,
"member_price_basis": null,
"member_price_text": null,
"member_price_ends": null,
"multi_buy": null,
"promotions": [],
"sold_by": "unit",
"weight_range_g": null,
"in_stock": true,
"stock_on_hand": 28,
"max_per_order": 10,
"barcodes": [
"6001299016158"
],
"categories": [
"Milk, Dairy & Eggs",
"Milk & Cream",
"Milk"
],
"rating": null,
"review_count": 0,
"sponsored": true,
"requires_over_18": false,
"store_id": "62dabd7f832d656087c747d8",
"service_option": "sixty-min-delivery",
"image": "https://catalog.sixty60.co.za/files/6ace21260e8c9f6d0bb1efff",
"url": "https://www.checkers.co.za/product/clover-fresh-full-cream-milk-2l-10413121EA"
}
]
}
}What the Checkers API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search the Checkers Sixty60 (or Shoprite) shop for one delivery address: shelf price, was-price, Xtra Savings card price (kept apart from the price), Xtra Savings multi-buy, price per kg for goods sold by weight, stock on hand, brand and barcode per product. `query` or `category_id` is required (either one); `barcode` finds one product by its EAN. | Pricing teams call search to search the Checkers Sixty60 (or Shoprite) shop for one delivery address. | query, category_id, barcode, latitude, longitude, ... |
| promotions | Only the products on a deal for one delivery address — sale prices and Xtra Savings offers (card price, multi-buys) — inside a search term or a category (one of the two is required). | Marketplace operators call promotions to get only the products on a deal for one delivery address. | query, category_id, latitude, longitude, site, ... |
| product | One product for one delivery address by the `product_id` a search row returns (article number + unit, e.g. 10387741EA) or a product URL: price, was-price, Xtra Savings price and every offer with dates, price per kg and weight range, stock on hand, barcodes, brand, manufacturer, description, attributes (ingredients, nutrition, usage as the site prints them), categories, images. | Catalog enrichment teams call product to get one product for one delivery address by the `product_id` a search row. | product_id, latitude, longitude, site |
| categories | The shop's category tree (33 departments, 3 levels) with the ids `search` takes as category_id; or one department's subtree. | Retail analysts call categories to get the shop's category tree (33 departments, 3 levels) with the ids `search` takes as category_i…. | category_id, site |
| stores | Physical stores of the Shoprite group near a point (Checkers, Checkers Hyper, Checkers FX, Shoprite, LiquorShop, MediRite, Petshop Science …): name, brand, address, coordinates, distance, opening hours per day. | Pricing teams call stores to get physical stores of the Shoprite group near a point (Checkers, Checkers Hyper, Checkers FX, Sh…. | latitude, longitude, radius_km, limit, brand, ... |
Call search from your stack
curl -X POST https://api.reefapi.com/checkers/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk","latitude":-33.9249,"longitude":18.4241}'import requests
r = requests.post(
"https://api.reefapi.com/checkers/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milk",
"latitude": -33.9249,
"longitude": 18.4241
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/checkers/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milk",
"latitude": -33.9249,
"longitude": 18.4241
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.checkers.search with {"query":"milk","latitude":-33.9249,"longitude":18.4241}.Who uses this API and why
- Compare Checkers grocery prices between South African cities and suburbs.
- Track Xtra Savings prices and multi-buys on the products you watch.
- Check stock on hand at the store that delivers to an address before sending a shopper.
- Build a South African grocery product database with barcodes, brands and categories.
- Find Checkers, Shoprite and LiquorShop stores near a point with their opening hours.
Questions developers ask before integrating
Do I need a Checkers or Xtra Savings account?
No. Everything is read logged out: the prices, Xtra Savings prices, deals and stock any visitor sees for a delivery address. Personal Xtra Savings offers that need a login are not included.
Is the Xtra Savings price the price I get?
Only with the card. price is what anyone pays; member_price is the Xtra Savings card price. On 2026-10-15, 50 of 528 search rows carried a card price and 14 an Xtra Savings multi-buy.
Why does the price depend on the address?
Because the shop prices, stocks and ranges products per delivering store: the same 6 x 1 L milk was R97.99, R99.99 and R104.99 for Cape Town, Durban and Pretoria on the same day. Pass latitude and longitude; without them the shop's default store is used and the answer says so.
What about Shoprite?
shoprite.co.za runs on the same platform: pass site=shoprite. Its catalogue answers from the Shoprite shop's own default store ("milk": 85 products). For delivery addresses the source says Checkers Sixty60 serves them (5 of 5 cities measured), so an address with site=shoprite returns a clear not-found answer telling you to use site=checkers.
Which filters and sorts work?
Sort by relevance, price or name; filter by brand, top-level department and deals only. Each was checked against the unfiltered count for "milk" in Cape Town (105): Clover 29, Milk, Dairy & Eggs 23, deals only 14; "cheese" 194, deals only 14. Brand names match exactly as a row's brand field spells them.
Can I look a product up by barcode?
Yes: search with barcode returns the product carrying that EAN, for example 6001299016158 for Clover Fresh Full Cream Milk 2 L.
How many products per page?
24 by default, up to 48. Three pages in a row returned 72 different products. Past the last page the answer is an empty page with a note.
How fresh is the data?
Every call reads the shop live; nothing is cached. Offers carry their own start and end times.
What is the Checkers API?
Checkers API is a ReefAPI endpoint group for south african grocery prices from checkers sixty60 and shoprite: price in rand, xtra savings price, multi-buys, stock on hand and product facts per delivery address. It returns live JSON through POST requests under /checkers/v1.
Is the Checkers API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Checkers calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Checkers login or account?
No login to Checkers 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 Checkers 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 Checkers API use?
Checkers actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Checkers from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call checkers actions with the same key, credit pool and JSON envelope used by normal REST requests.