# Inflearn Scraper — Korean Online Course Catalog (edtech) (`kdatafactory/inflearn-scraper`) Actor

Scrape Inflearn (인프런), Korea's biggest dev/skills online-course marketplace: title, instructor, KRW price, discount price, rating, review & student counts, category and image as clean JSON. Public catalog only, no learner PII. For edtech research and AI agents.

- **URL**: https://apify.com/kdatafactory/inflearn-scraper.md
- **Developed by:** [Seok June Park](https://apify.com/kdatafactory) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Inflearn Scraper — Korean Online Courses 🎓

Scrape the live **online-course catalog** from [Inflearn (인프런)](https://www.inflearn.com) — **Korea's biggest developer & professional-skills learning platform** (6,000+ online courses) — as clean, structured JSON. Get title, instructor, price (KRW), sale price, rating, review count, student count, and category for every course in one run.

The go-to dataset for **edtech market research** in Korea: track what's selling, how it's priced, and which instructors and categories dominate. Perfect for competitor benchmarking, course-pricing analysis, and feeding AI agents.

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

---

### What it does

This actor reads course data straight from Inflearn's own public search API (the same endpoint the website calls as you browse and search), so results are fast and complete — no fragile full-page scraping, no headless browser. You can scrape:

- **The whole catalog** (browse all online courses), or
- **A specific search** (e.g. `파이썬`, `React`, `데이터 분석`).

Results can be sorted by Inflearn's recommended order, popularity, or newest. When you supply a search keyword, the actor automatically uses relevance ordering (Inflearn blocks "recommended" sorting on keyword searches).

> **Why Inflearn?** Inflearn is Korea's #1 online-course marketplace for IT, development, AI, data, design, and business skills — the local equivalent of Udemy. If you want a live, structured view of the Korean edtech market — pricing, ratings, enrolment, and category mix — this is the source. This actor turns that catalog into a dataset you can filter, price-model, and pipe into your own tools.

---

### Input

| Field | Type | Description |
|-------|------|-------------|
| `query` | string | Optional search keyword, e.g. `파이썬`, `React`, `데이터 분석`. Blank = browse the whole catalog. |
| `sort` | string | `RECOMMEND` (recommended), `POPULAR`, or `RECENT` (newest). Default `RECOMMEND`. On keyword searches the actor auto-switches to relevance order. |
| `maxItems` | integer | Max courses to collect. Default `100`, max `10000`. |
| `proxyConfiguration` | object | Proxy settings (see below). Defaults to a direct connection. |

#### Input example

```json
{
  "query": "파이썬",
  "sort": "POPULAR",
  "maxItems": 200
}
````

```json
{
  "query": "",
  "sort": "RECOMMEND",
  "maxItems": 500
}
```

***

### Output

Each course is one dataset record. `price_krw` is the regular list price in Korean won (`0` for free courses). `discount_price_krw` is the current sale price when a course is discounted, else `null`. `rating` is the average star rating (`null` for brand-new courses with no ratings yet). `title` keeps the full original course name.

```json
{
  "source": "inflearn",
  "course_id": "339317",
  "title": "클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지",
  "instructor": "짐코딩",
  "price_krw": 198000,
  "discount_price_krw": null,
  "rating": 4.9,
  "review_count": 1206,
  "student_count": 9549,
  "category": "AI 기술",
  "url": "https://www.inflearn.com/course/클로드-코드-완벽-마스터-ai-개발?cid=339317",
  "image_url": "https://cdn.inflearn.com/public/files/courses/339317/cover/01knkcagd40y7q9573t8t1x4s7.gif",
  "scraped_at": "2026-07-14T14:46:59+09:00"
}
```

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

| Field | Meaning |
|-------|---------|
| `source` | Always `"inflearn"`. |
| `course_id` | Inflearn course ID (string). |
| `title` | Full course title (Korean, authoritative). |
| `instructor` | Public instructor / creator name, as Inflearn shows it. |
| `price_krw` | Regular list price in KRW. `0` for free courses (never `null`). |
| `discount_price_krw` | Current sale price in KRW when on sale, else `null`. |
| `rating` | Average star rating (0–5), or `null` when the course has no ratings yet. |
| `review_count` | Number of reviews (`0` for new courses). |
| `student_count` | Number of enrolled students. |
| `category` | Primary top-level category (e.g. `개발 · 프로그래밍`, `AI 기술`, `게임 개발`). Best-effort — see limitations. |
| `url` | Course detail page URL. |
| `image_url` | Cover thumbnail URL. |
| `scraped_at` | ISO-8601 timestamp (KST, UTC+9). |

The core fields — `course_id`, `title`, `instructor`, `price_krw`, `review_count`, `student_count`, `category`, `url`, `image_url` — populated on **30/30** records in the live test. `rating` (25/30) is `null` only for brand-new, unrated courses, and `discount_price_krw` (20/30) is `null` for courses not currently on sale (see Known limitations).

***

### Use cases

- **Edtech market research** — build a live, filterable catalogue of Korea's online-course market (price, ratings, enrolment, category) to size demand, spot trends, and track what's selling.
- **Competitor benchmarking** — monitor a competitor's course line-up, pricing, ratings, and student counts over time; compare category coverage and instructor rosters.
- **Course-pricing analysis** — track `price_krw` vs `discount_price_krw`, rating, and `student_count` to model price elasticity, discount depth, and revenue proxies across the catalog.
- **AI agents & datasets** — feed structured course data into pricing models, dashboards, or LLM agents.

***

### ❓ FAQ

**Is it legal to scrape this data?**
This actor collects only public, non-personal catalog data — the same courses any visitor sees on inflearn.com without logging in. No learner or reviewer personal data is collected. 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 (launch pricing) + 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** (5 ÷ 2 × 1,000).

**Do I need to configure proxies?**
No — the default settings work out of the box. Inflearn serves its course-search API without a bot wall, so the actor runs fine on a **direct connection**. For very heavy pulls you can optionally enable Apify Proxy — see the proxy note below.

**How fresh is the data?**
Every run scrapes the live Inflearn catalog at run time. Schedule the actor for recurring snapshots (e.g. daily price/rating tracking).

**What is NOT included?**
Learner and reviewer personal data (we deliberately drop the API's per-course reviewer names), full curriculum/lesson lists, and instructor contact details. Titles and categories are Korean strings. `rating` is `null` for unrated new courses; `discount_price_krw` is `null` when a course isn't on sale.

***

### 🤖 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/inflearn-scraper",
      "headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }
    }
  }
}
```

Your agent can then pull Inflearn course listings and Korean edtech market data 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:

- **[yes24-bestseller-scraper](https://apify.com/kdatafactory/yes24-bestseller-scraper) — bestseller book rankings from YES24, Korea's largest bookstore.** Pair it with this actor for Korean content & learning-market research.
- [korea-trend-feed](https://apify.com/kdatafactory/korea-trend-feed) — trending keywords and rising topics across Korean platforms.

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. It gathers course attributes plus the public instructor/creator name only — it deliberately does **not** collect learner or reviewer personal data (the reviewer names the API exposes are dropped before output).
- Requests are rate-limited: one page at a time with a ≥ 500 ms delay between requests, to stay gentle on Inflearn's servers.
- You are responsible for using the data in line with Inflearn's terms of service and applicable law.

#### Known limitations (honesty note)

- **`rating`** is **best-effort**: brand-new courses with no ratings yet are returned as `null` (≈17% of the live-test sample) rather than a misleading 0.0-star rating. When a course has reviews, its real average rating is returned.
- **`review_count` / `student_count`** are always present as integers but are **`0`** for brand-new courses that haven't gathered reviews / enrolments yet — a real `0`, not missing data.
- **`discount_price_krw`** is `null` whenever a course is **not currently on sale**; it is populated only for actively discounted courses. Sale prices change over time, so this is a snapshot at scrape time.
- **`category`** is the course's **primary top-level category**, chosen best-effort. Courses can span several categories; the full category taxonomy is not flattened into the record. Titles and categories are Korean strings and are not translated.

***

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

# Actor input Schema

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

Optional search keyword, e.g. '파이썬', 'React', '데이터 분석'. Leave blank to browse the whole course catalog.

## `sort` (type: `string`):

How to order courses. 'RECOMMEND' is Inflearn's default recommended order (browse only). When a search keyword is set, RECOMMEND is not available, so the actor automatically uses relevance ('SEARCH') order instead.

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

Maximum number of course records to collect.

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

Proxy settings. Inflearn serves its course-search API without a bot wall, so the actor runs fine on a direct connection (default). If you ever see blocks at high volume, enable Apify Proxy here.

## Actor input object example

```json
{
  "query": "",
  "sort": "RECOMMEND",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("kdatafactory/inflearn-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 = {}

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

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

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

```

## CLI example

```bash
echo '{}' |
apify call kdatafactory/inflearn-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kdatafactory/inflearn-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Inflearn Scraper — Korean Online Course Catalog (edtech)",
        "description": "Scrape Inflearn (인프런), Korea's biggest dev/skills online-course marketplace: title, instructor, KRW price, discount price, rating, review & student counts, category and image as clean JSON. Public catalog only, no learner PII. For edtech research and AI agents.",
        "version": "0.1",
        "x-build-id": "LjjCqc0mPguEx2PiE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kdatafactory~inflearn-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kdatafactory-inflearn-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kdatafactory~inflearn-scraper/runs": {
            "post": {
                "operationId": "runs-sync-kdatafactory-inflearn-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kdatafactory~inflearn-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-kdatafactory-inflearn-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "query": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Optional search keyword, e.g. '파이썬', 'React', '데이터 분석'. Leave blank to browse the whole course catalog.",
                        "default": ""
                    },
                    "sort": {
                        "title": "Sort order",
                        "enum": [
                            "RECOMMEND",
                            "POPULAR",
                            "RECENT"
                        ],
                        "type": "string",
                        "description": "How to order courses. 'RECOMMEND' is Inflearn's default recommended order (browse only). When a search keyword is set, RECOMMEND is not available, so the actor automatically uses relevance ('SEARCH') order instead.",
                        "default": "RECOMMEND"
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of course records to collect.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Inflearn serves its course-search API without a bot wall, so the actor runs fine on a direct connection (default). If you ever see blocks at high volume, enable Apify Proxy here.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
