Read Shopee catalogue and live per-variant stock across seven markets
The Shopee API returns products, per-variant stock, seller profiles and shop vouchers from seven Southeast-Asian Shopee markets — Indonesia, Vietnam, Thailand, the Philippines, Malaysia, Singapore and Taiwan — as clean JSON.
4 active endpoints, on 1, 2 and 3 credit tiers.
- POST/shopee/v1/product
- POST/shopee/v1/batch
- POST/shopee/v1/shop
- POST/shopee/v1/shop_showcase
What Shopee endpoints does ReefAPI ship?
4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Shopee API
3 of 4 endpoints, ready to run
The full product record: title, every image, every variant with its own live stock count, the variant axes, the three-level category path and the seller's vouchers. Read the first coverage row before you build on the price field.
{ "ok": true, "meta": { "api": "shopee", "endpoint": "product", "mode": "live", "latency_ms": 2932.5, "record_count": 1, "cache_hit": false }, "data": { "product": { "market": "id", "market_domain": "shopee.co.id", "item_id": 4669874676, "shop_id": 165796339, "url": "https://shopee.co.id/product/165796339/4669874676", "canonical_url": null, "title": "A 81 Herbal Deodorant Spray Natural 60ml bpom", "description": "No BPOM RI NA 18220900426\nProduk abi herbal ganti Nama jadi A81 herbal\n\nHATI” PRODUK PALSU YG ASLI ADA NO BATCH BARCODE DI KEMASAN DAN BOTOL\n\nproduk fresh selalu ready ya ..\n\nCara penggunaan\n- Hari pertama Sampai dengan 2 Minggu pemakaian, gunakan 2 x sehari pastikan ketiak sudah kering saat mau di semprot abi herbal ya\n- selanjutnya tergantung kebutuhan(note untuk yang bau ketiak nya udh parah tolong bagian ketiak semua baju saat cuci di sikat pakai sabun bagian ketiak nya supaya bau yg lama tidak naik lagi)\n\n-Manfaat abi herbal:\n1. Dapat menghilangkan bau badan, terutama pada bagian ketiak dan area lainya\n2. Mencegah dan mengurangi keringat yang berlebihan pada bagian ketiak,ketiak jadi terasa ringan.\n3. Menstimulasi aroma alami tubuh\n4. Membuat kulit ketiak lebih lembut dan menahan tumbuhnya bulu ketiak\n5. Mencerahkan ketiak tidak lengket dan tidak berbekas di baju.\n6. mengurangi tumbuhnya bulu di ketiak \n\nTawas adalah mineral alami sudah sejak jaman nenek moyang digunakan untuk menghilangkan bau badan kami menggunakan tawas import dapat memperbaiki sel kulit mencerahkan kulit ketiak lebih cepat dan alami otomatis dengan tawas bakteri bau ketek hilang aman ga lengket ya dan sangat aman di gunakan sehari hari dan mengandung extrac lime untuk mencerahkan kulit bisa buat sholat ya.busui,ibu hamil anak2 di atas 5 tahun dan laki2 boleh pakai ya.", "description_paragraphs": [ { "type": "text", "text": "No BPOM RI NA 18220900426" }, { "type": "text", "text": "Produk abi herbal ganti Nama jadi A81 herbal" }, { "type": "text", "text": "HATI” PRODUK PALSU YG ASLI ADA NO BATCH BARCODE DI KEMASAN DAN BOTOL" } ], "rich_description_paragraphs": null, "brand": "A 81 HERBAL", "brand_id": 3558336, "condition": "new", "currency": "IDR", "currency_scale": 100000, "item_status": "normal", "created_at": "2020-12-18T07:09:52Z", "images": [ { "id": "id-11134207-81ztp-mrl2nuvw1ybm31", "url": "https://down-id.img.susercontent.com/file/id-11134207-81ztp-mrl2nuvw1ybm31" }, { "id": "id-11134207-81ztq-mrfm921ynd3823", "url": "https://down-id.img.susercontent.com/file/id-11134207-81ztq-mrfm921ynd3823" }, { "id": "sg-11134201-22120-30epd6ym9wkv97", "url": "https://down-id.img.susercontent.com/file/sg-11134201-22120-30epd6ym9wkv97" } ], "image_count": 5, "videos": [], "categories": [ { "id": 100630, "name": "Perawatan & Kecantikan", "level": 1 }, { "id": 102002, "name": "Perawatan Tubuh", "level": 2 }, { "id": 102008, "name": "Deodoran", "level": 3 } ], "frontend_categories": [ { "id": 11043145, "name": "Perawatan & Kecantikan", "level": 1 }, { "id": 11043146, "name": "Perawatan Tubuh", "level": 2 }, { "id": 11043152, "name": "Deodoran", "level": 3 } ], "category_id": 100630, "attributes": [ { "id": 100016, "name": "Tipe Paket", "value": "Paket Hemat", "value_id": 381 }, { "id": 100019, "name": "Ukuran Produk", "value": "Travel Size", "value_id": 727 }, { "id": 100036, "name": "Formulasi", "value": "Spray", "value_id": 801 } ], "variants": [ { "model_id": 52524008694, "name": null, "stock": 10, "tier_index": [ 0 ], "sku_image_url": null, "is_pre_order": false, "estimated_days": 2, "measurements": null, "status": 1, "price": null } ], "variant_count": 1, "variant_options": [ { "name": null, "options": [ "" ], "images": null, "type": 0 } ], "stock": 10, "stock_source": "sum_of_variant_stock", "shop": { "shop_id": 165796339, "location": "KOTA TANGERANG", "name": null, "url": "https://shopee.co.id/shop/165796339", "shopee_verified": null, "official_shop_label": true }, "shop_vouchers": [], "seller_services": [ { "title": "15 Hari Pengembalian", "description": "Untuk memastikan kepuasanmu, Shopee Mall memberikan periode pengembalian yang lebih panjang (15 hari setelah barang diterima).", "url": "https://shopee.co.id/m/bebas-pengembalian" }, { "title": "100% Original", "description": "Produk ini dijamin 100% asli dan akan dikirimkan secara langsung. Jika produk yang diterima tidak asli, kamu dapat mengajukan Pengembalian Dana.", "url": "https://shopee.co.id/m/shopee-garansi-ori" }, { "title": "COD-Cek Dulu", "description": "Bayar pesanan di tempat. Kamu berhak untuk membuka dan memeriksa barang sebelum melakukan pembayaran ke Kurir.", "url": "https://shopee.co.id/m/tentang-cod-cekdulu" } ], "wholesale_tiers": [ { "min_quantity": 3, "max_quantity": null, "price": null } ], "size_chart": null, "logistics": { "is_pre_order": false, "estimated_days": 2, "is_free_shipping": false, "max_quantity_per_order": null, "min_purchase_quantity": 1, "cross_border": false }, "flags": { "is_adult": false, "is_fashion_item": false, "is_prescription_item": false, "has_video": false }, "price": null, "price_before_discount": null, "discount": null, "rating": null, "review_count": null, "sold_count": null, "weight": null, "dimensions": null, "shipping": null, "unavailable": { "price": "Shopee deletes the price block from the anonymous product page before serving it — its own `removed_fields` manifest lists product_price.price. Use the shop_showcase action for the one item per shop that Shopee still prices publicly.", "price_before_discount": "Removed by Shopee together with the price on most markets.", "discount": "Removed by Shopee together with the price.", "rating": "Removed by Shopee — both product_review.rating_star and item.item_rating are null on the anonymous page.", "review_count": "Removed by Shopee (cmt_count is null).", "sold_count": "Removed by Shopee (historical_sold and global_sold are null).", "stock_total_upstream": "Removed by Shopee. The `stock` field this API returns is the sum of per-variant stock, which Shopee does still publish in full.", "weight": "There is no weight key anywhere in Shopee's 128-field product schema, on any market. Roughly 40% of products mention a weight in free-text description or attributes and only ~17% carry it as a structured attribute, so it is left to the caller to read `attributes` / `description` rather than reported as a number.", "dimensions": "There is no length/width/height/dimension key in Shopee's product schema. Same situation as weight — sometimes present as an attribute or in the size chart.", "shipping": "product_shipping and shipping_info are null on the anonymous page; only the is_free_shipping flag and estimated_days survive (both returned under logistics).", "reviews": "No review text or histogram exists on this page and the ratings route is gated.", "related_products": "product_attributes.related_items is an empty list on every product.", "shop_name": "shop_detailed is null on the product page. The shop action returns the seller's name, rating and metrics for the same shop_id at ~9 KB." }, "source_removed_fields": [ "product_price.price", "product_price.price_before_discount", "product_price.discount" ], "document_bytes": 935556 } } }
How the Shopee API works
Shopee is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
A product link is two numbers, and both are needed
A Shopee product URL carries the shop id and the item id in that order. There is no keyword search on this API — Shopee serves none publicly — so a product link, not a query, is where every run starts.
{"shop_id": 165796339, "item_id": 4669874676, "market": "id"}Variants come back with an integer stock each, so a nine-variant listing gives you nine live stock counts in one call.
{"shop_id": 165796339, "market": "id"}The seller behind the listing, and the product page's missing shop name. Its product_detail_supported flag tells you whether that shop's items can be read at all.
{"items": ["165796339/4669874676", "..."], "market": "id"}Up to twenty products in one call at a lower per-product cost. Each entry succeeds or fails alone — one dead id does not spoil the call.
Stock monitoring at one call per twenty products. The ids never change, so the shop and product calls are one-off and the batch call is the loop.
curl -X POST https://api.reefapi.com/shopee/v1/product \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"shop_id":165796339,"item_id":4669874676,"market":"id"}'{
"ok": true,
"data": { … },
"meta": {
"api": "shopee",
"endpoint": "product",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Shopee's two-part key, the seven markets, and the 100000 price scale
A Shopee product is not addressable by one id. It takes the shop and the item together, in that order, and the same item_id on another market is a different product or nothing at all. Prices are the other surprise: Shopee stores them scaled by 100000, and both the raw integer and the divided figure are returned so you can check the arithmetic. Measured on 2026-08-27 on shopee.co.id.
| Field | Format | Measured |
|---|---|---|
| shop_id | integer, the FIRST number in /product/<shop_id>/<item_id> | 165796339 (9 digits) and 27651338 (8) - no fixed length |
| item_id | integer, the SECOND number in that path | 4669874676 (10 digits) and 26270321805 (11) |
| market | a closed set of seven | id, vn, th, ph, my, sg, tw. Sending 'br' returns INVALID_PARAM with that list in the error detail |
| currency_scale | the divisor Shopee's raw numbers use | 100000, on both the product and shop_showcase actions |
| price_raw to price | raw divided by currency_scale | 5150000000 becomes 51500.0 with currency "IDR" |
| price_before_discount_raw | same scale | 9500000000 becomes 95000.0 |
| variants[].model_id | the per-variant key | 52524008694 - an id space of its own, separate from item_id |
| shop.user_id | not the same number as shop_id | shop 27651338 belongs to user_id 27652722 |
| rating.count_by_star | an array ordered 1 star to 5, summing to count_total | [1, 0, 4, 13, 151], summing to 169, the reported review_count |
There is no keyword search here. Shopee serves no listing data to anyone but its own app, so ids have to come from links, your own catalogue or an affiliate feed.
What Shopee publishes, what it does not, and which markets answer
Every line below is from a live call. The first one is the reason this page does not sell prices, and it is stated first rather than left for a buyer to discover.
Against us, and it is not our doing: Shopee strips the price, the rating, the review count and the sold count out of its public product page for everybody. Two products on two shops both returned price, price_before_discount, discount, rating, review_count and sold_count as null, and the response lists exactly which fields the source removed. If your product needs a Shopee price on an item you name, this engine cannot give you one.
shop_showcase returns the single item Shopee still prices publicly for a shop — a real current price, the pre-discount price, a discount label, the rating histogram and the sold count. It is shop-addressed: Shopee chooses the item, one per shop. And it answered only on the Indonesian market. The other six were tried by shop id and again by handle, and every attempt came back an upstream 403.
Indonesia, Vietnam, Thailand, the Philippines, Malaysia, Singapore and Taiwan. A shop was resolved on each of the seven by handle, returning that market's own domain, country and rating split. Product detail was measured on Indonesia.
The same shop id and item id that answer on the Indonesian market answer NOT_FOUND on the Vietnamese one. The market parameter is not a language switch — it selects a different marketplace with its own numbering.
Both ids are checked together, so one NOT_FOUND covers three different situations and the message separates them: no such item in that shop, a real item paired with the wrong shop, and an item that exists on a different Shopee market. It comes back with retryable false, so a catalogue sync can close the row instead of queueing a retry.
Per-variant stock as an integer, the variant option axes, the structured attributes, the three-level category path, the brand, the seller's location, active voucher codes with their minimum spend, and product videos with direct file links. This is a stock and catalogue feed, not a price feed.
Shopee publishes no weight or size field at all in its product schema, on any market. Where it exists it is free text inside the attributes or the description, so the response leaves it to you rather than reporting a number it had to guess.
What people build with Shopee
The jobs this data is most often used for.
endpoints
credits per call
Catalogue and brand-protection teams call product to pull an item's full description, images, variants and category path across seven Shopee markets.
Price-intelligence tools use shop_showcase to read a showcased item's current price, discount percent and sold counts.
Marketplace analysts use shop to size a seller — item_count, follower_count, rating breakdown and response rate — before ingesting its listings.
Bulk enrichment pipelines send a list of items to batch and act on the summary totals instead of walking every row.
What Shopee data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/shopee/v1/product \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"shop_id":165796339,"item_id":4669874676,"market":"id"}'import requests
r = requests.post(
"https://api.reefapi.com/shopee/v1/product",
headers={"x-api-key": REEF_KEY},
json={
"shop_id": 165796339,
"item_id": 4669874676,
"market": "id"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Shopee.
Get a free key →Why do I need two ids to fetch one Shopee product?▾
Because that is how Shopee addresses items: a product link is /product/<shop_id>/<item_id>, and the item id alone does not resolve. shop_id is the first number and item_id the second. You can pass the full link instead and both are read out of it, including the share-link form that ends -i.<shop_id>.<item_id>. Ids are also per-market, so the same item_id on shopee.vn is a different product or nothing at all.
Are Shopee prices really multiplied by 100000?▾
Yes, in Shopee's own storage, and both forms come back so you never have to guess. A measured item returned price_raw 5150000000 with price 51500.0, and price_before_discount_raw 9500000000 with price_before_discount 95000.0, and currency_scale 100000 states the divisor. Use price for display and price_raw only when you are reconciling against another Shopee feed.
Why is the price null on the product action?▾
Because Shopee strips the price block out of the anonymous product page before serving it. This is not a parse failure and it is not hidden: the response carries source_removed_fields listing exactly what Shopee removed, which on a measured item was product_price.price, product_price.price_before_discount, product_price.discount, product_price.discount_text and display_sections.wholesale, plus an unavailable object explaining each one. For a real price, use shop_showcase.
What can shop_showcase actually be asked for?▾
A shop, not a product. Shopee publishes exactly one priced item per shop and it chooses which one, so the action takes a shop_id or a username and returns that single item with a live price, discount, rating and sold count. Passing an item id is rejected rather than ignored, because Shopee would ignore it and return the same item anyway, which reads like an answer about the product you named and is not. Use it to price-sample a seller.
Which Shopee discount figure should I trust?▾
Both are returned because they disagree. On a measured item discount_percent was 46, Shopee's own rounded number matching its "-46%" label, while discount_percent_from_prices was 45.8, computed from 51,500 against 95,000. Use Shopee's figure when you are mirroring what a shopper sees, and the derived one when you are computing margins.
Why is the shop name null on a product response?▾
The anonymous product page carries the shop id, the location and an official-shop flag but not the shop's display name. Call the shop action with the same shop_id for it, along with the rating split, follower count, response rate and preparation time. A measured shop returned name "Aywears Olshop", 284 listings, 22,165 followers and a rating breakdown of 10,818 good, 337 neutral and 47 bad. Note that shop_id and user_id are different numbers.
What happens to a bad id inside a Shopee batch call?▾
It fails on its own row and does not spoil the call. A measured batch of three, one of them a made-up item id, returned summary requested 3, ok 2, not_found 1, with the bad row carrying its own NOT_FOUND error object while the two good products came back in full. meta.record_count reported 2, the delivered count, and billing follows that same number rather than what you asked for.
What stock and sales numbers do I actually get?▾
The product action gives per-variant stock as a real count, with stock_source stating how the product-level figure was reached - sum_of_variant_stock on a measured item totaling 10. shop_showcase is coarser: its stock_raw was 1 alongside in_stock true, so treat that as a flag rather than a count. Sales come from showcase as two separate numbers, sold_recent 129 for the rolling recent window and sold_historical 1000 for the lifetime figure.
What is the Shopee API?▾
Shopee API is a ReefAPI endpoint group for southeast-asian marketplace products, variants, sellers and shop vouchers. It returns live JSON through POST requests under /shopee/v1.
Is the Shopee API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Shopee calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Shopee login or account?▾
No login to Shopee is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Shopee data?▾
The page example is captured from a live product call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Shopee API use?▾
Shopee actions currently cost 1-3 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Shopee from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call shopee actions with the same key, credit pool and JSON envelope used by normal REST requests.
37 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Shopee, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.