# Bunjang Scraper: Korean Resale & Secondhand Market (번개장터) (`kdatafactory/bunjang-scraper`) Actor

Scrape Bunjang (번개장터), Korea's largest secondhand & resell marketplace: keyword search and category browse — product names, KRW prices, condition, sale status, and images as clean JSON. Built on Bunjang's JSON API. No seller identity. For resale price research & sneaker/luxury resell tracking.

- **URL**: https://apify.com/kdatafactory/bunjang-scraper.md
- **Developed by:** [Seok June Park](https://apify.com/kdatafactory) (community)
- **Categories:** E-commerce, Other, Automation
- **Features:** Limited permissions
- **Stats:** 4 total users, 2 monthly users, 73.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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

## Bunjang Scraper 🛒

Scrape **secondhand & resell listings** from [Bunjang](https://m.bunjang.co.kr) (번개장터) — Korea's largest peer-to-peer resale marketplace — as clean, structured JSON. Get product names, KRW prices, sale status, images, favorite counts, and last-update timestamps in one call.

Built for **resale price research**, **sneaker & luxury resell tracking**, and **secondhand market analysis**.

> **Try it free.** Apify's free plan includes $5 of monthly platform credit — roughly **2,500 results** from this actor, no credit card required. Set your input, click Start, and export JSON/CSV/Excel.

***

### What it does

This actor pulls listing data directly from Bunjang's public search/browse JSON API (the same one that powers bunjang.co.kr), so results are fast and complete — no fragile HTML scraping in the happy path. Two modes:

- **Search** — every listing matching a keyword (e.g. `nike`, `아이폰`, `jordan 1`). Optionally narrow to a single category.
- **Category** — browse the newest / most-relevant listings in a Bunjang category (e.g. Shoes, Bags, Digital).

Four sort orders are supported: relevance/popularity, newest, price low→high, and price high→low.

> **Privacy first:** this actor collects **item data only**. It never emits seller nicknames, IDs, profiles, or shop handles. Region is coarsened to a public province + city/district label — never a neighborhood or a person.

***

### Input

| Field | Type | Description |
|-------|------|-------------|
| `mode` | string | `"search"` or `"category"`. |
| `query` | string | **Search mode:** the keyword to search for. Required in search mode. |
| `categoryId` | string | **Category mode:** the Bunjang category id (required). Optional in search mode to narrow results. |
| `order` | string | `"score"` (relevance), `"date"` (newest), `"price_asc"`, or `"price_desc"`. Default `score`. |
| `maxItems` | integer | Max listings to collect. Default `100`. |
| `proxyConfiguration` | object | Proxy settings. Apify RESIDENTIAL recommended for large runs. |

#### Common category IDs

| ID | Category |
|------|----------|
| `310` | Women's clothing |
| `320` | Men's clothing |
| `405` | Shoes |
| `430` | Bags / Wallets |
| `421` | Watches |
| `600` | Digital |
| `700` | Sports / Leisure |
| `910` | Star goods (K-pop) |

#### Input example

```json
{
  "mode": "search",
  "query": "나이키",
  "order": "date",
  "maxItems": 100
}
```

```json
{
  "mode": "category",
  "categoryId": "405",
  "order": "score",
  "maxItems": 200
}
```

***

### Output

Each listing is one dataset record. Prices are in KRW (Korean won). `status` is one of `selling` / `reserved` / `sold`.

```json
{
  "source": "bunjang",
  "product_id": "416892841",
  "name": "나이키 x 트래비스 스캇 에어맥스 1 캑터스 브라운 275",
  "price_krw": 209000,
  "status": "selling",
  "condition": null,
  "category": null,
  "region": null,
  "free_shipping": null,
  "is_ad": false,
  "favorite_count": 12,
  "url": "https://m.bunjang.co.kr/products/416892841",
  "image_url": "https://media.bunjang.co.kr/product/416892841_1_1783126918_w400.jpg",
  "listed_at": "2026-07-09T09:12:55+09:00",
  "scraped_at": "2026-07-09T09:13:00+09:00"
}
```

> **Field availability notice (2026-10-08).** Bunjang rebuilt its web app onto a new
> search API, and the new search payload no longer returns a per-item condition,
> category id, location or free-shipping flag. `condition`, `category`, `region` and
> `free_shipping` are therefore **always `null` today**. The keys are kept in every
> row so existing integrations and CSV/Excel column layouts keep working unchanged,
> and the actor still reads them opportunistically — they will repopulate on their own
> if Bunjang restores them. Every other field is unaffected.

A full 40-item sample from a real run is in [`samples/sample-output.json`](samples/sample-output.json).

| Field | Meaning |
|-------|---------|
| `source` | Always `"bunjang"`. |
| `product_id` | Bunjang listing id (pid). |
| `name` | Listing title. |
| `price_krw` | Asking price (KRW). |
| `status` | `selling`, `reserved`, or `sold`. |
| `condition` | `new` or `used`. **Currently always `null`** — Bunjang's new search API no longer returns it. |
| `category` | Bunjang category id. **Currently always `null`** — no longer returned per item by Bunjang's new search API. (You can still *filter* by category via the `categoryId` input.) |
| `region` | Coarse public area (province + city/district). **Currently always `null`** — no longer returned by Bunjang's new search API. **No neighborhood-level or personal location is ever emitted.** |
| `free_shipping` | Whether the seller offers free shipping. **Currently always `null`** — no longer returned by Bunjang's new search API. |
| `is_ad` | `true` for a sponsored/promoted listing, `false` for an organic one. Bunjang mixes ads into every feed — filter on this to get organic-only results. |
| `favorite_count` | Number of users who favorited the listing. |
| `url` | Mobile listing page URL. |
| `image_url` | First product image (resolved thumbnail). |
| `listed_at` | Last update time of the listing (KST, UTC+9). |
| `scraped_at` | ISO-8601 timestamp (KST, UTC+9). |

***

### Use cases

- **Resale price research** — track asking prices for sneakers, luxury goods, electronics, and K-pop goods across the Korean resale market.
- **Sneaker & luxury resell tracking** — monitor supply and pricing for hyped drops (Jordan, Travis Scott, designer bags) as new listings appear.
- **Secondhand market analysis** — measure listing volume, price distribution, and favorite/engagement counts for a product category over time. (Per-item condition and region are no longer published by Bunjang — see the field availability notice above.)
- **AI agents & datasets** — feed structured resale data into pricing models, arbitrage dashboards, or LLM agents.

***

### ❓ FAQ

**Is it legal to scrape this data?**
This actor collects only public, non-personal listing data — the same listings any visitor sees on Bunjang without logging in. No personal data is collected (no seller nicknames, IDs, or profiles). You are responsible for how you use the data; see the legality note below.

**What does it cost in practice?**
$2.00 per 1,000 results + a few cents of platform usage. Example: a 500-result daily pull costs about $1.00/day. Apify's free $5 monthly credit covers ~2,500 results.

**Do I need to configure proxies?**
No — the default settings work out of the box. For large runs or high `maxItems`, enabling Apify Proxy with the `RESIDENTIAL` group is recommended as optional scaling advice (see the proxy note below).

**How fresh is the data?**
Every run scrapes the live site at run time. Schedule the actor for recurring snapshots.

**What is NOT included?**
Seller information of any kind — nicknames, IDs, profiles, shop handles — is never emitted, and neither are Bunjang's per-impression ad tracking blobs. `region`, when Bunjang publishes it at all, is deliberately coarsened to a public province + city/district label and never carries a neighborhood or a person (it is `null` today — see the field availability notice). Only the first product image is included per listing.

***

### 🤖 Use with AI agents (MCP)

Call this Actor as a tool from Claude or any MCP-compatible AI agent — no glue code. Point your MCP client at Apify's server, scoped to this Actor:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=kdatafactory/bunjang-scraper",
      "headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }
    }
  }
}
```

Your agent can then pull Bunjang resale listings on demand — no scraping code in your app. Grab a free token from [Apify → Integrations](https://console.apify.com/settings/integrations).

### 🇰🇷 More Korean data actors

This actor is part of a suite of Korean-platform scrapers by the same maintainer:

- [joongna-scraper](https://apify.com/kdatafactory/joongna-scraper) — Joongna secondhand marketplace listings as structured JSON.
- [pocamarket-scraper](https://apify.com/kdatafactory/pocamarket-scraper) — K-pop photocard market prices and listings.
- [musinsa-scraper](https://apify.com/kdatafactory/musinsa-scraper) — Musinsa fashion product and pricing data.

Browse all: [apify.com/kdatafactory](https://apify.com/kdatafactory)

***

### Rate limiting & legality

- The actor collects **only public, non-authenticated data**. It never logs in and never touches private endpoints.
- **No personal data** is collected — no seller nicknames, IDs, profiles, or shop handles, and no ad tracking identifiers. `region` is deliberately coarsened to a public province/district label and never carries a neighborhood or a person.
- Requests are rate-limited: one page at a time with a ≥ 500 ms delay between requests, to stay gentle on Bunjang's servers.
- You are responsible for using the data in line with Bunjang's terms of service and applicable law.

#### ⚠️ Proxy recommendation

Bunjang may rate-limit high request volumes. The actor automatically uses the proxy configuration you provide (via `proxyConfiguration` in input) and, if a proxy tunnel fails, falls back to a direct connection rather than hanging.

**A proxy only helps for some failures — check the status code in the log before paying for residential traffic:**

| Log line | What it means | Does a proxy help? |
|---|---|---|
| `API HTTP 429` | Rate limited | **Yes** — residential spreads requests across IPs. Lowering `maxItems` also works. |
| `API HTTP 403` / `401` | Access refused (IP reputation, or auth now required) | **Maybe** — this is the one case that can be a real IP block. |
| `API HTTP 404` | The endpoint path moved | **No.** Not a block. The actor needs a code update; residential traffic is wasted here. |
| `API HTTP 400` | Query parameters rejected | **No.** Server rejected the request, not the caller. |
| `API HTTP 5xx` | Bunjang-side server error | **No.** Retry later. |

The actor's own error message reports which of these it actually observed, so you do not have to guess.

***

*If this actor saves you time, a rating on the [Store page](https://apify.com/kdatafactory/bunjang-scraper) helps a solo maintainer a lot. Found an issue? Open it in the Issues tab — I respond fast.*

***

### ⭐ Found it useful?

If this Actor saves you time, a short review on its Apify Store page helps other buyers find it. Missing a field or hit a bug? Open an issue on the **Issues** tab; reports are answered and fixed.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. 'search' returns listings matching a keyword. 'category' browses the newest/most-relevant listings in a Bunjang category.

## `query` (type: `string`):

For 'search' mode: a keyword to search for (e.g. 'nike', '아이폰', 'jordan 1'). Required in search mode; ignored in category mode.

## `categoryId` (type: `string`):

For 'category' mode: a Bunjang category id (required). Top-level examples: '310' Women's clothing, '320' Men's clothing, '405' Shoes, '430' Bags/Wallets, '421' Watches, '600' Digital, '700' Sports/Leisure, '910' Star goods. Optional in search mode to narrow results to one category.

## `order` (type: `string`):

Result ordering. 'score' = relevance/popularity, 'date' = newest first, 'price_asc' = cheapest first, 'price_desc' = most expensive first.

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

Maximum number of listings to collect.

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

Proxy settings. Apify Proxy with the RESIDENTIAL group helps against rate limiting (HTTP 429) and IP-reputation refusals (HTTP 403); it cannot fix a moved endpoint (404) or rejected parameters (400), so check the status code in the log before enabling paid residential traffic. If omitted, the actor runs on a direct connection.

## Actor input object example

```json
{
  "mode": "search",
  "query": "나이키",
  "categoryId": "405",
  "order": "score",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every record collected in this run.

# 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 = {
    "query": "나이키",
    "categoryId": "405"
};

// Run the Actor and wait for it to finish
const run = await client.actor("kdatafactory/bunjang-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 = {
    "query": "나이키",
    "categoryId": "405",
}

# Run the Actor and wait for it to finish
run = client.actor("kdatafactory/bunjang-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 '{
  "query": "나이키",
  "categoryId": "405"
}' |
apify call kdatafactory/bunjang-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kdatafactory/bunjang-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/i5LgJCeT6bPR9uauU/builds/92eutvc22cPsGtyj2/openapi.json
