Tokopedia API

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.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Tokopedia endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
T
/tokopedia/v1

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.

5 endpoints

search

1 cr

Search Tokopedia products by keyword with optional price / condition / rating filters and sort.

required
q
optional
page, sort, price_min, price_max, condition, rating

detail

1 cr

Full product detail by product_id (or product url).

required
optional
product_id, url

shop

1 cr

Store/shop profile by shop domain (the tokopedia.com/<shop> handle).

required
shop
optional

shop_products

1 cr

Paginated product catalog of one shop by shop domain.

required
shop
optional
page, sort

reviews

1 cr

Paginated public product reviews by product_id (or url).

required
optional
product_id, url, page, sort_reviews, filter_rating

Every parameter, every allowed value →

Tokopedia API

3 of 5 endpoints, ready to run

View docs ↗

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.

1 credit1 required · 4 optional
POST/tokopedia/v1/search
ok4169 ms · 20 records · sample
{
  "ok": true,
  "meta": {
    "api": "tokopedia",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 4168.6,
    "record_count": 20,
    "cache_hit": false
  },
  "data": {
    "products": [
      {
        "product_id": "103077211933",
        "name": "Speaker Desktop K2060 RGB Audio Gaming Office | Suara Surround untuk Komputer Laptop PC",
        "url": "https://www.tokopedia.com/unitechofficial/speaker-desktop-k2060-rgb-audio-gaming-office-suara-surround-untuk-komputer-laptop-pc-1734490097367876803?extParam=ivf%3Dfalse%26keyword%3Dlaptop+gaming%26search_id%3D20260828173134955AF57E49455502E7D0%26src%3Dsearch",
        "image_url": "https://p16-images-sign-sg.tokopedia-static.net/tos-alisg-i-aphluv4xwc-sg/dd484077bf584ee2817c58281788c649~tplv-aphluv4xwc-white-pad-v1:200:200.jpeg?lk3s=97278606&x-expires=1787941894&x-signature=%2FfiKtuJEtg41UgZGQdXJ2dgVbOQ%3D&x-signature-webp=6T5cu%2FgDGQhOrZeox7ED%2FMS18JU%3D",
        "price": "Rp109.000",
        "price_value": 109000,
        "price_range": null,
        "rating": "5.0",
        "category": null,
        "sold": "8 terjual",
        "labels": [
          "8 terjual",
          "Hemat s.d  3% Pakai Bonus",
          "52%"
        ],
        "shop": {
          "shop_id": "191075",
          "name": "Unitech Shop_NEW",
          "city": "Jakarta Utara",
          "url": "https://www.tokopedia.com/unitechofficial",
          "is_official": true,
          "is_power_badge": false
        }
      },
      {
        "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%3D20260828173134955AF57E49455502E7D0%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=1787941894&x-signature=LTH%2FP%2FvGBs7a7FU3kFgfJVyo8KY%3D&x-signature-webp=Ew8Yz5%2B5dLvhAapK8igLyY8eWKs%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%3D20260828173134955AF57E49455502E7D0%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=1787941894&x-signature=7uAVIgkHLwjVJVWo9T3Abm6UGsA%3D&x-signature-webp=sopocFjFbEjG9%2FW5MKUfuNqXK40%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
        }
      }
    ]
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Tokopedia API works

Tokopedia is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /tokopedia/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01search
POST/tokopedia/v1/search
{"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.

02detail
POST/tokopedia/v1/detail
{"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.

request
curl -X POST https://api.reefapi.com/tokopedia/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"q":"laptop"}'
response envelope
{
  "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.

FieldWhat search returnsWhat detail returns
price / price_value"Rp1.735.000" (the dot is a thousands separator) and 1735000the same pair, always whole rupiah with no cents
ratingstring, "5.0", and null when the product has no rating yetnumber, 5
soldIndonesian phrase, "8 terjual"; banded once it is large, "50+ terjual"plain numeric string, "8"
review_count / view_count / talk_countnot present on a search rowstrings, not numbers: "3", "0", "0"
categorynull on every row measuredcategory_breadcrumb[] of {id, name}, leaf first
conditionthe filter takes lowercase new or usedreturned uppercase, "NEW"
shop{shop_id, name, city, url, is_official, is_power_badge}{shop_id, name} only
stock / weightnot presentstock 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 where the ids stop working

Measured against the live marketplace on a single query paged from 1 to 370. Two of these go against us.

One market: Indonesia, rupiah, and the response says so

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.

Price on every row

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.

Against us: detail will not take the numeric id

The product_id in a search row does not resolve on its own — the detail action rejects it and asks for the URL, and the id published as an example in the schema is rejected the same way. Address every deeper call by the row's url. Knowing this costs nothing; finding it out in production costs a rewrite.

Against us: a removed listing comes back marked retryable

A product URL for a listing that no longer exists answers an upstream HTTP 410 — the status that specifically means gone — and the envelope marks it retryable. The 410 is the answer. Treat it as a closed row rather than putting it in a retry queue.

Paging runs to about six thousand of a much larger count

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.

The same query twice returns the same twenty rows

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.

Reviews are anonymous at the source

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.

5

endpoints

1

credit per call

01

Pricing teams call search to track competitor prices and units-sold across Tokopedia categories.

02

Brand-protection tools use shop_products to audit every listing from a specific seller.

03

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 →
$0.67–$1.50 / 1,000 credits
  • 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
curl -X POST https://api.reefapi.com/tokopedia/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"q":"laptop"}'
python
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"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Tokopedia.

Get a free key →
Why does detail reject the product_id that search just gave me?

Because a bare numeric id is not addressable on Tokopedia. Calling detail with product_id 103077211933 returns INVALID_PARAM with the message "detail needs the product 'url' (tokopedia.com/<shop>/<slug>). A bare numeric product_id cannot be resolved to a page on its own." The same applies to reviews. 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.

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.

Why does detail or reviews return UPSTREAM_HTTP "Tokopedia returned HTTP 410"?

410 Gone is Tokopedia's answer for a product page that has been delisted. Its search index keeps serving those listings for a while, so search can hand you a url whose page no longer exists - three of the first four best-selling results for one keyword behaved that way on 2026-08-26. The error is flagged retryable, but 410 is a decision rather than a hiccup: repeat calls on the same url returned 410 every time. Skip the row instead of retrying 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.

37 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.

0/4000

No account needed · we reply from [email protected]

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.