Makro APImakro.co.za ↗
Search Makro South Africa's product catalog via API. Get product names, prices, images, brand, and ratings for up to 24 results per page.
What is the Makro API?
The Makro South Africa API exposes one endpoint — search_products — that queries the makro.co.za catalog and returns up to 8 structured fields per product, including name, price, image URL, brand, and rating. A single POST request with a search term like "laptop" or "tv" yields paginated results with a total result count and a flag indicating whether additional pages exist.
curl -X POST 'https://api.parse.bot/scraper/1cdaa9e6-11b8-4b19-8960-115fcba2c0d4/search_products' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{}'Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace makro-co-za-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Makro South Africa Product Search API Client
Search for products on Makro South Africa and retrieve detailed product information.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Dict, Any
class ParseClient:
"""Client for interacting with the Parse API for Makro South Africa product search."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "1cdaa9e6-11b8-4b19-8960-115fcba2c0d4"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError(
"API key not provided. Set PARSE_API_KEY environment variable or pass api_key parameter."
)
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""
Make a request to the Parse API.
Args:
endpoint: The endpoint name (e.g., 'search_products')
method: HTTP method ('GET' or 'POST')
**params: Query parameters or JSON payload
Returns:
Response data as a dictionary
Raises:
requests.exceptions.RequestException: If the request fails
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
elif method.upper() == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def search_products(
self, query: str, page: int = 1
) -> Dict[str, Any]:
"""
Search for products on Makro South Africa.
Args:
query: Search query text (e.g., 'laptop', 'tv', 'headphones')
page: Page number for pagination (default: 1)
Returns:
Dictionary containing search results with product listings
"""
return self._call(
"search_products",
method="POST",
query=query,
page=page,
)
def format_currency(amount: float) -> str:
"""Format amount as South African Rand."""
return f"R {amount:,.2f}"
def print_product_info(product: Dict[str, Any]) -> None:
"""Print formatted product information."""
print(f" 📦 {product['name']}")
print(f" Brand: {product['brand']}")
print(f" Price: {format_currency(product['price'])}")
if product.get("rating"):
print(f" Rating: ⭐ {product['rating']} ({product['rating_count']} reviews)")
print(f" Details: {product['subtitle']}")
print()
if __name__ == "__main__":
# Initialize the client
client = ParseClient()
# Practical workflow: Search for products and browse through results
search_query = "laptop"
print(f"🔍 Searching Makro South Africa for '{search_query}'...\n")
try:
# First page of results
results = client.search_products(query=search_query, page=1)
# Extract response data
total_results = results["data"]["total_results"]
has_more_pages = results["data"]["has_more_pages"]
products = results["data"]["products"]
print(f"✅ Found {total_results} products\n")
print(f"📄 Page 1 - Showing {len(products)} products:\n")
# Display first page products
for idx, product in enumerate(products, 1):
print(f"{idx}. ", end="")
print_product_info(product)
# If there are more pages, show pagination capability
if has_more_pages:
print(f"📚 More pages available. Fetching page 2...\n")
# Fetch second page
page_2_results = client.search_products(query=search_query, page=2)
page_2_products = page_2_results["data"]["products"]
print(f"📄 Page 2 - Showing {len(page_2_products)} products:\n")
for idx, product in enumerate(page_2_products, 1):
print(f"{idx}. ", end="")
print_product_info(product)
# Find the cheapest and most expensive products from page 1
if products:
cheapest = min(products, key=lambda x: x["price"])
most_expensive = max(products, key=lambda x: x["price"])
avg_price = sum(p["price"] for p in products) / len(products)
print("💡 Price Analysis (Page 1):")
print(f" Cheapest: {cheapest['name'][:50]}... at {format_currency(cheapest['price'])}")
print(
f" Most Expensive: {most_expensive['name'][:50]}... at {format_currency(most_expensive['price'])}"
)
print(f" Average Price: {format_currency(avg_price)}")
except requests.exceptions.RequestException as e:
print(f"❌ Error: Failed to fetch products - {e}")
except KeyError as e:
print(f"❌ Error: Unexpected response format - {e}")
except ValueError as e:
print(f"❌ Configuration error: {e}")Search for products by name on Makro South Africa. Returns paginated results with product name, price, image URL, brand, rating, and other details. Each page returns up to 24 products.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. Must be a positive integer. |
| queryrequired | string | Search query text for finding products (e.g. 'laptop', 'tv', 'headphones'). |
{
"type": "object",
"fields": {
"page": "integer",
"query": "string",
"products": "array of product objects with product_id, name, subtitle, price, image_url, brand, rating, rating_count",
"total_results": "integer",
"has_more_pages": "boolean"
},
"sample": {
"data": {
"page": 1,
"query": "laptop",
"products": [
{
"name": "Lenovo IdeaPad Slim 3 Intel Core i3 N305 - (8 GB/256 GB SSD/Windows 11 Home) IdeaPad Slim3 15IAN8 Thin and Light Laptop",
"brand": "Lenovo",
"price": 7999,
"rating": 5,
"subtitle": "15.6 inch, Grey, 1.55 kg",
"image_url": "https://www.makro.co.za/asset/rukmini/fccp/312/312/ng-fkpublic-ui-user-fbbe/laptop/f/r/z/-original-imahbacrsh2b6vgh.jpeg?q=70",
"product_id": "LTPHBACYDNYBYGST",
"rating_count": 2
}
],
"total_results": 736,
"has_more_pages": true
},
"status": "success"
}
}About the Makro API
What the API Returns
The search_products endpoint accepts a query string and an optional page integer, then returns a list of product objects from the makro.co.za catalog. Each product object contains product_id, name, subtitle, price, image_url, brand, rating, and rating_count. The top-level response also includes total_results and has_more_pages, making it straightforward to iterate through all matching pages programmatically.
Pagination
Each call returns at most 24 products. Use the page parameter (positive integer) to walk through deeper result sets. The has_more_pages boolean tells you whether another page exists without requiring you to compare counts manually. total_results reports the full match count across all pages, so you can calculate how many requests a full crawl requires before starting.
Coverage Scope
The API covers the South African Makro catalog at makro.co.za, which includes grocery, electronics, appliances, furniture, and general merchandise categories. Product pricing is returned in South African Rand as displayed on the site. Rating data (rating and rating_count) is included where available for a given product; some products may carry empty values for these fields if no reviews exist.
The Makro API is a managed, monitored endpoint for makro.co.za — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when makro.co.za changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official makro.co.za API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track price changes for specific products across the Makro catalog over time using
pricefield snapshots. - Build a price comparison tool that queries multiple retailers and surfaces makro.co.za
pricealongside competitors. - Populate an affiliate product feed with Makro
name,image_url,brand, andpricefields. - Filter high-rated Makro products by category using
ratingandrating_countto surface well-reviewed items. - Monitor stock breadth for a product category (e.g. 'headphones') using
total_resultsacross search queries. - Seed a product database for a South African e-commerce analytics tool using
product_idas a stable identifier. - Automate competitive intelligence reports by querying brand-specific terms and aggregating
pricedistributions.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Makro South Africa offer an official developer API?+
What does the search_products endpoint return for each product?+
product_id, name, subtitle, price, image_url, brand, rating, and rating_count. The response also returns total_results, page, query, and has_more_pages at the top level so you can manage pagination without extra requests.Does the API return product availability or stock status?+
Can I retrieve product details for a specific product ID rather than searching by keyword?+
query string. It returns product_id values in responses, but there is no separate endpoint for direct product lookup by ID. You can fork this API on Parse and revise it to add a product detail endpoint using the returned IDs.