# Theqoo Scraper – K-pop Community Posts & Comments (No API) (`claude_code_reviewer/theqoo-scraper-en`) Actor

Scrape theqoo (theqoo.net), Korea's top K-pop and entertainment community, with no API or login: board listings (HOT, Square, per-artist boards) and full posts with all comments, comment numbers, same-commenter markers and @reply targets. Cloudflare handled via Korean residential proxy.

- **URL**: https://apify.com/claude_code_reviewer/theqoo-scraper-en.md
- **Developed by:** [Chad](https://apify.com/claude_code_reviewer) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 post listings

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

## Theqoo Scraper – Korean K-pop Community Posts & Comments (No API, No Login)

Scrape theqoo (theqoo.net, 더쿠), Korea's top K-pop, entertainment and beauty community: the latest posts of any board, and the full text plus every comment of any post. Works with HOT, Square (스퀘어), K-idol talk (케이돌토크), beauty, drama/film boards and the per-artist fan boards (bts, newjeans, seventeen and hundreds more). Public pages only, no browser, output as JSON/CSV/Excel.

theqoo sits behind a Cloudflare security check that blocks datacenter and most foreign IPs (403 "보안 검사중", "security check in progress"). This actor uses a Korean residential proxy by default to pass it, and loads comments exactly the way the site does (same session plus a CSRF token), so you do not have to build any of that yourself.

### Output Fields

#### Board post listing (board mode, `content` is null)

| Field | Type | Description |
|-------|------|-------------|
| post_id | string | Post number |
| site | string | Always `theqoo` |
| board | string | null | Board ID (e.g. `hot`, `square`) |
| category | string | null | Post category tag (e.g. 이슈 issue, 잡담 chat, 유머 humor) |
| title | string | null | Title |
| author | string | null | Author. Everyone on theqoo is anonymous ("무명의 더쿠"), so this is usually null |
| reply_count | number | null | Comment count |
| view_count | number | null | View count |
| created_at | string | null | Post time (ISO 8601, Korea time +09:00) |
| created_at_precision | string | null | Time precision: `minute` (today's posts) or `day` (older posts, date only) |
| post_url | string | Post URL |
| content / links / image_count | null | Always null in listing mode |
| source_mode | string | Mode used |
| source_query | string | Query (board ID) |
| scraped_at | string | Scrape time (ISO 8601) |

#### Post content (full post mode: the fields above plus these)

| Field | Type | Description |
|-------|------|-------------|
| content | string | null | Post text (HTML removed, line breaks kept). Null for image-only posts |
| links | string\[] | Outbound links in the post (x.com, YouTube, news...), both linked and pasted as plain text |
| image_count | number | Number of images in the post |
| created_at | string | null | Post time to the minute (`created_at_precision: "minute"`) |
| board | string | null | The board the post was opened under. Give just the number and theqoo redirects to the post's home board |

#### Comment (full post mode)

| Field | Type | Description |
|-------|------|-------------|
| reply_id | string | Comment ID |
| post_id | string | Post number |
| site | string | Always `theqoo` |
| floor | number | Comment number: the 12 in the site's "12. 무명의 더쿠", and what "@12" in other comments points to |
| commenter_floor | number | **Same-commenter marker.** The comment number where this anonymous person first commented on the post (the site's "= 12덬"). Same value = same person, within this post only |
| is_op | boolean | true when the post's own writer left the comment (the site's "= 원덬") |
| reply_to_floor | number | null | The comment number this one answers, read from a leading "@N". Null when there is none |
| is_hidden | boolean | true for deleted comments and comments hidden from logged-out visitors. These rows are **never billed** |
| hidden_reason | string | null | `deleted`, or `members_only_recent` (under one hour old, hidden from logged-out visitors) |
| author | string | null | Only set on boards that show nicknames; null when anonymous |
| content | string | null | Comment text (HTML removed). Null for hidden comments |
| created_at | string | null | Comment time to the second (ISO 8601, +09:00) |
| scraped_at | string | Scrape time (ISO 8601) |

Field names match hardwarezone-scraper (Singapore), lihkg-scraper (Hong Kong), ptt-scraper (Taiwan) and voz-scraper (Vietnam) from the same developer, so you can merge community data from several countries into one table.

### Modes

| Mode | Input | Output | Billing |
|------|-------|--------|---------|
| board | boards (board IDs), keywords (title filter, optional), dateFrom (optional) | Board post listing | $0.002 per post |
| thread | threadIds / threadUrls | Post content ($0.008 each) + all comments ($0.0005 each) | By volume |

Deleted comments and comments hidden from logged-out visitors are included so comment numbers stay continuous, but they are not billed.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| mode | enum | board | Mode: board / thread (required) |
| boards | array | `["hot"]` | Board IDs or board URLs, e.g. hot, square, ktalk (K-idol talk), beauty, dyb (drama/film/actors), talk (daily talk), bts, newjeans |
| threadIds | array | — | Post numbers (e.g. 4371268800) |
| threadUrls | array | — | Post URLs; the number is extracted automatically |
| bulkInput | textarea | — | Bulk paste, one item per line, merged into the matching field for the current mode |
| keywords | array | — | Board mode: title keyword filter (empty = no filter) |
| maxItems | integer | 50 | Board mode: max posts per board; full post mode: max posts. Up to 500 |
| maxReplies | integer | — | Full post mode: max comments per post (comments #1 to #N). 0 = post only, empty = all |
| dateFrom | string | — | Board mode: only posts since this time (`30m`, `12h`, `3d`, `2w` or `2026-10-01`). Stops paging early when set |
| proxyConfiguration | proxy | Apify RESIDENTIAL + KR | Korean residential proxy. Datacenter IPs are blocked by Cloudflare, so keep the default |

### Input Examples

#### 1. Latest posts on the HOT board

```json
{
  "mode": "board",
  "boards": ["hot"],
  "maxItems": 50
}
```

#### 2. Daily monitoring of artist boards (scheduled)

```json
{
  "mode": "board",
  "boards": ["newjeans", "seventeen", "ktalk"],
  "dateFrom": "1d",
  "maxItems": 200
}
```

#### 3. Filter by title keywords

```json
{
  "mode": "board",
  "boards": ["square", "hot"],
  "keywords": ["컴백", "콘서트"],
  "maxItems": 100
}
```

#### 4. One full post (text + every comment)

```json
{
  "mode": "thread",
  "threadUrls": ["https://theqoo.net/hot/4371268800"]
}
```

#### 5. Cap the cost of a long post (comments #1–200 only)

```json
{
  "mode": "thread",
  "threadIds": ["4370661006"],
  "maxReplies": 200
}
```

### Sample Output

Board listing:

```json
{
  "post_id": "4371268800",
  "site": "theqoo",
  "board": "hot",
  "category": "이슈",
  "title": "뎡배에서 반응 좋은 오늘 첫방송 한 드라마.jpg",
  "author": null,
  "reply_count": 363,
  "view_count": 71014,
  "created_at": "2026-10-10T22:25:00+09:00",
  "created_at_precision": "minute",
  "post_url": "https://theqoo.net/hot/4371268800",
  "content": null,
  "links": null,
  "image_count": null,
  "source_mode": "board",
  "source_query": "hot",
  "scraped_at": "2026-10-10T16:22:00.000Z"
}
```

Comment:

```json
{
  "reply_id": "4371277604",
  "post_id": "4371268800",
  "site": "theqoo",
  "floor": 54,
  "commenter_floor": 33,
  "is_op": false,
  "reply_to_floor": 49,
  "is_hidden": false,
  "hidden_reason": null,
  "author": null,
  "content": "@49 그시대는 맞음ㅋㅋㅋ",
  "created_at": "2026-10-10T22:31:43+09:00",
  "scraped_at": "2026-10-10T16:22:05.000Z"
}
```

This is comment #54, written by the same person as comment #33, answering comment #49.

### Notes

- Public content only; no account or token needed. Members-only boards and anything that needs a login are not collected.
- **theqoo disables search for logged-out visitors** (no site-wide search). So this actor has no keyword search across the site; `keywords` only filters the titles of the boards you list. With keywords, each board is scanned for at most 20 pages (about 400 posts). For keyword monitoring, schedule a daily run on the relevant boards with `dateFrom: "1d"`.
- **Every writer is anonymous** ("무명의 더쿠"), so `author` is usually null. Use `commenter_floor` to group the comments one person left on a post, and `is_op` to spot the writer's own comments. Identity does not carry across posts.
- theqoo **hides comments younger than one hour from logged-out visitors.** They come back with `is_hidden: true`, `hidden_reason: "members_only_recent"` and no text, and are not billed. If you need every recent comment, collect a post at least an hour after it was written.
- Board listings show the minute for today's posts and only the date for older ones (`created_at_precision`). Use full post mode for exact times. For `dateFrom`, a date-only post counts as the whole day.
- All timestamps are ISO 8601 in Korea time (+09:00).
- Pinned notices and event posts at the top of each board are excluded.
- Stops automatically after 5 consecutive pages with no new posts; with `dateFrom` it stops as soon as a whole page is older than the cut-off.
- If nothing was collected because requests failed (blocks, proxy errors) or every board/post was a 404, the run ends as **FAILED** with the reason, so "nothing new" is never confused with "blocked".
- Korean residential proxy requests take 3–7 seconds each, slower than datacenter sites. The actor stays at 3 concurrent requests and at most 30 per minute.
- theqoo's rules forbid reposting full news articles, and post bodies can contain text from other outlets. Do not redistribute collected text as is.

### FAQ

**Q: Do I need to log in?**

A: No. The actor only reads public board listings and posts and uses nothing that requires an account.

**Q: How do I find a board ID?**

A: It is in the board URL: `theqoo.net/ktalk` is `ktalk`, `theqoo.net/newjeans` is `newjeans`. You can also paste the URL as is.

**Q: Is the post number enough?**

A: Yes. Give `4370661006` and theqoo redirects to the post's home board (e.g. square), which also ends up in `board`.

**Q: Will a post with many comments cost a lot?**

A: Comments are $0.0005 each, so even 1,000 comments cost about $0.50. To cap it anyway, set `maxReplies`; `maxReplies: 0` fetches the post only and makes no comment requests at all.

**Q: Why not switch to the datacenter proxy?**

A: theqoo's Cloudflare answers datacenter IPs and most foreign IPs with 403 "보안 검사중". Only Korean residential IPs were verified to pass reliably.

**Q: The log shows `[incomplete-data]`.**

A: Some pages or comments could not be fetched after retries. The post itself is in the dataset; only the missing part is logged. Run again a little later or lower `maxItems`.

### 📚 Related tutorials & tools

Hands-on guides and free tools built on this actor, at **[AI Social API](https://aisocialapi.com/?utm_source=apify\&utm_medium=readme\&utm_campaign=theqoo-scraper-en)**:

- 📖 Guide: [theqoo Data: Getting Posts and Comments From Korea's K-pop Community Without an API](https://aisocialapi.com/learn/topics/korea-forums/?utm_source=apify\&utm_medium=readme\&utm_campaign=theqoo-scraper-en)
- 📖 Tutorial: [Build a no-code forum sentiment pipeline with Apify + n8n + GPT](https://aisocialapi.com/learn/apify-n8n-forum-sentiment-pipeline/?utm_source=apify\&utm_medium=readme\&utm_campaign=theqoo-scraper-en)
- 📊 Data: [Asian forum scrapability × cost table](https://aisocialapi.com/tools/forum-scrapability/?utm_source=apify\&utm_medium=readme\&utm_campaign=theqoo-scraper-en) — measured on live runs: which forums need only a plain request, which need a residential IP, and what one item costs
- 🛠 Free tools: [Forum sentiment quick-check](https://aisocialapi.com/tools/forum-sentiment/?utm_source=apify\&utm_medium=readme\&utm_campaign=theqoo-scraper-en) · [Apify cost calculator](https://aisocialapi.com/tools/apify-cost/?utm_source=apify\&utm_medium=readme\&utm_campaign=theqoo-scraper-en)
- 🤝 Rather not run it yourself? [I run it for you](https://aisocialapi.com/monitor/?utm_source=apify\&utm_medium=readme\&utm_campaign=theqoo-scraper-en) — scheduled daily, delivered to your Google Sheet or Slack, from US$299/mo.

Maintained by an operator running 30+ live Apify actors.

### Disclaimer

This tool is for academic research and lawful market analysis only. Users must comply with theqoo's terms of service and applicable law (including Korea's Copyright Act and Personal Information Protection Act), must not redistribute collected text without permission, and must not use the data to identify or track individuals. The author is not responsible for misuse. If the site owner asks for removal, use will stop.

***

theqoo scraper, theqoo API, theqoo.net scraper, 더쿠 scraper, Korean community scraper, K-pop social listening, K-pop fandom monitoring, Korean entertainment data, HOT board, K-idol talk, brand monitoring Korea, export JSON CSV Excel

# Actor input Schema

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

What do you want to collect? Pick a mode, then fill in the matching fields below.

## `boards` (type: `array`):

theqoo board IDs (the {ID} in theqoo.net/{ID}), e.g. hot (HOT), square (Square), ktalk (K-idol talk), beauty, dyb (drama/film/actors), talk (daily talk), or per-artist boards (bts, newjeans, seventeen…). Pasting the board URL works too. Used by Board mode.

## `threadIds` (type: `array`):

theqoo post numbers (the digits in theqoo.net/hot/{number}), e.g. 4371268800. Used by Full post mode.

## `threadUrls` (type: `array`):

Full post URLs, e.g. https://theqoo.net/hot/4371268800. The post number is extracted automatically.

## `bulkInput` (type: `string`):

**One item per line** (press Enter for a new line, no quotes or commas needed). Lines are read as board IDs / post numbers / URLs depending on the mode and merged into the fields above. Copying a whole column from Google Sheets or Excel is the fastest way.

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

(Optional) Board mode: keep only posts whose title contains at least one keyword. theqoo disables search for logged-out visitors, so this filters the titles of the boards you list rather than searching the whole site. Leave empty for no filter. With keywords, each board is scanned for at most 20 pages (about 400 posts).

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

Board mode: max posts per board. Full post mode: max number of posts (every comment of each post is fetched; set "Max comments per post" to limit that). Up to 500.

## `maxReplies` (type: `integer`):

Full post mode. Keep only comments #1 to #N (by comment number) of each post. Comments are billed as comment-item events; deleted comments and comments hidden from logged-out visitors (under 1 hour old) are never billed. 0 = post only, empty = all (default). Unrelated to "Max items" (number of posts).

## `dateFrom` (type: `string`):

Board mode, by post time. Relative 30m, 12h, 3d, 2w, or a date such as 2026-10-01 (midnight Korea time). Empty = no filter. When set, paging stops as soon as an older page is reached, which keeps scheduled runs cheap. Board lists show only the minute for today's posts and only the date for older ones, so a date-only post counts as the whole day.

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

theqoo blocks datacenter IPs with a Cloudflare security check (403 "보안 검사중"). Only the default Apify RESIDENTIAL + country KR was verified to pass reliably, so keep it unless you bring your own proxy.

## Actor input object example

```json
{
  "mode": "board",
  "boards": [
    "hot"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "mode": "board",
    "boards": [
        "hot"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("claude_code_reviewer/theqoo-scraper-en").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 = {
    "mode": "board",
    "boards": ["hot"],
}

# Run the Actor and wait for it to finish
run = client.actor("claude_code_reviewer/theqoo-scraper-en").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 '{
  "mode": "board",
  "boards": [
    "hot"
  ]
}' |
apify call claude_code_reviewer/theqoo-scraper-en --silent --output-dataset

```

## MCP server setup

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

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/irXTgeUYKcq2x5siX/builds/8K8I8qknUryxKybop/openapi.json
