# Kilimall API — Kenya and Uganda marketplace prices (KES / UGX), list price and promotions, stock by source, Fulfilled-by-Kilimall / overseas / local dispatch, stores with ratings, reviews

> Search Kilimall (Kenya kilimall.co.ke or Uganda kilimall.ug) by keyword and/or category, department or brand, with a price range, fulfilment (Fulfilled by Kilimall / overseas shipment / local dispatch), ships-from country and store badge filters, sorted by relevance, price, top sales or newest. Each row: listing id, title, URL, image, lowest and highest variant price, list-price range, rating and review count, fulfilment tags, store badge (brand_official / brand_authorized / none). Plus the source's total (capped at 10,000). One of `query`, `category_id` or `department_id` is required.
> ReefAPI engine `kilimall` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/kilimall/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/kilimall/v1/search — 2 credits
Search Kilimall (Kenya kilimall.co.ke or Uganda kilimall.ug) by keyword and/or category, department or brand, with a price range, fulfilment (Fulfilled by Kilimall / overseas shipment / local dispatch), ships-from country and store badge filters, sorted by relevance, price, top sales or newest. Each row: listing id, title, URL, image, lowest and highest variant price, list-price range, rating and review count, fulfilment tags, store badge (brand_official / brand_authorized / none). Plus the source's total (capped at 10,000). One of `query`, `category_id` or `department_id` is required.

**Parameters:**
- `query` (string, optional) — Search words, as typed in Kilimall's search box.
- `category_id` (string, optional) — Kilimall category id (digits): from a product's `categories`, or from the `categories` action with a `department_id`.
- `department_id` (string, optional) — Kilimall department id (digits) from the `categories` action (e.g. 872 = Phones & Accessories).
- `brand` (string, optional) — Brand as Kilimall writes it (e.g. Apple, Samsung). Matched case-insensitively.
- `min_price` (number, optional) — Lowest price in the site's currency (KES / UGX); a listing matches when its variant price range reaches this.
- `max_price` (number, optional) — Highest price in the site's currency (applies to the listing's lowest variant price).
- `fulfilment` (enum, optional) — Only listings with this delivery type. [one of: kilimall, overseas, local]
- `ships_from` (enum, optional) — Only listings that ship from this country (the site's own 'Shipped from' filter). [one of: kenya, china]
- `store_type` (enum, optional) — Only listings from stores with this badge. [one of: brand_official, brand_authorized]
- `sort` (enum, optional, default "relevance") — Order of results. [one of: relevance, price_asc, price_desc, top_sales, newest]
- `country` (enum, optional, default "KE") — Which Kilimall site: KE (Kenya, KES) or UG (Uganda, UGX). [one of: KE, UG]
- `page` (integer, optional, default 1) — Result page, starting at 1. The source serves the first 10,000 results only.
- `page_size` (integer, optional, default 36) — Rows per page (1-100; the site uses 36).

**Returns:** results[]{listing_id, sku_id, title, short_title, url, image, currency, price, price_max, list_price_min, list_price_max, rating, review_count, rating_scale, fulfilment[], delivery_tags[], store_badge, big_discount_sale, tags[], highlights[]} + total, total_capped, page, page_size, last_page, has_more, country, currency

**Example request body:**
```json
{
  "query": "iphone"
}
```

### POST https://api.reefapi.com/kilimall/v1/product — 3 credits
Full record of one Kilimall listing: title, price in KES / UGX (the live promotion price when one runs, with its window), sale and list price, discount, stock as the site shows it plus the Kilimall-warehouse / overseas / seller stock, every variant with its own price and stock, fulfilment and ships-from town, warranty / exchange / return days, store vouchers, specifications, category path, images, video, rating histogram and the store with its rating and followers.

**Parameters:**
- `listing_id` (string, required) — Kilimall listing id exactly as a search row returns it in `listing_id` (digits; the number after /listing/ in a kilimall.co.ke or kilimall.ug URL). A listing URL is accepted too.
- `country` (enum, optional, default "KE") — Which Kilimall site: KE (Kenya, KES) or UG (Uganda, UGX). [one of: KE, UG]

**Returns:** {listing_id, sku_id, title, short_title, url, currency, price, regular_sale_price, list_price, price_before_discount, discount_percent, promotion{type, price, starts_at, ends_at}, in_stock, stock_quantity, stock_status, stock_kilimall_warehouse, stock_overseas, stock_seller, ships_by, fulfilment, ships_from, warranty_days, exchange_days, return_refund_days, rating, review_count, rating_histogram[], images[], video_url, in_the_box, description, specifications[]{name, value}, variant_options[], variants[]{sku_id, options, sale_price, list_price, discount_percent, in_stock, stock_quantity, …}, categories[]{id, name}, store_vouchers[], store{store_id, name, badge, rating, review_count, followers, product_count, …}}

**Example request body:**
```json
{
  "listing_id": "1001816391"
}
```

### POST https://api.reefapi.com/kilimall/v1/reviews — 2 credits
Customer reviews of one Kilimall listing: product, delivery and service score, review text, photos, the variant bought and its price, reviewer name as the site shows it ('Anonymous User' for reviewers who chose anonymity), date, likes and the seller's reply. Paged, with the source's total.

**Parameters:**
- `listing_id` (string, required) — Kilimall listing id exactly as a search row returns it in `listing_id` (digits; the number after /listing/ in a kilimall.co.ke or kilimall.ug URL). A listing URL is accepted too.
- `sort` (enum, optional, default "top") — Review order as the site offers it. [one of: top, default]
- `country` (enum, optional, default "KE") — Which Kilimall site: KE (Kenya, KES) or UG (Uganda, UGX). [one of: KE, UG]
- `page` (integer, optional, default 1) — Page, starting at 1.
- `page_size` (integer, optional, default 20) — Reviews per page (1-50).

**Returns:** {listing_id, total, page, page_size, has_more, reviews[]{review_id, rating, delivery_rating, service_rating, comment, images[], videos[], author, anonymous, date, variant, sku_id, price_paid, likes, replies, seller_reply{comment, date, author}}}

**Example request body:**
```json
{
  "listing_id": "1001816391"
}
```

### POST https://api.reefapi.com/kilimall/v1/store — 3 credits
A Kilimall marketplace store: name, badge (brand official / authorised), rating and review count, followers, number of products, shipping address as the store states it, plus one page of the store's listings (same row shape as search), optionally searched and sorted.

**Parameters:**
- `store_id` (string, required) — Store id (digits) — a product's `store.store_id`.
- `query` (string, optional) — Only this store's listings matching these words.
- `sort` (enum, optional, default "relevance") — Order of the store's listings. [one of: relevance, price_asc, price_desc, top_sales, newest]
- `country` (enum, optional, default "KE") — Which Kilimall site: KE (Kenya, KES) or UG (Uganda, UGX). [one of: KE, UG]
- `page` (integer, optional, default 1) — Result page, starting at 1. The source serves the first 10,000 results only.
- `page_size` (integer, optional, default 36) — Rows per page (1-100; the site uses 36).

**Returns:** {store{store_id, name, alias, url, logo, badge, rating, review_count, followers, product_count, shipping_address}, results[] (search rows), total, page, page_size, last_page, has_more}

**Example request body:**
```json
{
  "store_id": "100012240"
}
```

### POST https://api.reefapi.com/kilimall/v1/categories — 2 credits
Kilimall's departments (id, name) as the site's menu lists them; with `department_id`, the categories the source lists under that department (id, name) — those ids work in search `category_id`.

**Parameters:**
- `department_id` (string, optional) — A department id from this action's first call.
- `country` (enum, optional, default "KE") — Which Kilimall site: KE (Kenya, KES) or UG (Uganda, UGX). [one of: KE, UG]

**Returns:** departments[]{department_id, name, url} or categories[]{category_id, name} + total

**Example request body:**
```json
{
  "department_id": "872"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=kilimall
- Human docs page: https://reefapi.com/docs/kilimall
- Overview page: https://reefapi.com/kilimall-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
