Gmarket KR $1๐ฐ URL Keyword and Review Scraper
Pricing
from $1.00 / 1,000 results
Gmarket KR $1๐ฐ URL Keyword and Review Scraper
Scrape product listings and customer reviews from Gmarket.co.kr into clean JSON datasets. Supports keyword search, product URLs, or review-only mode by product ID. Lightweight, free-tier friendly, and runs without a browser.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
4
Monthly active users
4 days ago
Last modified
Categories
Share
Gmarket Global Scraper
Sample shape below is illustrative; values are placeholders, not from a live listing.
Pull product listings AND customer reviews from Gmarket Global (the English-language storefront of one of Korea's biggest marketplaces) into a clean JSON dataset. Two modes: keyword search or URL paste. One toggle flips the same flow from "one record per product" to "one record per review." Detail enrichment is on by default and adds the full seller disclosure (business name, manager, customer-service phone, business registration, e-commerce registration).
Why this scraper
- 25+ product fields per record, with optional detail enrichment that adds the legally-mandated Korean seller info (company name, manager name, customer-service phone, business registration number, e-commerce sales registration).
- Flip "Reviews only" to scrape reviews of every matching product instead of the products themselves.
- English titles by default (the global storefront serves English).
- KRW and USD prices side by side, plus original-vs-sale price and discount percent.
- Every record also carries a
rawblock with the verbatim upstream API response, so no field is ever silently dropped. - Datacenter proxy works out of the box on the free Apify plan.
Data you get
Product records (default)
| Field | Example |
|---|---|
| goodsCode | "0000000001" |
| title | "Sample Product Title" |
| linkUrl | "https://mg.gmarket.co.kr/Item?goodscode=0000000001" |
| imageUrl | "https://gdimg.gmarket.co.kr/0000000001/still/280?ver=0" |
| additionalImages | ["https://gdimg.gmarket.co.kr/.../shop_img/000/000/0000000001.jpg"] |
| sellPriceKrw | 22800 |
| originalPriceKrw | "22,800" |
| salePriceKrw | "22,800" |
| currencyPrice | "$15.75" |
| discountRate | "0" |
| wasPriceKrw | 41490 (numeric, null when not on special) |
| currentPriceKrw | 22800 (numeric current/paying price, always populated) |
| savingsAmountKrw | 5200 (numeric, null when not on special) |
| discountRatePercent | 21 (numeric mirror of discountRate, null when not on special) |
| isOnSpecial | false |
| isBigSmilePromo | false (correctly wired from the API's IsBigSmileItem; see note below) |
| bigSmileImageUrl | null |
| isSponsored | false |
| isFreeShipping | true |
| deliveryInfo | "Free" |
| deliveryFee | "0" |
| sellerCustNo | "000000000" |
| miniShopHandle | "samplestore" |
| miniShopUrl | "https://mg.gmarket.co.kr/samplestore" |
| categoryCodeL | "100000000" |
| categoryCodeM | "200000000" |
| categoryCodeS | "300000000" |
| overseaDeliveryAvailable | true |
| isBigSmile | false |
| isAdult | false |
| translation.english | true |
| translation.chinese | true |
| translation.japanese | false |
| raw | { ...full upstream Item JSON... } |
| scrapedAt | "2026-01-01T00:00:00.000Z" |
When fetchDetails is on (the default), each record also carries:
| Field | Example |
|---|---|
| descriptionText | "Up to 3,000 chars of cleaned product description." |
| brand | "SampleBrand" |
| sellerCompanyName | "Sample Trading Co., Ltd." |
| sellerManagerName | "John Doe" |
| sellerPhone | "02-0000-0000" |
| sellerBusinessNumber | "000-00-00000" |
| sellerEcommerceNumber | "0000-Seoul-0000" |
| sellerInfo | { ...full upstream SellerInfo JSON: 15 fields... } |
Specials, was-price & discount
Every product already carries a genuine, per-product was/current price and discount rate (verified live, never fabricated): a was price, a current price, and the site's own computed discount % plus the exact KRW savings. The numeric fields below are additive and derived from data the scrape already collects for each product, so they add no extra work and no extra cost:
wasPriceKrw/savingsAmountKrw/discountRatePercentpopulate only when the item is genuinely discounted (mirrors the existingdiscountRatefield); on an ordinary, non-discounted item they arenullโ verified live on alaptopsearch (all0indiscountRate,wasPriceKrw/savingsAmountKrwcorrectlynull).currentPriceKrwis the numeric price the customer actually pays right now (parsedSalePrice); it is always populated, discounted or not.- Verified live on a
phone casesearch (majority of cards discounted): e.g. was โฉ24,000 โ now โฉ18,800, save โฉ5,200 (21%); was โฉ10,000 โ now โฉ6,900, save โฉ3,100 (31%) โ matching the site's own math exactly.
Specials-category taxonomy โ verified, not fabricated. Gmarket Global was checked directly for any Super Deals / Big Sale / discount-collection surface beyond what's already scraped. None exists:
- Sort options are only relevance/popularity, newest, price asc/desc, and rating โ no discount- or deal-based sort.
- There is no separate deals/specials collection or category to browse; the only promotion-scoped
filter is the sitewide "BigSmile" promotion, which this actor already exposes as the
bigSmileOnlyinput (default off โ this already satisfies "specials as an opt-in, never auto-run"). isBigSmilePromoandbigSmileImageUrlare additive fields that correctly reflect a product's real BigSmile promotion status (the pre-existingisBigSmileoutput field reads a differently-named key that never carries a value, so it is alwaysfalse; left unchanged to avoid revaluing an existing field โisBigSmilePromois the accurate signal going forward).isSponsoredis an additional real, non-fabricated per-product signal (sponsored/ad placement).- BigSmile campaigns are time/keyword-gated โ across several unrelated keyword probes during
verification,
isBigSmilePromo=truereturned 0 items each time. The fields still populate correctly whenever a live BigSmile campaign covers the searched keyword; they are not fabricated when it doesn't.
Review records (when reviewsOnly is on)
The actor still uses your keyword or URL input to discover products, but pushes one record per review instead of one per product.
| Field | Example |
|---|---|
| productGoodsCode | "0000000001" |
| productLinkUrl | "https://mg.gmarket.co.kr/Item?goodscode=0000000001" |
| reviewId | "100000000" |
| authorNickname | "abc****" (Gmarket-masked) |
| authorLoginId | "abc1234" (the un-masked login, passed through verbatim) |
| authorCustNo | "0000000000" |
| authorCountryCode | "KR" |
| rating | 9 |
| ratingMax | 10 |
| deliveryRating | 5 |
| title | "Sample review title" |
| comment | "Sample comment body" |
| titleEnglish | "Sample title translated" |
| commentEnglish | "Sample comment translated" |
| reviewDate | "2026-01-01T00:00:00.000Z" |
| reviewDateText | "2026.01.01" |
| hasPhotos | true |
| photoUrls | ["https://bampic.gmarket.co.kr/..."] |
| variantInfo | "Color: Black [1ea]" |
| sellerReply | null |
| sellerReplyDate | null |
| isPowerReviewer | true |
| readCount | 0 |
| raw | { ...full upstream review JSON, 40 fields... } |
| scrapedAt | "2026-01-01T00:00:00.000Z" |
How to use
Keyword search, default settings (detail enrichment on, 1 page):
{"mode": "search","keywords": ["laptop"]}
Keyword search with price band, oversea-only, multi-keyword, deeper pagination:
{"mode": "search","keywords": ["headphones", "earbuds"],"minPrice": 10000,"maxPrice": 100000,"overseaDeliveryOnly": true,"maxPages": 3}
URL mode (paste any Gmarket Global search URL with whatever filters you want):
{"mode": "url","urls": ["https://mg.gmarket.co.kr/Search/Search?keyword=phone&minPrice=50000&maxPrice=500000"],"maxPages": 2}
Reviews only (pulls reviews of every product matching your search; caps total reviews at maxListings):
{"mode": "search","keywords": ["laptop"],"reviewsOnly": true,"maxReviewsPerProduct": 20,"maxListings": 100}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | enum | "search" | "search" uses keywords + filters; "url" uses pasted search-result URLs |
| keywords | array of strings | ["laptop"] | One or more product keywords; English or Korean both work. Search mode only |
| minPrice | integer | 0 | Min sale price in KRW. 0 = no minimum |
| maxPrice | integer | 0 | Max sale price in KRW. 0 = no maximum |
| overseaDeliveryOnly | boolean | false | Restrict to items that ship outside Korea |
| bigSmileOnly | boolean | false | Restrict to BigSmile sitewide promotion items |
| urls | array of strings | [...] | One entry per search. URL mode only |
| reviewsOnly | boolean | false | Push one record per review instead of one per product. Uses the same search/URL flow to discover products first |
| maxReviewsPerProduct | integer | 50 | Reviews-only mode: stop after N reviews per product (20 per page) |
| maxPages | integer | 1 | Pages to walk per keyword / URL (60 items per page). Increase for deeper scrapes |
| maxListings | integer | 0 | Cap on TOTAL records output (products or reviews depending on reviewsOnly). 0 = unlimited |
| fetchDetails | boolean | true | Fetch product detail pages to populate description, brand, and the full seller disclosure. Turn off for a leaner, faster scrape |
| proxy | proxy | Apify Datacenter | Network. Datacenter works fine; residential rarely needed |
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape โ the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record โ not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Output example (product, with fetchDetails: true)
{"goodsCode": "0000000001","title": "Sample Product Title","linkUrl": "https://mg.gmarket.co.kr/Item?goodscode=0000000001","imageUrl": "https://gdimg.gmarket.co.kr/0000000001/still/280?ver=0","sellPriceKrw": 22800,"currencyPrice": "$15.75","discountRate": "0","wasPriceKrw": null,"currentPriceKrw": 22800,"savingsAmountKrw": null,"discountRatePercent": null,"isOnSpecial": false,"isBigSmilePromo": false,"bigSmileImageUrl": null,"isSponsored": false,"sellerCompanyName": "Sample Trading Co., Ltd.","sellerManagerName": "John Doe","sellerPhone": "02-0000-0000","sellerBusinessNumber": "000-00-00000","sellerEcommerceNumber": "0000-Seoul-0000","sellerInfo": {"CompanyName": "Sample Trading Co., Ltd.","ManagerName": "John Doe","HelpDeskStartDate": "10","HelpDeskEndDate": "16","HelpDeskTelNo": "02-0000-0000","CompanyNo": "000-00-00000","EcomerceNo": "0000-Seoul-0000","SellerGrade": "A1","DealerSatisGrade": "AA"},"descriptionText": "Sample product description text.","brand": "SampleBrand","overseaDeliveryAvailable": true,"translation": { "english": true, "chinese": true, "japanese": false },"scrapedAt": "2026-01-01T00:00:00.000Z"}
Plan requirement
Works on any Apify plan, including the Free plan, because the default proxy is Apify Datacenter. If you ever see zero results from Apify Datacenter, switch the proxy to Apify Residential (Starter plan or higher) and try again.