Clicks APIclicks.co.za ↗
Access Clicks South Africa product listings, pricing, promotions, and category hierarchy via a structured API. Search by keyword or browse by category.
What is the Clicks API?
The Clicks.co.za API provides 4 endpoints for querying products, prices, promotions, and category structure from South Africa's largest pharmacy and health-beauty retailer. Use search_products to run keyword searches across the full catalogue, get_product_details to retrieve SKU-level data including brand, rating, stock status, and colour, or get_category_products and get_categories to navigate the full category hierarchy.
curl -X GET 'https://api.parse.bot/scraper/38a6e625-926b-40aa-a017-3bb436ae30d4/search_products?page=0&query=sunscreen&hits_per_page=20' \ -H 'X-API-Key: $PARSE_API_KEY'
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 clicks-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.
"""Walkthrough: Clicks.co.za SDK — browse categories, search, and drill into product details."""
from parse_apis.clicks_co_za_api import Clicks, Sort, ProductNotFound
client = Clicks()
# Browse top-level categories to discover what's available.
for cat in client.categories.list(limit=5):
print(cat.name, f"({cat.product_count} products)")
# Pick a category and browse its products sorted by price ascending.
skincare = client.category(full_path="Beauty > Skincare")
for item in skincare.products.list(sort=Sort.PRICE_ASC, hits_per_page=5, limit=5):
print(item.product_name, item.price, item.brand)
# Search for a product by keyword, then drill into the first hit's full details.
hit = client.product_summaries.search(query="sunscreen", limit=1).first()
if hit is not None:
try:
detail = hit.details()
print(detail.product_name, detail.price, detail.stock_status)
print("online_only:", detail.online_only, "rating:", detail.rating)
except ProductNotFound:
print("Product no longer available")
# Direct point-lookup using an id discovered from a previous search result.
if hit is not None:
product = client.products.get(product_id=hit.product_id)
print(product.product_name, product.category)
print("exercised: categories.list / category.products.list / product_summaries.search / details / products.get")
Search products by keyword. Returns paginated results with product details including price, availability, promotions, and category. One API call per page; use the page parameter to paginate through results.
| Param | Type | Description |
|---|---|---|
| page | integer | Zero-based page number for pagination. |
| queryrequired | string | Search keyword or phrase (e.g. 'sunscreen', 'shampoo', 'vitamin c'). |
| hits_per_page | integer | Number of products per page (1-100). |
{
"type": "object",
"fields": {
"page": "integer current page number",
"products": "array of product objects with product_id, sku, product_name, brand, price, original_price, promotional_price, promotion, product_url, image_url, in_stock, stock_status, category, description, rating",
"total_hits": "integer total number of matching products",
"total_pages": "integer total number of pages available",
"hits_per_page": "integer number of products per page"
},
"sample": {
"data": {
"page": 0,
"products": [
{
"sku": "00005B3R",
"brand": "SUNprotect",
"price": 129,
"rating": 4.53,
"category": "Beauty > Skincare > Sun Care > Face Sunscreen",
"in_stock": true,
"image_url": "https://www.clicks.co.za/medias/?context=bWFzdGVyfHByb2R1Y3QtaW1hZ2Vz...",
"promotion": null,
"product_id": "290870",
"description": "<p> Clicks Sun Protect SPF 50 Face Cream 50 ml is water resistant...</p>",
"product_url": "https://www.clicks.co.za/sunprotect_spf50-face-cream-50ml/p/290870",
"product_name": "SUNprotect SPF50 Face Cream 50ml",
"stock_status": "lowStock",
"original_price": 129,
"promotional_price": null
}
],
"total_hits": 279,
"total_pages": 93,
"hits_per_page": 3
},
"status": "success"
}
}About the Clicks API
What the API Covers
The Clicks.co.za API exposes product and category data from Clicks, a South African retailer covering pharmacy, health, home, and beauty. Four endpoints cover the main access patterns: keyword search, product detail lookup, category browsing, and category hierarchy discovery. All prices are returned in ZAR.
Search and Browse Endpoints
search_products accepts a required query string and optional page (zero-based) and hits_per_page (1–100) parameters. Each result object in the products array includes product_id, sku, product_name, brand, price, original_price, promotional_price, and promotion, giving you both the current selling price and any active discount details alongside the total hit count across total_hits and total_pages.
get_category_products takes a category path using > as the level separator (e.g. 'Beauty > Skincare > Sun Care'), plus optional page, hits_per_page, and sort parameters. It returns the same product array shape as search results alongside total_hits and total_pages for that category slice.
Product Details and Category Hierarchy
get_product_details accepts a numeric product_id (as returned by the listing endpoints) and returns extended fields not available in list views: rating, in_stock, colour, format, image_url (300×300), new flag, and category path. get_categories can be called without arguments to retrieve top-level categories, or with a parent path to list direct children. Each category object includes name, full_path, product_count, and level, making it straightforward to build or traverse the full tree programmatically.
The Clicks API is a managed, monitored endpoint for clicks.co.za — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when clicks.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 clicks.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 and promotional pricing on Clicks health and beauty products over time using
price,original_price, andpromotional_pricefields. - Build a South African pharmacy product catalogue app by combining
get_categoriestraversal withget_category_productspagination. - Monitor stock availability for specific SKUs using the
in_stockboolean returned byget_product_details. - Aggregate brand-level product counts across categories using
brandfrom search results andproduct_countfrom category nodes. - Power a health and beauty price comparison tool by searching competitor keywords and comparing
priceandpromotional_pricefields. - Enrich an internal product database with
rating,colour,format, andimage_urlby batch-callingget_product_detailswith known product IDs. - Discover category structure depth and product distribution for retail analytics using
get_categorieswith successiveparentpaths.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Clicks have an official developer API?+
What does `get_product_details` return that the listing endpoints don't?+
get_product_details returns fields specific to a single product that are absent from list views: rating (0–5 average), in_stock (boolean), colour, format (e.g. balm, spray), image_url, and a new flag. The listing endpoints return pricing and promotional fields but not these detail-level attributes.How does pagination work across the search and category endpoints?+
search_products and get_category_products use zero-based page numbering via the page parameter. The response includes total_hits and total_pages so you can determine how many calls are needed to retrieve the full result set. Each call covers one page; there is no cursor or offset mechanism.Does the API return customer reviews or review text?+
get_product_details exposes an aggregate rating score (0–5), but individual review content is not covered. You can fork this API on Parse and revise it to add a reviews endpoint if that data is needed.Is store-level stock or click-and-collect availability exposed?+
in_stock boolean from get_product_details reflecting general availability, but per-store or click-and-collect inventory is not covered. You can fork this API on Parse and revise it to add a store-level availability endpoint.