# JobKorea Jobs Scraper (잡코리아 채용공고) (`kasidesk/jobkorea-jobs-scraper`) Actor

Scrapes job listings from JobKorea (잡코리아), Korea's leading job board. Returns titles, companies, locations, experience level, salary, deadlines and keywords as structured JSON.

- **URL**: https://apify.com/kasidesk/jobkorea-jobs-scraper.md
- **Developed by:** [Kasidesk Studio](https://apify.com/kasidesk) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## JobKorea Jobs Scraper (잡코리아 채용공고)

Scrapes job listings from [JobKorea](https://www.jobkorea.co.kr), one of Korea's two dominant job boards. Pick job categories (AI & software, marketing, manufacturing, and 18 more), optionally narrow by region, career level or employment type, and get structured JSON: title, company, location, experience level, salary, deadline, keyword tags, posting time.

No login, no API key, no headless browser. JobKorea serves its listing pages server-side, so this runs on plain HTTP crawling, which keeps it fast and cheap.

I built this because Korean job data is basically absent from the usual sources. Indeed and LinkedIn coverage of Korea is thin, and JobKorea has no public API. This is the third actor in my Korean jobs suite: [Saramin](https://apify.com/kasidesk/saramin-jobs-scraper) (keyword search over Korea's largest board), [Albamon](https://apify.com/kasidesk/albamon-jobs-scraper) (part-time and hourly jobs), and now JobKorea (category browsing, strongest for corporate and enterprise hiring). Together they cover the Korean job market from three angles.

### What people use it for

Labor market analytics: how many AI/data openings went live in Seoul this week, and at which companies. HR tech and recruiting products feed the listings into aggregators, sourcing tools and matching engines - hiring data is the compliant way to know which companies are actively recruiting and for what skills. Lead generation is the less obvious one: a company hiring six backend developers is a company in build mode, which makes hiring data a decent buying-intent signal.

### Use with AI agents (MCP)

This actor works as a live tool for AI agents through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), so an agent can pull live Korean hiring data mid-conversation ("what companies posted AI jobs in Seoul today?"). Point your MCP client (Claude, Cursor, or any MCP-compatible agent) at:

```
https://mcp.apify.com?tools=kasidesk/jobkorea-jobs-scraper
```

For agent calls, pick one category, set `maxItems` to 10-20 and keep `sortBy: "latest"` - responses come back in seconds and stay compact. English input enums and parsed output fields mean agents never have to handle Korean text to filter.

### Input

```json
{
    "dutyCategories": ["10031"],
    "localCodes": ["I000"],
    "sortBy": "latest",
    "maxItems": 200
}
```

- `dutyCategories` - job-function categories (multi-select in the UI; 10031 is AI & Software & Data). Each selection runs as its own crawl
- `dutyCodes` - optional fine-grained duty codes for specific roles (e.g. `1000186` for web planning). The full code list is in the checkbox values on [jobkorea.co.kr/recruit/joblist](https://www.jobkorea.co.kr/recruit/joblist?menucode=duty)
- `localCodes` - optional regions (Seoul is `I000`); combined as category x region
- `careerTypes`, `jobTypes` - optional experience / employment-type filters
- `sortBy` - `latest` (default), `deadline` (closing soonest) or `recommended`
- `maxItems` - total cap across all filter combinations (duplicates are removed)
- `scrapeJobDetails` - visits each job's detail page for salary, working hours, full address, openings and a description summary. Roughly doubles the request count, so it's off by default
- `proxyConfiguration` - leave the default (residential, KR)

Keyword search is deliberately not included: JobKorea's robots.txt disallows its search endpoints, and this actor stays on the allowed listing paths. Category + region browsing covers the same ground for monitoring use cases.

### Output

One item per listing:

```json
{
    "id": "49742362",
    "title": "(증평) React UI 개발, 체제비지원, 삼시세끼제공",
    "company": "㈜고려진단",
    "companyId": "29653675",
    "url": "https://www.jobkorea.co.kr/Recruit/GI_Read/49742362",
    "location": "충북 증평군 외",
    "experience": "경력6년↑",
    "education": "학력무관",
    "employmentType": "프리랜서",
    "salary": "270~300만원(월)",
    "positionLevel": "팀원",
    "keywords": ["React", "UI개발", "프론트엔드", "웹개발"],
    "postedAt": "2026-08-07T09:38:00.000Z",
    "postedAtRaw": "22분 전 등록",
    "deadline": "~09/06(일)",
    "deadlineDate": "2026-09-06",
    "filter": "dutyCtgr=10031"
}
```

Korean labels from the site (경력, 학력, 급여 and so on) are parsed into English field names, relative posting times ("22분 전 등록") are converted to ISO timestamps, and deadline dates get their year inferred. You don't need to read Korean to use the output.

With `scrapeJobDetails` on, items get an extra `details` object with salary, working hours, full street address, openings count, employment type in schema.org format, and the posting's description summary - sourced from the page's structured data, which is more stable than markup scraping.

### Notes

Only public data, and only robots.txt-allowed paths. There's no login involved, nothing scraped from behind authentication, and no personal data - job postings are public advertisements. Standard disclaimer: you're responsible for how you use the data.

Deadlines like 상시채용 (rolling) don't map to a date, so `deadlineDate` is null and the raw string is kept in `deadline`.

If a run comes back empty or a field stops populating, JobKorea probably changed their markup. Open an issue and I'll usually have a fix out within a day - I run this daily myself, so breakage tends to get caught fast.

For keyword-based search over Korean jobs, use the [Saramin scraper](https://apify.com/kasidesk/saramin-jobs-scraper). For part-time and hourly jobs, use the [Albamon scraper](https://apify.com/kasidesk/albamon-jobs-scraper).

***

#### 한국어 안내

잡코리아 채용공고를 로그인 없이 구조화된 JSON으로 수집합니다. 직무 카테고리(AI·개발·데이터, 마케팅 등 21종)와 지역·경력·고용형태 필터를 선택하면 공고 제목, 회사명, 지역, 경력·학력 조건, 급여, 마감일, 키워드, 등록 시각을 정리해서 반환합니다. `scrapeJobDetails` 옵션을 켜면 상세 페이지의 급여·근무시간·근무지 주소·모집인원까지 가져옵니다. robots.txt가 허용하는 경로만 사용하고 공개 데이터만 다루며 개인정보는 수집하지 않습니다. 문의는 Issues 탭으로 남겨주세요.

# Actor input Schema

## `dutyCategories` (type: `array`):

JobKorea job-function categories to scrape. Each selected category runs as its own crawl. Leave everything empty (categories, codes and regions) to scrape the whole latest-jobs feed.

## `dutyCodes` (type: `array`):

Fine-grained JobKorea duty codes for specific roles, e.g. 1000186 (web planning). Find codes in the README's code table or in the checkbox values on jobkorea.co.kr/recruit/joblist. Each code runs as its own crawl on top of the categories above.

## `localCodes` (type: `array`):

Limit results to regions. Combined with each selected job category (category x region).

## `careerTypes` (type: `array`):

Filter by required experience. Leave empty for all levels.

## `jobTypes` (type: `array`):

Filter by employment type. Leave empty for all types.

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

latest returns newest postings first, which is what you want for monitoring. deadline returns postings closing soonest. recommended uses JobKorea's own ranking.

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

Total number of listings to collect across all filter combinations.

## `scrapeJobDetails` (type: `boolean`):

Also visit each job's detail page to get salary, working hours, full address, application deadline and the job description summary. Uses roughly twice the requests, so costs more.

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

JobKorea serves Korean residential traffic best, keep the residential KR default.

## Actor input object example

```json
{
  "dutyCategories": [
    "10031"
  ],
  "dutyCodes": [],
  "localCodes": [],
  "careerTypes": [],
  "jobTypes": [],
  "sortBy": "latest",
  "maxItems": 100,
  "scrapeJobDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}
```

# 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 = {
    "dutyCategories": [
        "10031"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "KR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kasidesk/jobkorea-jobs-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 = {
    "dutyCategories": ["10031"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "KR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("kasidesk/jobkorea-jobs-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 '{
  "dutyCategories": [
    "10031"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}' |
apify call kasidesk/jobkorea-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kasidesk/jobkorea-jobs-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/X7YI0hO1buSZEXlDG/builds/TSRqYb8UGA5rW096H/openapi.json
