Kurly Scraper — Market Kurly Grocery Prices, Rankings & Search
Pricing
from $2.50 / 1,000 results
Kurly Scraper — Market Kurly Grocery Prices, Rankings & Search
Scrape Market Kurly (kurly.com), Korea premium grocery & food store. Best-seller rankings, keyword search and category listings as clean JSON: product name, KRW price, sale price, discount rate, sold-out status, image and URL. For K-food market research, price monitoring and AI agents.
Pricing
from $2.50 / 1,000 results
Rating
0.0
(0)
Developer
Seok June Park
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Market Kurly Scraper 🛒
Scrape keyword search, category listings, and best-seller rankings from Market Kurly (마켓컬리) — Korea's leading premium grocery and fresh-food e-commerce platform. Get clean, structured product data (name, KRW price, sale price, discount rate, sold-out status, review volume, image, product URL) in JSON, CSV, or Excel.
Built for K-food market researchers, price-monitoring teams, and sourcing analysts who need to track what is actually selling in Korea's premium grocery market.
Try it free. Apify's free plan includes $5 of monthly platform credit — roughly 2,000 results from this actor, no credit card required. Set your input, click Start, and export JSON/CSV/Excel.
🚀 What it does
Give it a mode and a query and it returns a structured product feed:
| Mode | What you get | Example input |
|---|---|---|
search | Products matching a keyword, paginated & sortable | { "mode": "search", "query": "우유" } |
category | Products in a top-level category | { "mode": "category", "query": "과일·견과·쌀" } |
ranking | A category's best-seller (sales-volume) ranking, with rank | { "mode": "ranking", "query": "018" } |
Data comes straight from Market Kurly's own public JSON API (api.kurly.com,
the same endpoints the website's front-end calls) — so it is fast and reliable,
no brittle HTML scraping.
Category names → codes (pass either the name or the code as query):
| Code | Category | Code | Category |
|---|---|---|---|
907 | 채소 (Vegetables) | 914 | 생수·음료 (Water & Drinks) |
908 | 과일·견과·쌀 (Fruit / Nuts / Rice) | 383 | 커피·차 (Coffee & Tea) |
909 | 수산·해산·건어물 (Seafood) | 249 | 간식·과자·떡 (Snacks) |
910 | 정육·가공육·달걀 (Meat & Eggs) | 915 | 베이커리 (Bakery) |
911 | 국·반찬·메인요리 (Sides & Meals) | 018 | 유제품 (Dairy) |
912 | 간편식·밀키트·샐러드 (Meal Kits) | 032 | 건강식품 (Health Food) |
913 | 면·양념·오일 (Noodles / Sauce / Oil) | 722 | 와인·위스키 (Wine & Whisky) |
(Full list — including non-food categories like 뷰티, 생활용품, 반려동물 — is in
src/constants.js.)
📥 Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | search | search, category, or ranking. |
query | string | — | Keyword (search) or category name/code (category & ranking). Required. |
maxItems | integer | 100 | Max products to return across pages. |
sort | string | RECOMMENDED | RECOMMENDED, NEWEST, BEST_SELLING, BENEFIT, PRICE_LOW, PRICE_HIGH. (ranking mode forces best-selling order.) |
enrichBrand | boolean | false | Fetch brand + exact review_count per product (slower — one extra request each). See note below. |
proxyConfiguration | object | RESIDENTIAL | Apify proxy. Korea RESIDENTIAL recommended. |
Input example — top dairy products by sales, with brand names:
{"mode": "ranking","query": "018","maxItems": 100,"enrichBrand": true}
📤 Output
Each product is one dataset record (real sample from a live run, enrichBrand on):
{"source": "kurly","product_id": "5097217","name": "[매일] 바이오 그릭 요거트 무가당 플레인 400g","brand": "매일유업","price_krw": 4680,"sale_price_krw": 3780,"discount_rate": 19,"category": "category/018","is_sold_out": false,"review_count_text": "9,999+","review_count": 79324,"rank": 1,"url": "https://www.kurly.com/goods/5097217","image_url": "https://product-image.kurly.com/product/image/22702b7a-669f-4e3d-9c2b-4c828993b200.jpg","scraped_at": "2026-07-09T13:24:27.539+09:00"}
Field notes (read this — honesty matters)
price_krw— the list price in KRW.sale_price_krw— the discounted price when the product is on sale, otherwisenull.discount_rate— integer percent (0 when not discounted). These populate reliably in every mode.is_sold_out— boolean. Populates reliably.review_count_text— a bucketed label exactly as Kurly shows it in list views (e.g."999+","9,999+"). It is not an exact number; it is surfaced as text so it is never mistaken for one. Populates reliably.brandand exact numericreview_count— only populated whenenrichBrand: true(they are not present in Kurly's list API and require one extra product-detail request each). WithenrichBrandoff, both arenull. Even with it on, a few third-party products have no registered brand (null).rank— 1-based position within the returned ordering. Inrankingmode this is the best-seller position.- A full 25-record sample lives in samples/sample-output.json.
💡 Use cases
- K-food & grocery market research — see what is trending in Korea's premium grocery market by category and sales rank.
- Price & promotion monitoring — track KRW prices, sale prices, and discount rates on hero SKUs over time.
- Sourcing / import scouting — find high-selling Korean grocery products with images and URLs ready to evaluate.
- AI agents & LLM pipelines — feed a clean JSON grocery catalog into RAG or a shopping assistant.
- Competitive intelligence — monitor best-seller ranking shifts across categories.
🌐 Data source & proxy
This actor targets Market Kurly (www.kurly.com / api.kurly.com), reading
only the storefront's public search, category, and product JSON APIs. Prices
and names are in Korean / KRW (this is the Korean-domestic storefront).
⚠️ Use Apify RESIDENTIAL (Korea) proxy. Kurly's CDN/WAF can rate-limit or geo-filter non-Korean and datacenter IPs. The default input keeps
RESIDENTIALproxy enabled — leave it on. Every request also falls back to a direct connection if the proxy tunnel fails, so a bad proxy never silently kills a run. If a challenge page is returned instead of JSON, the run fails with a clear "Blocked by anti-bot" error.
⚖️ Rate & legality note
- Only public, non-personal catalog data is collected — product listings that anyone can browse without logging in. No customer, reviewer, or seller personal data (no nicknames, profiles, IDs, phone numbers) is ever scraped. Reviews are represented only as an aggregate count.
- Requests are rate-limited (sequential pages, ≥ 500 ms delay) to stay light on the site.
- You are responsible for complying with Market Kurly's Terms of Service and applicable law in your jurisdiction. Use the data for research, monitoring, and analytics — not to replicate the storefront.
❓ FAQ
Is it legal to scrape this data? This actor collects only public, non-personal catalog data — the same product listings any visitor sees on Market Kurly without logging in. No customer, reviewer, or seller personal data is collected. You are responsible for how you use the data; see the legality note above.
What does it cost in practice? $2.50 per 1,000 results (launch pricing) + a few cents of platform usage. Example: a 500-result daily pull costs about $1.25/day. Apify's free $5 monthly credit covers ~2,000 results.
Do I need to configure proxies? No — the default settings work out of the box (RESIDENTIAL proxy is pre-enabled, with automatic direct-connection fallback). For heavy pulls, keeping Korea RESIDENTIAL proxy on is recommended since Kurly's CDN can rate-limit non-Korean and datacenter IPs.
How fresh is the data? Every run scrapes the live site at run time. Schedule the actor for recurring snapshots.
What is NOT included?
No personal data of any kind — reviews appear only as an aggregate count, and review_count_text is the bucketed label Kurly itself shows (e.g. "9,999+"), not an exact number. brand and exact numeric review_count are only populated when enrichBrand: true (slower, one extra request per product).
🇰🇷 More Korean data actors
This actor is part of a suite of Korean-platform scrapers by the same maintainer:
- oliveyoung-scraper — Olive Young K-beauty product listings and rankings.
- naver-place-scraper — Naver Place local business listings and details.
Browse all: apify.com/kdatafactory
🏃 Run it
On Apify: set your input and click Start. Locally:
npm install# put your input in storage/key_value_stores/default/INPUT.jsonKURLY_SCRAPER_LITE_TEST=1 npm start # lite guard: ≤2 pages / ~40 items
Results land in the default dataset (Apify) or ./storage/datasets/default (local).
If this actor saves you time, a rating on the Store page helps a solo maintainer a lot. Found an issue? Open it in the Issues tab — I respond fast.