Search Tokopedia and read Indonesian marketplace prices as JSON
The Tokopedia API returns product, shop and review data from Indonesia's largest e-commerce marketplace as clean JSON.
5 active endpoints. Every call is 1 credit.
- POST/tokopedia/v1/search
- POST/tokopedia/v1/detail
- POST/tokopedia/v1/shop
- POST/tokopedia/v1/shop_products
- POST/tokopedia/v1/reviews
What Tokopedia endpoints does ReefAPI ship?
5 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Tokopedia API
3 of 5 endpoints, ready to run
The listing feed: title, price in rupiah as both a formatted string and an integer, rating, units sold, the shop and its city, and the product URL every other call needs.
{ "ok": true, "meta": { "api": "tokopedia", "endpoint": "search", "mode": "live", "latency_ms": 1733.8, "record_count": 20, "cache_hit": false }, "data": { "products": [ { "product_id": "11946055467", "name": "Charger INNERGIE BY DELTA 180W Gaming Adaptor Laptop Universal T18", "url": "https://www.tokopedia.com/lenovo-authorized-surabaya/charger-innergie-by-delta-180w-gaming-adaptor-laptop-universal-t18?extParam=ivf%3Dfalse%26keyword%3Dlaptop+gaming%26search_id%3D20260828211807EFE937780E955709FP36%26src%3Dsearch", "image_url": "https://p16-images-sign-sg.tokopedia-static.net/tos-alisg-i-aphluv4xwc-sg/img/VqbcmM/2024/1/13/31a814f6-f0bb-4d89-b3d4-0dafe63f22d7.jpg~tplv-aphluv4xwc-white-pad-v1:200:200.jpeg?lk3s=97278606&x-expires=1787955487&x-signature=RyqKMi6TzngcYDYZAFhByi9%2FJAc%3D&x-signature-webp=7D86H0O%2BxZkOVQy0SQjCOoJbA38%3D", "price": "Rp1.735.000", "price_value": 1735000, "price_range": null, "rating": "5.0", "category": null, "sold": "8 terjual", "labels": [ "8 terjual", "Bisa COD", "Rp1.735.000" ], "shop": { "shop_id": "11599357", "name": "Lenovo Authorized Surabaya", "city": "Surabaya", "url": "https://www.tokopedia.com/lenovo-authorized-surabaya", "is_official": true, "is_power_badge": false } }, { "product_id": "103036951709", "name": "Redragon RANGER M910/ BLUDHOUND M617 Wired Gaming Mouse High Precision USB Mouse for PC Laptop", "url": "https://www.tokopedia.com/redragonindonesia/redragon-ranger-m910-bludhound-m617-wired-gaming-mouse-high-precision-usb-mouse-for-pc-laptop-1734397338185204829?extParam=ivf%3Dfalse%26keyword%3Dlaptop+gaming%26search_id%3D20260828211807EFE937780E955709FP36%26src%3Dsearch", "image_url": "https://p16-images-sign-sg.tokopedia-static.net/tos-alisg-i-aphluv4xwc-sg/3aceb4d7996242dd98fcfab4dbaa5717~tplv-aphluv4xwc-white-pad-v1:200:200.jpeg?lk3s=97278606&x-expires=1787955487&x-signature=xrUDymX57uYH9TdDZve7Vy5EFdA%3D&x-signature-webp=Dd6rvqCOEZbu%2Bh64T%2FJFpAe3Yxg%3D", "price": "Rp212.000", "price_value": 212000, "price_range": null, "rating": "5.0", "category": null, "sold": "11 terjual", "labels": [ "11 terjual", "Hemat s.d 3% Pakai Bonus", "56%" ], "shop": { "shop_id": "7496151954588993629", "name": "redragonindonesia", "city": "Bekasi", "url": "https://www.tokopedia.com/redragonindonesia", "is_official": true, "is_power_badge": false } }, { "product_id": "11674176169", "name": "Power Adaptor Charger Laptop INNERGIE Gaming Universal Original 180W 150W 130W 65W 45W", "url": "https://www.tokopedia.com/lindy-official/power-adaptor-charger-laptop-innergie-gaming-universal-original-180w-150w-130w-65w-45w-1731234857708193451?extParam=ivf%3Dtrue%26keyword%3Dlaptop+gaming%26search_id%3D20260828211807EFE937780E955709FP36%26src%3Dsearch", "image_url": "https://p16-images-sign-sg.tokopedia-static.net/tos-alisg-i-aphluv4xwc-sg/img/VqbcmM/2025/2/28/70a5e998-ee7d-48c8-b0f6-c652f9a12d32.jpg~tplv-aphluv4xwc-white-pad-v1:200:200.jpeg?lk3s=97278606&x-expires=1787955487&x-signature=3nWFs0TrY7edZI5r5VK9Ge%2BhG%2Fk%3D&x-signature-webp=9xZYBjUqI9s%2FjR1d2X6x9bKCSIs%3D", "price": "Rp1.516.800", "price_value": 1516800, "price_range": null, "rating": "5.0", "category": null, "sold": "29 terjual", "labels": [ "29 terjual", "Rp1.516.800", "Hemat s.d 3% Pakai Bonus" ], "shop": { "shop_id": "2431361", "name": "LINDY INDONESIA", "city": "Jakarta Barat", "url": "https://www.tokopedia.com/lindy-official", "is_official": true, "is_power_badge": false } } ] } }
How the Tokopedia API works
Tokopedia 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 184 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.
Search gives you the URL, and the URL is the key
Every deeper call on this engine is addressed by the product URL that search hands you, not by the numeric id sitting next to it. Two calls turn a keyword into a full product.
{"q": "laptop gaming", "page": 1}Take url from a row. The ?extParam= tail is a search-session tag and the call works with or without it.
{"url": "<the url from above>"}Stock, weight, spec rows, variants and the seller. The same URL is what the reviews action takes.
Two credits per product. The URL does not change, so a catalogue sync stores it once and only re-runs the second call.
curl -X POST https://api.reefapi.com/tokopedia/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"q":"laptop"}'{
"ok": true,
"data": { … },
"meta": {
"api": "tokopedia",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}The same product field is a different type in search than in detail
Tokopedia renders its search cards and its product page from different sources, and the engine passes both through as they arrive rather than guessing a normalized value. That means several fields you would expect to match do not: sold is a localized Indonesian phrase on a search row and a bare number on a detail record, and rating is a string in one and a number in the other. Read the column for the action you are actually calling. Every response carries meta.locale id-ID and meta.currency IDR.
| Field | What search returns | What detail returns |
|---|---|---|
| price / price_value | "Rp1.735.000" (the dot is a thousands separator) and 1735000 | the same pair, always whole rupiah with no cents |
| rating | string, "5.0", and null when the product has no rating yet | number, 5 |
| sold | Indonesian phrase, "8 terjual"; banded once it is large, "50+ terjual" | plain numeric string, "8" |
| review_count / view_count / talk_count | not present on a search row | strings, not numbers: "3", "0", "0" |
| category | null on every row measured | category_breadcrumb[] of {id, name}, leaf first |
| condition | the filter takes lowercase new or used | returned uppercase, "NEW" |
| shop | {shop_id, name, city, url, is_official, is_power_badge} | {shop_id, name} only |
| stock / weight | not present | stock 6, weight 2.5 with weight_unit "KILOGRAM" |
| labels[] | the badge strip as printed: ["8 terjual", "Bisa COD", "52%"] | not present |
product_id is a numeric string but its length varies a lot: 11946055467 and 103077211933 were both live ids in the same result set. Do not validate it by length, and do not store it as an integer in a language that narrows large ints.
One market, one currency, and how a product is addressed
Measured against the live marketplace on a single query paged from 1 to 370, and re-measured after detail changed its input. One of these goes against us.
Every response carries its own locale and currency stamp — id-ID and IDR — so you never have to infer it. Every row carries the price twice: price as the formatted Indonesian string and price_value as a plain integer to compute on.
20 of 20 rows priced on each page we opened. Two fields are consistently empty on search rows and it is worth knowing before you map them: category and price_range came back null on all 20. The category breadcrumb is on the detail call.
The schema no longer offers product_id on detail at all — it never resolved, and advertising a parameter that always fails is worse than not having it. Calling detail without a url now answers MISSING_PARAM naming url, immediately and for free, rather than going upstream first. The numeric id has not disappeared: reviews still takes product_id and it works. Address detail by the row's url, and drop everything from the ? onward if you like — that tail is only Tokopedia's own click tracking.
A product URL for a listing that no longer exists answers NOT_FOUND with retryable false and a message saying the product was removed or never existed. It used to arrive as a retryable upstream error, which meant a sync could re-buy the same permanent answer forever. Two dead URLs, two identical closed verdicts. Delete the row rather than queueing it.
20 products a page. Pages 10, 50, 200 and 300 all returned fresh rows with no overlap on page 1; page 330 and everything past it returned zero, on a query whose own reported total was 38,781. So the reachable depth is roughly 6,000 products per query, and a narrow query reaches more of what you want than a broad one does.
Two runs of one query, minutes apart, returned the identical set of 20 product ids in the same order. Page numbers are stable anchors here, which is not true of every engine in this category.
The reviews action returns the star rating, the text, the variant bought, the relative date, photos and videos, likes and the seller's reply — and the author comes back null. The count in meta matched the rows exactly on the product we opened.
What people build with Tokopedia
The jobs this data is most often used for.
endpoints
credit per call
Pricing teams call search to track competitor prices and units-sold across Tokopedia categories.
Brand-protection tools use shop_products to audit every listing from a specific seller.
Catalog-enrichment workflows pull detail and reviews to fill product pages with live marketplace data.
What Tokopedia 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 184 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/tokopedia/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"q":"laptop"}'import requests
r = requests.post(
"https://api.reefapi.com/tokopedia/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"q": "laptop"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Tokopedia.
Get a free key →Why does detail not take the product_id that search just gave me?▾
Because a bare numeric id is not addressable on Tokopedia, and detail no longer pretends otherwise: product_id has been removed from that action's schema, so a call without a url now answers MISSING_PARAM naming url, immediately and without going upstream. Take the url straight from the search row; you can drop everything from the ? onward, since the query string is only Tokopedia's click tracking. reviews is the exception and still accepts product_id, because there it works.
What exactly does sold mean, and is it a number?▾
It is Tokopedia's units-sold badge, and on a search row it is text, not a number. Measured values include "8 terjual", "29 terjual" and "50+ terjual" - terjual is Indonesian for sold, and the plus sign means Tokopedia has stopped reporting the exact figure and banded it. The detail action gives you the same product as a plain numeric string ("8"), so if you need arithmetic, read it there, or parse the leading digits and treat a trailing plus as a floor rather than an exact count.
Are prices integer rupiah, and can they have decimals?▾
price_value is a whole-rupiah integer - 109000 for Rp109.000, 1423056 for Rp1.423.056 - because the rupiah has no practical subunit in retail pricing. The companion price field is the display string Tokopedia prints, where the dot is a thousands separator, not a decimal point. Parsing "Rp1.735.000" as a float in a locale that reads dots as decimals gives you 1.735 rupiah. Use price_value for anything numeric.
Why did reviews come back empty when detail said review_count 3?▾
Tokopedia's review widget and the counter on the product page are fed separately, and the widget can return nothing for a product whose counter is non-zero. A measured call against a product whose detail reported review_count "3" returned ok:true, meta.total 0 and an empty reviews list, with stop_reason "complete" - so it is a real empty result, not a truncated page. Treat review_count as a page-level hint and meta.total on the reviews action as the number you can actually fetch.
What happens when search hands me a url whose product has been delisted?▾
You get NOT_FOUND with retryable false and a message saying the product was removed or never existed. Tokopedia's search index keeps serving delisted listings for a while, so a url that came out of a fresh search can already be dead - three of the first four best-selling results for one keyword behaved that way. That answer used to arrive as a retryable upstream error, which meant a sync could keep re-buying a permanently negative result; it is now a closed verdict. Delete the row rather than queueing it.
How many products can I page through for one keyword?▾
20 per page, with page running from 1 to 100, so 2,000 rows is the ceiling per query no matter how large meta.total is - "laptop gaming" reported total 38,583. meta.has_more and meta.next_page tell you when to stop. To go deeper, narrow with price_min / price_max, condition or rating and run several queries, or use shop_products, which walks a single seller's catalog exhaustively.
What do the numbers on a shop profile actually count?▾
They are lifetime store totals, not current inventory. A measured profile returned active_product_count 95 (what is listed right now) against product_sold 597,775 and transaction_success 287,109 (both since the shop opened), plus total_favorite 36,072, which is the follower count rather than a like count. open_since is an English month-and-year string ("July 2014"), location / city / district split the address, and status is a numeric code (1 on an open shop) alongside the is_open boolean.
What date format do reviews use?▾
Two fields, and only one is machine-readable. date is the Indonesian relative phrase Tokopedia prints - "2 minggu lalu" (2 weeks ago), "3 bulan lalu" (3 months ago) - while date_raw is a Unix epoch in seconds delivered as a string ("1785992410"). Sort and store on date_raw. Also expect author, author_id and author_url to be null whenever is_anonymous is true, which was the case for every review measured; shop_reply carries the seller's canned response when there is one.
What is the Tokopedia API?▾
Tokopedia API is a ReefAPI endpoint group for tokopedia It returns live JSON through POST requests under /tokopedia/v1.
Is the Tokopedia API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Tokopedia calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Tokopedia login or account?▾
No login to Tokopedia 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 Tokopedia data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Tokopedia API use?▾
Tokopedia actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Tokopedia from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call tokopedia actions with the same key, credit pool and JSON envelope used by normal REST requests.
35 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Tokopedia, 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 183 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.