Tiki
Vietnam's home-grown marketplace: prices in VND with the strikethrough kept apart, per-seller offers, variants and reviews with the star histogram.
/tiki/v1/search2 creditsSearch Tiki the way a Vietnamese shopper does and get the product grid: the price actually charged in dong, Tiki's strikethrough price, the real discount, rating and rating count, units sold, the seller, and both ids you need to read the product (`product_id` and `seller_product_id`). Narrow with a price band, a minimum rating, a category, a brand or a seller — every one of them measured to bite. 🔴 Tiki matches the literal words in a product title and does NOT translate: `điện thoại` returns 10 000+ results and `phone` returns 92; `tã bỉm` returns 7 635 and `diaper` returns 2. Search in Vietnamese, with the diacritics, and this API passes them through untouched.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| query | required | — | What a shopper would type on tiki.vn — in Vietnamese. Diacritics are passed through unchanged and matter: `giày` returns 4 608 results and the accent-stripped `giay` returns 8 802 DIFFERENT ones, sharing 1 row in 40. Both work; they are not the same query. |
| page = 1 | optional | 1–50 | 1-based page number. Tiki serves 40 products a page and clamps every larger `limit` back to 40, so this is the only way to go deeper. It stops at page 50: page 51 answers HTTP 200 with zero rows, which is a ceiling of 2000 products per query however many `total_results` reports. |
| sort | optional | default · top_seller · newest · price_asc · price_desc | Result order. Tiki's own default is `default` (its popularity ranking). 🔴 A price sort selects a global price band per page — measured on `sách`: page 1 spans 9 500-14 000 ₫, page 2 14 000-25 000 ₫, page 10 40 000-41 000 ₫ — but the source hands the 40 rows back newest-listing-first inside that band, so this API re-orders the page by price and sets `page_reordered`. Tiki silently IGNORES an order it does not know, so anything outside this list is rejected here rather than quietly dropped. |
| price_min | optional | 0– | Lowest price in Vietnamese dong (whole dong — Tiki publishes no minor unit). Sent to the source as one band with `price_max`. |
| price_max | optional | 1– | Highest price in dong. Measured on the query `iphone`: 3 399 matches unfiltered, 124 under 50 000 ₫, 77 between 1 000 000 and 15 000 000 ₫. |
| min_rating | optional | 1–5 | Only products whose average customer rating is at least this many stars, 1-5. This also drops unrated products. Measured on `iphone`: 3 399 unfiltered, 993 at 1+, 929 at 3+, 842 at 4+, 705 at 5. Tiki clamps 6 to 5 and ignores a non-number, so both are rejected here instead. |
| category_id | optional | — | Narrow to one category. Accepts the numeric id (1789 = Phones & Tablets) or a tiki.vn category URL (`/dien-thoai-may-tinh-bang/c1789`). Ids come from `categories`, from a product's `category_path`, or from the `category` facet. Measured: `iphone` 3 399 matches, 3 inside category 1789. |
| brand_id | optional | — | Narrow to one brand id. Ids come from the `brand` facet on `category` or from any product's `brand_id`. Measured: `iphone` 3 399 unfiltered, 3 for brand 17827 (Apple). |
| seller_id | optional | — | Narrow to one merchant. Seller ids come from any product row's `seller_id` or from the `seller` facet. Measured: `iphone` 3 399 unfiltered, 4 from seller 1 (Tiki Trading). |
/tiki/v1/category2 creditsWalk one Tiki category page by page, with the same filters as `search` and the same product rows — and, with `include_facets`, the filter block Tiki itself shows: every brand, seller, price band, rating and category-specific attribute WITH the number of products behind it. That facet block is where the `brand_id` and `seller_id` values come from. Category ids come from `categories` or from any product's `category_path`. A category id Tiki does not publish returns NOT_FOUND rather than an empty success.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| category_id | required | — | Numeric Tiki category id (1789 = Phones & Tablets, 8322 = Tiki Books) or a tiki.vn category URL such as `https://tiki.vn/dien-thoai-may-tinh-bang/c1789`. |
| query | optional | — | Optional keyword to apply INSIDE the category. Measured: category 1789 holds 107 products, 3 of them match `iphone`. |
| page = 1 | optional | 1–50 | 1-based page number. Tiki serves 40 products a page and clamps every larger `limit` back to 40, so this is the only way to go deeper. It stops at page 50: page 51 answers HTTP 200 with zero rows, which is a ceiling of 2000 products per query however many `total_results` reports. |
| include_facets = false | optional | — | Also return `facets`: every filter Tiki offers for this category with the number of products behind each value — brands, sellers (with their ids), price bands, ratings, colours, and the category-specific ones such as ROM or camera resolution on phones. 🔴 Tiki publishes facets only for a CATEGORY: the keyword search route returns no `filters` key at all, and the facet route refuses a bare keyword, so this parameter has no effect on `search`. Turning it on costs one extra upstream request. |
| sort | optional | default · top_seller · newest · price_asc · price_desc | Result order. Tiki's own default is `default` (its popularity ranking). 🔴 A price sort selects a global price band per page — measured on `sách`: page 1 spans 9 500-14 000 ₫, page 2 14 000-25 000 ₫, page 10 40 000-41 000 ₫ — but the source hands the 40 rows back newest-listing-first inside that band, so this API re-orders the page by price and sets `page_reordered`. Tiki silently IGNORES an order it does not know, so anything outside this list is rejected here rather than quietly dropped. |
| price_min | optional | 0– | Lowest price in Vietnamese dong (whole dong — Tiki publishes no minor unit). Sent to the source as one band with `price_max`. |
| price_max | optional | 1– | Highest price in dong. Measured on the query `iphone`: 3 399 matches unfiltered, 124 under 50 000 ₫, 77 between 1 000 000 and 15 000 000 ₫. |
| min_rating | optional | 1–5 | Only products whose average customer rating is at least this many stars, 1-5. This also drops unrated products. Measured on `iphone`: 3 399 unfiltered, 993 at 1+, 929 at 3+, 842 at 4+, 705 at 5. Tiki clamps 6 to 5 and ignores a non-number, so both are rejected here instead. |
| category_id | optional | — | Narrow to one category. Accepts the numeric id (1789 = Phones & Tablets) or a tiki.vn category URL (`/dien-thoai-may-tinh-bang/c1789`). Ids come from `categories`, from a product's `category_path`, or from the `category` facet. Measured: `iphone` 3 399 matches, 3 inside category 1789. |
| brand_id | optional | — | Narrow to one brand id. Ids come from the `brand` facet on `category` or from any product's `brand_id`. Measured: `iphone` 3 399 unfiltered, 3 for brand 17827 (Apple). |
| seller_id | optional | — | Narrow to one merchant. Seller ids come from any product row's `seller_id` or from the `seller` facet. Measured: `iphone` 3 399 unfiltered, 4 from seller 1 (Tiki Trading). |
/tiki/v1/brand2 creditsOne brand's whole Tiki shelf, paged and filterable exactly like a category, plus the brand's own record (name, logo, page URL, description). Measured: brand 18802 (Samsung) has 224 products on Tiki, brand 17827 (Apple) has 18. A brand id Tiki does not publish returns NOT_FOUND — its own brand route answers 404 'Brand not found', which this action uses as the oracle rather than guessing from an empty grid.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| brand_id | required | — | Numeric Tiki brand id. Take it from any product row's `brand_id`, or from the `brand` facet on `category`. 🔴 Books carry no brand at all on Tiki — the field is absent, not empty — so this action does not cover the book catalogue. |
| query | optional | — | Optional keyword applied inside the brand's shelf. |
| page = 1 | optional | 1–50 | 1-based page number. Tiki serves 40 products a page and clamps every larger `limit` back to 40, so this is the only way to go deeper. It stops at page 50: page 51 answers HTTP 200 with zero rows, which is a ceiling of 2000 products per query however many `total_results` reports. |
| sort | optional | default · top_seller · newest · price_asc · price_desc | Result order. Tiki's own default is `default` (its popularity ranking). 🔴 A price sort selects a global price band per page — measured on `sách`: page 1 spans 9 500-14 000 ₫, page 2 14 000-25 000 ₫, page 10 40 000-41 000 ₫ — but the source hands the 40 rows back newest-listing-first inside that band, so this API re-orders the page by price and sets `page_reordered`. Tiki silently IGNORES an order it does not know, so anything outside this list is rejected here rather than quietly dropped. |
| price_min | optional | 0– | Lowest price in Vietnamese dong (whole dong — Tiki publishes no minor unit). Sent to the source as one band with `price_max`. |
| price_max | optional | 1– | Highest price in dong. Measured on the query `iphone`: 3 399 matches unfiltered, 124 under 50 000 ₫, 77 between 1 000 000 and 15 000 000 ₫. |
| min_rating | optional | 1–5 | Only products whose average customer rating is at least this many stars, 1-5. This also drops unrated products. Measured on `iphone`: 3 399 unfiltered, 993 at 1+, 929 at 3+, 842 at 4+, 705 at 5. Tiki clamps 6 to 5 and ignores a non-number, so both are rejected here instead. |
| category_id | optional | — | Narrow to one category. Accepts the numeric id (1789 = Phones & Tablets) or a tiki.vn category URL (`/dien-thoai-may-tinh-bang/c1789`). Ids come from `categories`, from a product's `category_path`, or from the `category` facet. Measured: `iphone` 3 399 matches, 3 inside category 1789. |
| seller_id | optional | — | Narrow to one merchant. Seller ids come from any product row's `seller_id` or from the `seller` facet. Measured: `iphone` 3 399 unfiltered, 4 from seller 1 (Tiki Trading). |
/tiki/v1/seller2 creditsOne merchant's whole Tiki shelf plus the merchant's own profile: its rating out of 5, how many reviews that rating is built on, follower count, how many days it has been on Tiki, whether it is an official store and at what store level. Measured: seller 1 (Tiki Trading) 4.68 from 5 604 463 reviews, 515 120 followers, 3 368 days on the platform; seller 29952 (Hồng Hạnh Mobile) 4.73 from 2 878 reviews. Costs two upstream requests: the shelf, then the profile.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| seller_id | required | — | Numeric Tiki seller id, from any product row's `seller_id` or from the `seller` facet on `category`. |
| query | optional | — | Optional keyword applied inside the merchant's shelf. |
| page = 1 | optional | 1–50 | 1-based page number. Tiki serves 40 products a page and clamps every larger `limit` back to 40, so this is the only way to go deeper. It stops at page 50: page 51 answers HTTP 200 with zero rows, which is a ceiling of 2000 products per query however many `total_results` reports. |
| sort | optional | default · top_seller · newest · price_asc · price_desc | Result order. Tiki's own default is `default` (its popularity ranking). 🔴 A price sort selects a global price band per page — measured on `sách`: page 1 spans 9 500-14 000 ₫, page 2 14 000-25 000 ₫, page 10 40 000-41 000 ₫ — but the source hands the 40 rows back newest-listing-first inside that band, so this API re-orders the page by price and sets `page_reordered`. Tiki silently IGNORES an order it does not know, so anything outside this list is rejected here rather than quietly dropped. |
| price_min | optional | 0– | Lowest price in Vietnamese dong (whole dong — Tiki publishes no minor unit). Sent to the source as one band with `price_max`. |
| price_max | optional | 1– | Highest price in dong. Measured on the query `iphone`: 3 399 matches unfiltered, 124 under 50 000 ₫, 77 between 1 000 000 and 15 000 000 ₫. |
| min_rating | optional | 1–5 | Only products whose average customer rating is at least this many stars, 1-5. This also drops unrated products. Measured on `iphone`: 3 399 unfiltered, 993 at 1+, 929 at 3+, 842 at 4+, 705 at 5. Tiki clamps 6 to 5 and ignores a non-number, so both are rejected here instead. |
| category_id | optional | — | Narrow to one category. Accepts the numeric id (1789 = Phones & Tablets) or a tiki.vn category URL (`/dien-thoai-may-tinh-bang/c1789`). Ids come from `categories`, from a product's `category_path`, or from the `category` facet. Measured: `iphone` 3 399 matches, 3 inside category 1789. |
| brand_id | optional | — | Narrow to one brand id. Ids come from the `brand` facet on `category` or from any product's `brand_id`. Measured: `iphone` 3 399 unfiltered, 3 for brand 17827 (Apple). |
/tiki/v1/product1 creditThe full Tiki product record: the price actually charged in dong, Tiki's strikethrough price and the real discount, rating and how many people rated it, units sold all-time, live availability, every gallery image, the description as clean text, the spec table row by row, warranty and return terms, how many colour/size variants exist, the SELLER behind the offer (id, name, store URL, logo) and every RIVAL offer on the same product with its own price. 🔴 Pass `seller_product_id` whenever you have one: without it Tiki serves whichever offer its buybox picks, which on a multi-seller product is a different merchant at a different price — measured 104 250 ₫ vs 73 000 ₫ on the same book, HTTP 200 both times. When no spid is given the record says `offer_is_buybox: true`. Availability comes from Tiki's own status string, never from `stock_item.qty`, which is a hardcoded 1000 on every product measured and is returned here under its real meaning, `max_order_qty`.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| product_id | required | — | The product to read. Accepts the numeric id (278628812) or a full tiki.vn product URL — and if the URL carries `?spid=`, that offer is used automatically. Every listing row here carries both `url` and `seller_product_id`. |
| seller_product_id | optional | — | Which SELLER's offer to read for this product. 🔴 Pass it whenever you have it. A Tiki product id can carry several sellers' offers, and without a spid Tiki returns whichever one its buybox picks — measured on 30 products, 2 came back with a different seller AND a different price, the worst 104 250 ₫ vs 73 000 ₫ on the same book, with HTTP 200 and no signal. Every product row and every URL from this API carries the right value; when it is omitted the record returns `offer_is_buybox: true`. |
/tiki/v1/product/variants1 creditEvery colour, size or pack of one product with ITS OWN price, strikethrough price, discount, SKU, availability and images. A Tiki t-shirt is one product id and a dozen colour/size combinations, each separately priced and separately in or out of stock, and each carrying the `seller_product_id` that `product` needs to read it. Products Tiki sells in a single form return an empty `variants` and `count: 0` — that is the source publishing none, not an error (measured: 6 of 12 products have variants). Tiki publishes no per-variant stock NUMBER, only an availability status, so that is what this returns.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| product_id | required | — | The product to read. Accepts the numeric id (278628812) or a full tiki.vn product URL — and if the URL carries `?spid=`, that offer is used automatically. Every listing row here carries both `url` and `seller_product_id`. |
| seller_product_id | optional | — | Which SELLER's offer to read for this product. 🔴 Pass it whenever you have it. A Tiki product id can carry several sellers' offers, and without a spid Tiki returns whichever one its buybox picks — measured on 30 products, 2 came back with a different seller AND a different price, the worst 104 250 ₫ vs 73 000 ₫ on the same book, with HTTP 200 and no signal. Every product row and every URL from this API carries the right value; when it is omitted the record returns `offer_is_buybox: true`. |
/tiki/v1/product/reviews1 creditThe customer reviews Tiki publishes for a product: star rating, title, the full text, the reviewer's display name, whether they are a verified buyer, the date, how many shoppers found it helpful, the delivery rating and the photos they posted — plus the real 1-5 star histogram behind the average. Unlike many marketplaces this one pages deep: measured 7 046 reviews over 353 pages on one book. Filter by star with `stars` and the counts move for real (7 046 unfiltered → 6 048 at 5 stars, 726 at 4, 135 at 3, 63 at 2, 74 at 1). 🔴 Tiki publishes three different review counts that are not the same quantity: the product record says 6 153, this stream says 7 046, and its own histogram sums to 7 029. All three are returned under separate names rather than reconciled.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| product_id | required | — | The product to read. Accepts the numeric id (278628812) or a full tiki.vn product URL — and if the URL carries `?spid=`, that offer is used automatically. Every listing row here carries both `url` and `seller_product_id`. |
| seller_product_id | optional | — | Which SELLER's offer to read for this product. 🔴 Pass it whenever you have it. A Tiki product id can carry several sellers' offers, and without a spid Tiki returns whichever one its buybox picks — measured on 30 products, 2 came back with a different seller AND a different price, the worst 104 250 ₫ vs 73 000 ₫ on the same book, with HTTP 200 and no signal. Every product row and every URL from this API carries the right value; when it is omitted the record returns `offer_is_buybox: true`. |
| page = 1 | optional | 1–50 | 1-based page number. Tiki serves 40 products a page and clamps every larger `limit` back to 40, so this is the only way to go deeper. It stops at page 50: page 51 answers HTTP 200 with zero rows, which is a ceiling of 2000 products per query however many `total_results` reports. |
| stars | optional | 1–5 | Only reviews with exactly this many stars, 1-5. Measured on one book: 7 046 reviews unfiltered, 74 at 1 star, 63 at 2, 135 at 3, 726 at 4, 6 048 at 5. 🔴 Upstream this rides the SAME slot as `sort`, so setting `stars` overrides `sort`; the response reports which was applied in `sort_applied`. Every other star filter Tiki appears to accept (`rating=`, `filter=`, `type=has_image`) is silently ignored and is therefore not offered here. |
| sort | optional | helpful · newest | Review order. `helpful` is Tiki's own default. |
/tiki/v1/suggestfreeTiki's own autocomplete for a partial query: the search terms it would offer and the official stores it maps the term to, with their ids. The cheapest way to find the Vietnamese wording Tiki actually indexes before spending a search on a guess — and the only place a store name turns into a store id. Sponsored entries are returned flagged, not silently mixed in.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| query | required | — | A partial or full query in Vietnamese, e.g. `nồi chi` for `nồi chiên không dầu`. |
/tiki/v1/categoriesfreeTiki's category tree, one level at a time, each category with its id, name, URL, depth, whether it is a leaf and HOW MANY PRODUCTS it holds. Call it with no parameters for the top-level departments; pass `parent_id` to walk down. These are the ids `category` and the `category_id` filter take. Measured: category 1789 has 5 children, and their published product counts are 75, 17, 12, 3 and 1.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| parent_id | optional | — | The category whose children to list, as an id or a tiki.vn category URL. Omit for the top-level departments — Tiki refuses `parent_id=0` with HTTP 400, so the root comes from its own menu instead. |
| query | optional | — | Only categories whose name contains this text, case-insensitive and diacritics as typed. |
curl -X POST https://api.reefapi.com/tiki/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{}'{
"ok": true,
"data": { /* the result */ },
"meta": {
"latency_ms": 240,
"record_count": 12,
"completeness_pct": 100
},
"error": null
}