Discover/Curtfire API
live

Curtfire APIcurtfire.co.za ↗

Access Curtfire South African marketplace data: keyword search, category tree, product listings, and full product details including variants and ZAR pricing.

Endpoint health
verified 3h ago
list_categories
search_products
list_category_products
get_product
4/4 passing latest checkself-healing
Endpoints
4
Updated
3h ago

What is the Curtfire API?

The Curtfire API exposes 4 endpoints covering the full curtfire.co.za South African online marketplace catalogue. Use search_products to run keyword searches with sorting and pagination, retrieve the complete category tree via list_categories, browse products by category through list_category_products, and pull full product detail records — including variant option groups, ZAR pricing, stock status, and gallery images — with get_product.

This call costs1 credit / call— charged only on success
Try it
1-based page number.
Result ordering, mirroring the site's sort menu.
Free-text search term matched against product names and descriptions. Empty = list all products.
Products per page; values above 100 are clamped to 100.
Restrict to products sold by this marketplace vendor (vendor_id from product cards). Omitted = all vendors.
→ api.parse.bot/scraper/015c1303-2759-44f7-bbbe-4696149ae357/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/015c1303-2759-44f7-bbbe-4696149ae357/search_products?keyword=watch' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

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 curtfire-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: Curtfire marketplace SDK — browse categories, search products, drill into details."""
from parse_apis.curtfire_co_za_api import Curtfire, ProductSort, ProductNotFound

client = Curtfire()

# Browse the category tree and pick the first top-level category.
top_category = None
for cat in client.categories.list(limit=10):
    if cat.parent_category_id == 0:
        top_category = cat
        break

# List products in that category, sorted by price ascending.
if top_category is not None:
    print(f"Category: {top_category.name}")
    for item in top_category.products.list(sort=ProductSort.PRICE_ASC, limit=3):
        print(f"  {item.name} — R{item.price:.2f}, in stock: {item.in_stock}")

# Keyword search across the whole catalogue.
hit = client.product_summaries.search(keyword="watch", limit=1).first()

# Navigate from the summary card to the full product detail.
if hit is not None:
    detail = hit.details()
    print(f"\n{detail.name} (R{detail.price:.2f} {detail.currency})")
    print(f"  Stock: {detail.stock_message}, dispatch: {detail.dispatch_time_days} days")
    print(f"  Images: {len(detail.image_urls)}")
    for opt in detail.options:
        print(f"  Option '{opt.name}': {[v.name for v in opt.values]}")

# Point lookup by a known product_id, with typed error handling.
try:
    product = client.products.get(product_id=hit.product_id) if hit else client.products.get(product_id=19)
    print(f"\nLooked up: {product.name}")
except ProductNotFound:
    print("Product not found on the site.")

print("\nexercised: categories.list / category.products.list / product_summaries.search / details / products.get")
All endpoints · 4 totalmissing one? ·

Searches the whole Curtfire catalogue by keyword and returns one page of product summary cards (one record per product) with price in ZAR, stock flag, thumbnail, vendor and rating counts. An empty keyword lists the entire catalogue. Results are paginated: page (1-based, default 1) and page_size (default 24, clamped to 100) are read from the caller; total_count is the site's count of matching products and has_more tells whether a further page exists. sort selects the site's own ordering menu. vendor_id restricts results to a single marketplace vendor (vendor_id as emitted on product cards; products with no vendor are site-owned). A keyword with no matches returns an empty products array with total_count 0. One upstream request per call.

Input
ParamTypeDescription
pageinteger1-based page number.
sortstringResult ordering, mirroring the site's sort menu.
keywordstringFree-text search term matched against product names and descriptions. Empty = list all products.
page_sizeintegerProducts per page; values above 100 are clamped to 100.
vendor_idintegerRestrict to products sold by this marketplace vendor (vendor_id from product cards). Omitted = all vendors.
Response
{
  "type": "object",
  "fields": {
    "page": "integer, the page returned (1-based)",
    "sort": "the sort code applied",
    "has_more": "boolean, true when a further page exists",
    "products": "array of product summary cards: product_id (integer, use with get_product), name, short_description (nullable), sku (nullable), slug (nullable), url, price (number, ZAR), old_price (nullable pre-discount price), discount_percentage (nullable integer), currency, in_stock (boolean), image_url, rating_average, rating_count, vendor_id (nullable integer), vendor_name (nullable), has_required_options (boolean: product needs a variant choice)",
    "page_size": "integer, effective page size after clamping",
    "total_count": "integer, site-reported number of products matching the query across all pages"
  },
  "sample": {
    "data": {
      "page": 1,
      "sort": "position",
      "has_more": false,
      "products": [
        {
          "sku": null,
          "url": "https://curtfire.co.za/product/19/childrens-smart-watch",
          "name": "Children's smart watch",
          "slug": "childrens-smart-watch",
          "price": 569,
          "currency": "ZAR",
          "in_stock": true,
          "image_url": "https://portal.curtfire.co.za/images/thumbs/0000101_childrens-smart-watch_300.jpeg",
          "old_price": null,
          "vendor_id": 1,
          "product_id": 19,
          "vendor_name": "Curtfire",
          "rating_count": 0,
          "rating_average": 0,
          "short_description": null,
          "discount_percentage": null,
          "has_required_options": true
        }
      ],
      "page_size": 24,
      "total_count": 1
    },
    "status": "success"
  }
}

About the Curtfire API

Search and Browse the Catalogue

The search_products endpoint accepts a keyword string matched against product names and descriptions. Leaving keyword empty returns the full catalogue. Results are paginated using page (1-based) and page_size (clamped to 100). Each product summary card in the products array includes product_id, name, short_description, sku, price in ZAR, in_stock flag, thumbnail URL, vendor, and rating counts. A total_count field reports the site's total matching products across all pages, and has_more indicates whether a subsequent page exists. You can also restrict results to a single seller using the vendor_id parameter.

Category Navigation

list_categories returns every category in the Curtfire hierarchy as a flat list. Each entry includes category_id, name, slug, url, and parent_category_id — where 0 marks a top-level category and any non-zero value points to the parent's category_id. Feed any category_id into list_category_products to retrieve paginated product summary cards scoped to that category. The same sort, page, and page_size parameters available in search_products work here too.

Full Product Details

get_product takes a single product_id (as returned by search_products or list_category_products) and returns the complete product record. Key fields include price and old_price (both in ZAR), currency (ISO code ZAR), in_stock, sku, gtin, slug, url, and a gallery array of image URLs. The options array exposes variant groups — each with option_id, name, prompt, is_required, and a values array carrying value_id, name, color_rgb, and price_adjustment. Dispatch lead time in days and a stock message are also included.

Reliability & maintenanceVerified

The Curtfire API is a managed, monitored endpoint for curtfire.co.za — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when curtfire.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 curtfire.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.

Last verified
3h ago
Latest check
4/4 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Sync Curtfire ZAR prices and stock status into a price-comparison tool targeting South African shoppers.
  • Build a category-aware product feed by walking the category tree from list_categories and paginating list_category_products for each leaf node.
  • Monitor old_price vs price fields from get_product to detect active discounts across the catalogue.
  • Filter search_products by vendor_id to aggregate all listings from a specific Curtfire marketplace seller.
  • Populate a product configurator by reading the options and values arrays from get_product to surface variant choices.
  • Track rating counts over time from search_products summary cards to identify trending or newly reviewed products.
  • Index Curtfire product names, descriptions, and GTINs for a local South African shopping search engine.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does Curtfire have an official developer API?+
Curtfire does not publish an official public developer API or documented data access programme. This Parse API is the structured way to access the catalogue data programmatically.
What does get_product return for products with multiple variants?+
The options array contains one entry per variant group (for example, size or colour). Each group includes option_id, name, prompt, is_required, and a values array. Each value carries value_id, name, color_rgb (for colour swatches), and price_adjustment so you can calculate the price for each variant combination.
How does pagination work across the search and category endpoints?+
Both search_products and list_category_products use a 1-based page parameter with a page_size defaulting to 24 and clamped to a maximum of 100. The response includes total_count (total matching products across all pages) and has_more (a boolean that is true when at least one further page exists). Iterate by incrementing page until has_more is false.
Does the API expose seller or vendor profile pages, ratings, or contact details?+
Not currently. The API returns a vendor identifier and name on product summary cards and detail records, and vendor_id can be used to filter search_products results to a single seller. Dedicated vendor profile pages, seller ratings, and contact details are not covered. You can fork this API on Parse and revise it to add a vendor detail endpoint if that data is available on the site.
Is product review text returned, or only rating counts?+
Summary cards from search_products and list_category_products include rating counts. Individual written review text is not currently returned by any endpoint. You can fork the API on Parse and revise it to add a reviews endpoint for a given product_id.
Page content last updated . Spec covers 4 endpoints from curtfire.co.za.
Related APIs in MarketplaceSee all →
pricecheck.co.za API
Search for products across South African retailers and instantly compare prices, store locations, and available offers from multiple shops in one place. Find the best deal by viewing each store's pricing and physical address for any product you're looking for.
clicks.co.za API
Search for and browse thousands of products from Clicks, South Africa's leading pharmacy, health, home and beauty retailer, with access to detailed product information, pricing, and the complete category structure. Discover items by keyword search or explore products organized by category to find exactly what you need.
bidorbuy.co.za API
Search and browse products on Bob Shop, view detailed product information, seller profiles and ratings, explore category listings, and discover current promotions. Get search suggestions and navigate the complete product catalog to find exactly what you're looking for.
sarker.shop API
Access data from sarker.shop.
scuffers.com API
Access data from scuffers.com.
products.checkers.co.za API
Search and browse products from Checkers South Africa's online store, compare prices, and discover current specials and deals. Explore the complete product catalog by category to find items and get detailed product information all in one place.
screwfix.com API
Access Screwfix's full product catalog — browse category hierarchies, retrieve paginated product listings with pricing and ratings, fetch detailed product specifications, and search by keyword. Ideal for price monitoring, product research, and catalog analysis.
fantasticfurniture.com.au API
Search Fantastic Furniture's Australian online store by keyword to find products, then retrieve detailed information including pricing and stock availability for any item you're interested in. Perfect for quickly comparing furniture options and checking what's in stock before shopping.