# Coupang Scraper (`mlg14/coupang-scraper`) Actor

Collect public Coupang bestseller products with prices, ratings, delivery markers, page positions, and source links. Keyword search is experimental.

- **URL**: https://apify.com/mlg14/coupang-scraper.md
- **Developed by:** [MLG Data](https://apify.com/mlg14) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.39 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Coupang Scraper

Collect public Coupang bestseller products and export product data to CSV or JSON. The verified output includes product identifiers, prices, ratings, delivery markers, bestseller positions, and source links.

**Current status:** The bestseller mode passed its live check on 28 September 2026 with 30 complete product rows. Keyword search remains blocked by an access challenge and has no verified output. Select `browseBestsellers` for the working mode; do not treat bestseller positions as keyword search rankings.

### What data can you extract from Coupang?

Each verified row represents one product card on the public bestseller page. Field names are stable camelCase keys. Null means a value was not visible in that card. Boolean flags describe markers detected by the parser; a false value should be checked against the linked page when it matters.

| Field | Description | Example or format |
|---|---|---|
| `productId` | Identifier in the product link or listing attribute | Numeric string |
| `itemId` | Item identifier from a listing attribute or link | Numeric string or null |
| `vendorItemId` | Vendor item identifier from a listing attribute or link | Numeric string or null |
| `name` | Product title printed on the listing | Korean or English text |
| `url` | Direct public product link | HTTPS URL |
| `image` | Product image from the listing | HTTPS URL or null |
| `price` | Displayed sale price | Integer Korean won |
| `currency` | Price currency | `KRW` |
| `originalPrice` | Higher reference price when displayed | Integer or null |
| `discountRate` | Displayed percentage discount | Integer or null |
| `discountLabel` | Text describing the discount | Text or null |
| `unitPrice` | Price per weight, volume, or item when shown | Text or null |
| `coupon` | Coupon message on the card | Text or null |
| `cashbackText` | Cashback or reward message | Text or null |
| `ratingAverage` | Displayed average star rating | Number or null |
| `ratingCount` | Displayed rating count | Integer or null |
| `rocketDelivery` | Whether a Rocket marker is visible | Boolean |
| `deliveryBadges` | Badge text found on the listing | Array of strings |
| `deliveryPromise` | Delivery timing text | Text or null |
| `shippingText` | Shipping message | Text or null |
| `shippingFeeText` | Shipping fee message | Text or null |
| `freeShippingOver` | Displayed threshold for free shipping | Integer or null |
| `soldOut` | Whether a sold-out marker is visible | Boolean |
| `soldOutReason` | Sold-out explanation | Text or null |
| `lowStockText` | Low-stock warning | Text or null |
| `usedOffersText` | Used-offer message | Text or null |
| `sponsored` | Whether the card is labeled as an advertisement | Boolean |
| `searchRank` | Position within a keyword search page; null in bestseller mode | Integer or null |
| `bestSellerRank` | Position among bestseller page product cards | Integer or null |
| `couPick` | Whether a recommendation marker is visible | Boolean |
| `matchedKeywords` | Search words found in the product title | Array of strings |
| `badges` | Distinct visible badge messages | Array of strings |
| `keyword` | Search term that produced the card; null in bestseller mode | String or null |
| `searchPage` | Search page number; null in bestseller mode | Integer or null |
| `sourceMode` | Origin of this row | `bestsellers` or `search` |

A listing card does not expose a complete product detail record. Values such as seller identity, specifications, stock count, quantity-specific offers, and customer review text are outside this actor's current output. Prices may depend on coupon eligibility, membership, region, or time. A row is a snapshot of the displayed bestseller card, not a guarantee that a checkout will show the same total. When a downstream process needs a specific offer, follow the source URL and check it at the time of use.

The parser retains both identifiers and the URL because the URL can include an item and vendor item selection. These values matter when one product page represents several offers. The source mode and rank identify where each row was encountered. Bestseller mode removes duplicate product, item, and vendor item combinations within the page.

### How to scrape Coupang

1. Enable `browseBestsellers` to collect the verified public bestseller page.
2. Set `maxItems` to the number of rows needed. The validated page supplied 30 product cards.
3. Optionally restrict rows by displayed price, rating, or Rocket delivery marker.
4. Run the actor, review the default dataset, and export CSV or JSON. A challenged or unrecognized page causes an error instead of an empty successful result.

The actor reads bestseller cards in page order and stops at the total row cap. A filter is applied after a card is read, so a restrictive filter may yield fewer rows than the maximum even when the page contains many products. The product limit is a ceiling, not a guarantee of coverage. Keyword mode remains available in the input for future access recovery, but it did not pass live validation.

### Input

| Name | Type | Default | Description |
|---|---|---|---|
| `keywords` | string array | Prefilled sample | Search phrases for keyword mode. Ignored when bestseller mode is enabled; keyword mode is currently blocked. |
| `browseBestsellers` | boolean | `false` | Read the public bestseller page and ignore any supplied keywords. This is the verified collection mode. |
| `maxProductsPerKeyword` | integer | `100` | Maximum retained products from each keyword. Zero removes this per-keyword cap, subject to the page and total caps. |
| `maxItems` | integer | `0` | Maximum rows across the run. Zero removes the total cap. |
| `maxPages` | integer | `10` | Maximum search pages requested for each keyword, from one to fifty. |
| `sortBy` | string | `relevance` | Relevance, best selling, low price first, or high price first. |
| `minPrice` | integer | Unset | Retain prices at or above this amount in Korean won. |
| `maxPrice` | integer | Unset | Retain prices at or below this amount in Korean won. |
| `minRating` | number | Unset | Retain rows with a displayed rating at or above this value. Unrated rows are excluded when this filter is used. |
| `rocketDeliveryOnly` | boolean | `false` | Retain rows marked for Rocket delivery. |
| `proxyConfiguration` | object | Enabled | Network configuration for public page requests. |

The successful golden input collects the first 30 bestseller cards:

```json
{
  "browseBestsellers": true,
  "maxItems": 30
}
```

The check requires at least 30 rows, with product ID, title, URL, price, currency, bestseller position, and source mode on every row. The 28 September 2026 run returned 30 rows and met every required fill threshold. Keyword search was tested separately and returned no usable rows.

A rating threshold applies to the number displayed on a listing card. It does not inspect individual reviews. The price filters use the current listed sale price, not the original price, coupon-adjusted checkout price, unit price, or any membership-specific amount. The Rocket filter uses markers visible on the card. None of these filters can recover products hidden behind page limits or an access challenge.

### Output example

This is a real row from the successful 30-item bestseller dataset. Optional fields omitted here remain present as null or empty arrays in the full JSON export.

```json
{
  "productId": "5385068615",
  "itemId": "19224496270",
  "vendorItemId": "86341163625",
  "name": "국내산 방아잎, 100g, 3개",
  "url": "https://www.coupang.com/vp/products/5385068615?itemId=19224496270&vendorItemId=86341163625",
  "price": 16840,
  "currency": "KRW",
  "cashbackText": "최대 842원 적립",
  "ratingAverage": 4.5,
  "ratingCount": 6484,
  "rocketDelivery": true,
  "deliveryPromise": "오늘(월) 도착",
  "soldOut": false,
  "sponsored": false,
  "searchRank": null,
  "bestSellerRank": 14,
  "keyword": null,
  "searchPage": null,
  "sourceMode": "bestsellers"
}
```

The example illustrates the difference between bestseller placement and keyword placement. The 14 is the card's position among the product cards collected from this bestseller page. It must not be interpreted as a rank for any search term. A title and price are present on this card, while discount, coupon, and shipping fields may be absent on another card.

### Use cases

- Catalogue teams can compare products visible on the bestseller page between scheduled snapshots.
- Merchandising teams can review changes in the order of public bestseller cards.
- Delivery analysts can compare the share of listed products marked for Rocket delivery.
- Pricing analysts can inspect sale prices alongside visible reference prices and discount messages.
- Researchers can monitor ratings and rating counts for the products surfaced by the page.
- Inventory monitors can use visible sold-out and low-stock messages as signals to check a product page manually.

For repeatable comparisons, save the exact input and collection date with each export. Bestseller position can move between runs and may differ by location or session. Compare products using identifiers rather than title alone, because titles can change or repeat. Keep the URL so a reviewer can inspect the public listing behind a row. Treat absent optional fields as missing observations, not proof that an offer does not exist.

### How much does it cost to scrape Coupang?

The configured result price is **$2.392 per 1,000 rows**. Ten rows cost about **$0.0239** in result charges, and the verified 30-row bestseller run corresponds to **$0.0718** in result charges. A total of 100 rows across several runs would be about **$0.2392** in result charges. These examples use the configured per-row rate; they do not promise 100 distinct results from one bestseller page. The actor is not publicly released.

The total row cap controls how many items are pushed. It is not a spending guarantee for requests or browser retries. A restrictive filter can reduce the retained result count, while the same page still has to be fetched. Run-level platform usage can apply in addition to result charges. Inspect the actual run and dataset before projecting the cost of repeated collections.

### Tips for best results

Enable `browseBestsellers` for the verified path. This mode ignores any supplied keywords. The bestseller page is a public selection, not a full catalogue. Save each dataset with its run date, then compare product IDs, prices, ratings, and positions with earlier snapshots. A product that disappears from this page has not necessarily been removed from the marketplace.

Start without filters. After inspecting the 30-row sample, add price or delivery restrictions that reflect a real question. A minimum rating can remove unrated items; it should not be used if those items are important to the study. A price limit is evaluated against the visible sale price, so a coupon or different quantity can change the effective checkout price without changing the filter result.

If a keyword run fails with an access challenge, changing the keyword is unlikely to fix it. The blocker was observed on search, product, and mobile routes. The public bestseller page was reachable in the successful run, but later access is not guaranteed. The actor rotates sessions and stops with a clear error when usable product cards do not arrive.

### Limits

Public keyword search and product pages presented an access challenge, including with a residential session and browser attempt. Public sitemaps were reachable, but they contain links and update dates, not the price, rating, delivery, and ranking fields required for search. No live keyword search card could be inspected. The keyword parser is provisional. The bestseller parser was verified against a 30-row dataset from the public page.

The working mode covers the public bestseller page. It does not provide whole-category browsing, brand ID filters, item-condition filters, detail enrichment, or customer review extraction. The verified page yielded 30 cards; raising `maxItems` cannot manufacture additional rows. `bestSellerRank` records card order on that page, not a keyword rank or a claim about all categories. Displayed prices and availability can change between request and export.

The actor can fail before producing any dataset items when the page is challenged. Keyword mode currently has that behavior. A failure is preferable to a successful run with an empty dataset, because an empty dataset could be mistaken for a genuine no-results search. Downstream scheduled jobs should treat a failed run as missing data and preserve the last successful snapshot separately.

### Automated workflows

Save the input with the exported dataset and run status. A scheduled process can request bestseller mode, check that the run succeeded, then compare IDs and prices with the previous successful dataset. Another process can flag products whose displayed delivery marker or page position changed. Both workflows require a successful source response; blocked runs must not be used as a market snapshot.

An automated consumer should check row count as well as run status. The golden check requires at least 30 bestseller rows and complete identity, price, rank, and source fields. Optional fields can remain null. Treat any unexpected drop in row count as a collection-health issue until the public page and source links are reviewed. Preserve the raw input so the same collection can be repeated.

### FAQ

**Is the actor working now?** Bestseller mode passed a live 30-row check. Keyword search remains blocked and is not a verified collection mode.

**Does it require an account?** The verified source is a public, logged-out bestseller page. No account credentials are part of the input. Public visibility does not guarantee every later request will succeed.

**Can I change the network settings?** The input exposes network configuration. The verified bestseller run used the default path. Earlier search attempts tried multiple sessions and a residential route without obtaining usable search cards.

**Why is a field empty?** A bestseller card may not display that value. Null should be read as unavailable in the observed card, not as zero, false, or proof that the product has no such offer. Search rank and keyword are null by design in bestseller mode.

**Can I collect detailed specifications or reviews?** This version reads listing cards. It does not collect specifications, option matrices, seller details, or individual reviews.

**Can I schedule and export results?** Successful bestseller runs can be scheduled and their datasets exported in common formats. Monitor run status and row count because page access can change.

**Can I use the data legally?** Collection should be limited to public data and conducted in line with site terms and applicable law. Avoid misuse of personal data. This actor is intended for product listings rather than private account information.

### Integrations

A successful dataset can be consumed through a dataset endpoint, scheduled collection, notifications, or a CSV export. Keep product IDs, URLs, bestseller positions, and collection timestamps in any downstream table. A workflow should alert on a failed run and on a count below its expected range. The verified dataset shows 30 rows; inspect source links when a decision depends on a specific offer.

### Support

Open an issue on the Issues tab with the search input, run status, and the page or field that failed. Do not include account credentials or private checkout information.

# Actor input Schema

## `keywords` (type: `array`):

Search phrases for keyword mode. Ignored when bestseller browsing is enabled. Keyword pages are currently access challenged.

## `maxProductsPerKeyword` (type: `integer`):

Maximum accepted products for each keyword. Zero scans until maxPages or the available listings end.

## `maxItems` (type: `integer`):

Maximum rows in the complete run. Zero removes the total cap.

## `maxPages` (type: `integer`):

Maximum number of result requests per keyword. Each request returns up to 60 products; extra requests slice the keyword by price band and sort order to reach beyond 60 results.

## `sortBy` (type: `string`):

Order requested on the public search page.

## `minPrice` (type: `integer`):

Keep products priced at or above this amount in Korean won.

## `maxPrice` (type: `integer`):

Keep products priced at or below this amount in Korean won.

## `minRating` (type: `number`):

Keep products whose displayed average rating is at least this value.

## `rocketDeliveryOnly` (type: `boolean`):

Keep only listings marked for Rocket delivery.

## `proxyConfiguration` (type: `object`):

Network configuration for public page requests.

## `browseBestsellers` (type: `boolean`):

Collect public products from the bestseller page. When enabled, keywords are ignored. This mode does not provide keyword search rankings.

## Actor input object example

```json
{
  "keywords": [
    "무선 마우스"
  ],
  "maxProductsPerKeyword": 100,
  "maxItems": 0,
  "maxPages": 10,
  "sortBy": "relevance",
  "rocketDeliveryOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "browseBestsellers": false
}
```

# Actor output Schema

## `products` (type: `string`):

Collected product rows in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "무선 마우스"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mlg14/coupang-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": ["무선 마우스"] }

# Run the Actor and wait for it to finish
run = client.actor("mlg14/coupang-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "무선 마우스"
  ]
}' |
apify call mlg14/coupang-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mlg14/coupang-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2P39J93J48BudhXjx/builds/cHBVO36azZOdBNJzz/openapi.json
