Coupang API & Scraper
The Coupang API returns South Korea's largest e-commerce marketplace as clean JSON, in two actions: search and product.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
A search takes a keyword in Korean or English and returns up to 60 rows, each carrying the item id, the product id, the vendor item id, the product url, the Korean title, the price as a whole number of won with Coupang's own formatted string beside it, the list price and discount percentage where Coupang shows one, whether it is in stock, the rating and review count, the shipping terms, the promised delivery date, the cash-reward line, whether the row is a sponsored placement, and the thumbnail. Read two limits before you build against it. First, the product action is NOT a product-detail action: Coupang does not serve its product page to unauthenticated callers, so product answers by asking Coupang's own index for the id and returns search-grade fields - the title, price, list price, discount, stock, rating, review count, thumbnail, shipping and delivery date, complete and correct. It does not return the description, the specification table, an image gallery, a seller or vendor name, the variant attribute list, the stock quantity, the category path or any review text, because Coupang publishes none of those where we can read them. Second, one Coupang product id covers several sellable ITEMS at different prices, so item_id is the unique key; product returns every item under the id in items[], names the top-ranked one as item, and adds price_range{min,max,currency} when they differ. The build measured 72 of 72 calls succeeding over 35.6 minutes with zero failures, and cross-checked the published price against Coupang's own structured data on the same query in the same minute: 278 of 279 agree, 99.6 percent. No Coupang account and no login of yours anywhere in the path - one ReefAPI key and the standard { ok, data, meta, error } envelope.
A Coupang product id is not a row, and it is not a price
This is the thing to understand before you write the first line of code against Coupang, and it is the thing that quietly corrupts a price dataset if you get it wrong. Coupang lists each sellable variant of a product - the 160-count box, the 210-count box, the 400-count box - as its OWN row, at its own price, under the SAME product id. So a search page of 60 rows does not contain 60 products, and keying your store on product_id silently overwrites one variant's price with another's. item_id is the unique key. Every line below was counted on a real result page.
| Search keyword | Rows on the page | Distinct product_id | Distinct item_id |
|---|---|---|---|
| 커피 (coffee) | 60 | 45 | 59 |
| 향수 (perfume) | 60 | 49 | 58 |
| 마우스 (mouse) | 60 | 53 | 58 |
| 샴푸 (shampoo) | 60 | 45 | 54 |
| 냉장고 (refrigerator) | 60 | 51 | 58 |
| 무선이어폰 (wireless earphones), live 2026-09-07 | 55 | 48 | 55 |
What that costs you in money terms: product id 8328233204 is one coffee product, and its items priced at 4,010 / 5,700 / 5,990 / 6,250 / 6,270 / 8,550 won and upward for different pack sizes - the same rating and the same 719,000-odd reviews on every one of them. Called live on 2026-09-07 the same id returned 52 items spanning 4,010 to 168,500 won. That is why the product action returns items[] in full and publishes price_range{min,max,currency} instead of picking one number and calling it the price.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/coupang/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "무선이어폰"
}
}{
"ok": true,
"meta": {
"api": "coupang",
"endpoint": "search",
"mode": "live",
"latency_ms": 4601.1,
"record_count": 55,
"bytes": 2281416,
"cache_hit": false
},
"data": {
"items": [
{
"item_id": "29077234874",
"product_id": "9717123234",
"vendor_item_id": "90216930268",
"name": "[샥즈 쿠팡 세트 국내 정품] OpenRun Pro 2 Mini 샥즈 오픈런 프로 2 미니 S821 골전도 이어폰 미니사이즈, 블랙-BK",
"url": "https://www.coupang.com/vp/products/9717123234?itemId=29077234874&vendorItemId=90216930268&sourceType=srp_product_ads&clickEventId=fd387400-aa35-11f1-b498-e7492ea111f8&korePlacement=15&koreSubPlacement=1&clickEventId=fd387400-aa35-11f1-b498-e7492ea111f8&korePlacement=15&koreSubPlacement=1",
"price": 236550,
"price_display": "236,550",
"currency": "KRW",
"list_price": 249000,
"discount_percent": 5,
"in_stock": true,
"sold_out_text": null,
"low_stock": null,
"rating": 5,
"review_count": 1193,
"rating_scale": null,
"rating_ratio": 100,
"seller": null,
"brand": null,
"shipping": "무료배송",
"delivery_eta": "내일(화) 도착 보장",
"cash_reward": "최대 11,828원 적립",
"is_sponsored": true,
"image": "https://thumbnail.coupangcdn.com/thumbnails/remote/320x320ex/image/vendor_inventory/0615/505da5a665b7d018e40e84ced40c93339e7aead8bde97ed15b2aca7e6984.png",
"rank": 0
},
{
"item_id": "28745334719",
"product_id": "9625292118",
"vendor_item_id": "95768226505",
"name": "KONLI 귀걸이형 무선 블루투스 이어폰 오픈형 운동용 초경량 고음질, 블랙, S9",
"url": "https://www.coupang.com/vp/products/9625292118?itemId=28745334719&vendorItemId=95768226505&sourceType=srp_product_ads&clickEventId=fd389b10-aa35-11f1-84b8-8c7b424bd11e&korePlacement=15&koreSubPlacement=5&clickEventId=fd389b10-aa35-11f1-84b8-8c7b424bd11e&korePlacement=15&koreSubPlacement=5",
"price": 24900,
"price_display": "24,900",
"currency": "KRW",
"list_price": 139000,
"discount_percent": 82,
"in_stock": true,
"sold_out_text": null,
"low_stock": null,
"rating": 5,
"review_count": 969,
"rating_scale": null,
"rating_ratio": 100,
"seller": null,
"brand": null,
"shipping": "무료배송",
"delivery_eta": "내일(화) 도착 보장",
"cash_reward": "최대 1,245원 적립",
"is_sponsored": true,
"image": "https://thumbnail.coupangcdn.com/thumbnails/remote/320x320ex/image/vendor_inventory/207f/7a0bc688e7f9680a5a496ced3cc6bce9740666b0d046122a6408ff94e148.jpg",
"rank": 1
},
{
"item_id": "28798747378",
"product_id": "8082654809",
"vendor_item_id": "95768196637",
"name": "KONLI 노이즈 캔슬링 커널형 무선 블루투스 이어폰 방수, 블랙, T12",
"url": "https://www.coupang.com/vp/products/8082654809?itemId=28798747378&vendorItemId=95768196637&q=무선이어폰&searchId=0f2e3704283598&sourceType=search&itemsCount=59&searchRank=2&rank=2",
"price": 15900,
"price_display": "15,900",
"currency": "KRW",
"list_price": 91000,
"discount_percent": 82,
"in_stock": true,
"sold_out_text": null,
"low_stock": null,
"rating": 4.5,
"review_count": 29108,
"rating_scale": null,
"rating_ratio": 90,
"seller": null,
"brand": null,
"shipping": null,
"delivery_eta": "내일(화) 도착 보장",
"cash_reward": "최대 795원 적립",
"is_sponsored": false,
"image": "https://thumbnail.coupangcdn.com/thumbnails/remote/320x320ex/image/vendor_inventory/8428/fde3b7380c684a8e88b510ec5d1faf654ecea2ed3cd06db342b025852d3f.jpg",
"rank": 2
}
],
"count": 55,
"possible_no_match": false,
"page_limit_reached": false,
"filters": {
"query": "무선이어폰"
}
}
}What the Coupang API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search Coupang by keyword, in Korean or English, optionally narrowed by price range and to Coupang's own rocket-delivery inventory, and sorted by price, recency or sales. Every row carries the item and product ids, the product url, the title, the price as a number in KRW with the formatted string beside it, the list price and the discount percentage where Coupang shows one, the rating and review count on almost every row (99.0% of 420 measured rows; a brand-new listing has neither), whether it is in stock, the promised delivery date, the shipping terms where Coupang states them (94.0% of the same 420 rows), and whether the row is a sponsored placement. 🔴 ONE PAGE ONLY: Coupang's search route serves up to 60 rows and its own pagination is broken (page 2 comes back empty and offset silently repeats page 1), so there is no page parameter and no way past 60 - narrow the keyword or the price range instead. 🔴 Coupang never answers a search with an empty page: a keyword it cannot match is answered with 60 unrelated recommendations and Coupang publishes no flag saying so, so this endpoint derives one - see `possible_no_match`. 🔴 One product id can appear on several rows: Coupang lists each sellable variant (pack size, colour) as its own row at its own price, so `item_id` is the unique key, not `product_id`. | Pricing teams call search to search Coupang by keyword, in Korean or English, optionally narrowed by price range and to Co…. | query, sort, price_min, price_max, rocket_delivery, ... |
| product | Look up ONE Coupang product by id - search-grade fields. 🔴 Read this before you call it: Coupang's product-detail page is closed to unauthenticated clients, so this action answers by asking Coupang's own search index for the id. That means you get exactly the fields a search card carries, complete and correct, and NOT a full product record. You DO get: the title, the price as a number in KRW, the list price and discount, the currency, whether it is in stock, the rating and review count, the thumbnail, the shipping terms and promised delivery date, and the item / vendor-item ids. You do NOT get: the product description, the specification table, the image gallery (one thumbnail only), the seller or vendor name, the option/variant attribute list, the stock quantity, the category path, or any review text - Coupang does not publish any of those on the surface that is open to us. 🔴 A Coupang product id covers several sellable items at DIFFERENT prices (one coffee product measured at 4 010 / 5 700 / 5 990 / 6 250 / 6 270 / 8 550 KRW for different pack sizes), so this action returns EVERY item Coupang lists under the id in `items[]` and names the one Coupang ranks first as `item` - use `items[]` if you need the cheapest or a specific pack. A dead or invented id returns NOT_FOUND rather than the recommendations Coupang backfills with. | Marketplace operators call product to look up ONE Coupang product by id - search-grade fields. | product_id, max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/coupang/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"무선이어폰"}'import requests
r = requests.post(
"https://api.reefapi.com/coupang/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "무선이어폰"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/coupang/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "무선이어폰"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.coupang.search with {"query":"무선이어폰"}.Who uses this API and why
- Korean-market pricing teams track a keyword's whole visible page in one call, keyed on item_id so each pack size keeps its own price rather than colliding on the product id.
- Cross-border sourcing and arbitrage tools compare a product's Korean won price and its discount against their home market, using price_range to see the cheapest sellable pack under one id.
- Retail and logistics analysts read the rocket-delivery filter, the shipping strings and the promised delivery date to see which listings Coupang is fulfilling itself and how fast it is promising them.
- Marketplace and ad researchers count the sponsored placements on a page, since is_sponsored is on every row, and use possible_no_match to drop the keywords Coupang answered with recommendations instead of results.
Questions developers ask before integrating
Does the product action return the description, specs and images?
No, and you should know that before you build rather than in production. Coupang does not serve its product-detail page to unauthenticated callers, so this action answers by asking Coupang's own index for the id and gives you exactly what a search card carries: the title, the price as a number in won, the list price and discount, the currency, whether it is in stock, the rating and review count, one thumbnail, the shipping terms, the promised delivery date and the item and vendor-item ids. What you do NOT get is the product description, the specification table, an image gallery beyond that one thumbnail, the seller or vendor name, the option and variant attribute list, the stock quantity, the category path, and any review text. Those are not fields we dropped; Coupang does not publish them on the surface that is open to us, and no parameter or plan turns them on.
Why would a search return 60 results for a keyword that matches nothing?
Because Coupang never answers a search with an empty page. A keyword it cannot match comes back as 60 unrelated recommendations, and Coupang publishes no flag anywhere in that response saying so - measured on 15 nonsense keywords, every single one returned 60 rows. So this endpoint derives its own flag, possible_no_match, and the response says plainly that the flag is OURS and not Coupang's. It was validated on 22 real and 15 nonsense queries: 36 of 37 correct, and 0 false positives on the 22 real ones, so it never wrongly tells you your good results are junk. Two signals were tried first and rejected on measurement: title relevance fails because a real search for airpods returns Korean titles reading 에어팟 and scores zero, and response size fails because a genuinely narrow real query is smaller than a junk page. Check possible_no_match before you trust a result set.
Why do two rows share the same product_id?
Because Coupang lists each sellable variant as its own row. Counted on real pages: a coffee search returned 60 rows with only 45 distinct product ids and 59 distinct item ids; perfume 60 rows and 49 product ids; shampoo 60 rows and 45. The sibling rows are different pack sizes or colours and their prices genuinely differ - one coffee product's items run 4,010 / 5,700 / 5,990 / 6,250 / 6,270 / 8,550 won - while the rating and review count are shared across all of them. item_id is the unique key. If you key a price table on product_id you will overwrite one pack size's price with another's and never see an error.
How do I get page 2?
You cannot, and the endpoint says so rather than offering a parameter that does nothing. Coupang's own pagination is broken in two different directions: asking for page 2 returns a 200 with zero rows, and asking for an offset of 60 returns a full page that overlaps the first page on 57 of 60 rows, which is page 1 handed back silently. Asking for a bigger page size returns exactly 60 rows regardless. So there is no page, offset or page_size parameter here at all, the ceiling is one page of up to 60 rows, and the response carries page_limit_reached so you can see when you hit it. The way to reach more of Coupang is to narrow: a tighter keyword, a price band, or the rocket-delivery filter, run as several searches.
Why is the seller always null?
Because Coupang publishes no seller identity at all on the surface open to us - not a name, not an id, nothing. That was established by looking rather than assumed: the seller-name, vendor-name, store-name and shop-name keys occur zero times across the payload, and a deep walk of full records found no seller path of any kind. So seller comes back as an explicit null rather than as an object of empty strings, and re-checked live on 2026-09-07 it was null on 231 of 231 search rows across four queries and on 52 of 52 items of a product lookup. Two neighbouring fields are null for their own honest reasons. rating_scale is null because Coupang publishes no maximum anywhere, in any surface, and a scale that is inferred from the ratings you happen to have seen is a guess wearing a number; what Coupang does publish is the rating as a percentage, which is passed through as rating_ratio. brand is null on almost everything - it exists on 1 row in 420, Coupang's R.LUX luxury listings - and it is passed through where it is there rather than filled in from the title.
Is the price the same number Coupang's own page shows?
It was cross-checked against a second source rather than trusted. The price this endpoint publishes was compared with the structured data Coupang embeds in its own page, for the same query, fetched in the same minute, matched row by row on the item id: 278 of 279 agree, 99.6 percent. The single disagreement was a refrigerator whose price moved between the two calls. Matching on the PRODUCT id instead produced 37 apparent disagreements, which is not a parse error but the variant problem above - the two sources were being asked about two different pack sizes of the same product. Prices are whole won integers with no decimals, currency is KRW on every row, and price_display carries Coupang's own formatted string beside the number so you never have to parse one to get the other.
Which filters and sorts actually change the results?
Only the ones that beat a noise floor that was measured first. The same query run four times returns a page that overlaps ITSELF on 54 to 56 rows out of 60, so anything sharing more than about 45 rows with an unfiltered control has not been proven to do anything at all. Against that bar: sorting by newest overlaps 3 of 60, most expensive first 5 of 60, cheapest first 12 of 60, best-selling 31 of 60, and a price band 19 of 60 with 55 of 59 rows landing inside the band - the bound is approximate and the widest stray was 22,400 won against a 20,000 ceiling, which is documented on the parameter rather than hidden. The rocket-delivery filter overlaps 38 of 60 and the rows come back carrying Coupang's own 로켓 and 와우 shipping strings. A minimum-rating filter was tried and NOT shipped: it stayed inside the noise floor and a request for 4.5 and above returned a row below 4.5. One trap worth knowing: Coupang silently ignores a sort value it does not recognise, so this endpoint rejects an unknown one with INVALID_PARAM rather than running a search whose sort never applied.
Do I have to search in Korean?
No. Coupang's own index does the matching and an English brand term works - airpods, canon, lg gram all return Korean-titled Korean listings. What comes back is Korean either way: the titles, the shipping strings and the delivery dates are Coupang's own Korean text, passed through verbatim rather than machine-translated into something that looks tidier and means something else. Prices are always KRW, because Coupang is a single-market marketplace and there is no country or currency parameter to set.
What is the Coupang API?
Coupang API is a ReefAPI endpoint group for south korea's biggest marketplace: keyword search, prices in won, ratings and delivery. It returns live JSON through POST requests under /coupang/v1.
Is the Coupang API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Coupang calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Coupang login or account?
No login to Coupang 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 Coupang 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 Coupang API use?
Coupang 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 Coupang from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call coupang actions with the same key, credit pool and JSON envelope used by normal REST requests.