# JobKorea Scraper (`santamaria-automations/jobkorea-kr-scraper`) Actor

Scrape JobKorea jobs by Korean or English keyword. Returns title, company, salary in KRW, HR contact, headcount, working hours, experience and education required, benefits, company size, industry and website. Pay per result.

- **URL**: https://apify.com/santamaria-automations/jobkorea-kr-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 serp 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

## JobKorea Scraper: Korean Job Listings (잡코리아)

Extract job listings from [JobKorea](https://www.jobkorea.co.kr) (잡코리아), South Korea's flagship general-purpose job board operated by INCRUIT Corp. JobKorea covers all industries and seniority levels across the Korean job market, from large conglomerates (chaebols) to startups. Content is in Korean; all fields are returned as-is.

### What it does

Given one or more search keywords (Korean or English), or a direct search URL, the actor pages through JobKorea search results and extracts each job card. With `includeJobDetails` enabled, it also fetches each job's detail page for the full description, exact address, employment type, salary, apply URL, HR contact (name, department, phones, email), headcount, working hours, education and experience requirements, nearest subway, company size, type and industry, benefits, and skills.

- Search by Korean keyword (`개발자`, `마케팅`, `디자이너`) or English (`software engineer`, `data analyst`)
- Browse all roles or filter by keyword
- SERP mode returns core fields from the search page alone
- Full detail mode fetches the complete description from JobKorea's content storage, plus the full recruitment block (모집요강), qualifications (지원자격), application method (접수방법), HR contact (인사담당자), and company info (기업 정보)

### Sample output

```json
{
  "_type": "job",
  "id": "49660470",
  "title": "[토스인슈어런스] Server Developer(Finance)",
  "job_url": "https://www.jobkorea.co.kr/Recruit/GI_Read/49660470",
  "source_url": "https://www.jobkorea.co.kr/Recruit/GI_Read/49660470",
  "source_platform": "jobkorea.co.kr",
  "company_name": "㈜비바리퍼블리카",
  "company_logo_url": "https://www.jobkorea.co.kr/Images/Logo/128/v/i/example.gif",
  "company_website": null,
  "location": "서울 구로구 경인로 662 (신도림동, 디큐브시티) 37층, 토스인슈어런스",
  "country": "KR",
  "posted_at_text": "2026-07-27T15:10:38.25+09:00",
  "posted_at_datetime": "2026-07-27T06:10:38Z",
  "posted_at": "2026-07-27T06:10:38Z",
  "employment_type": "full-time",
  "salary_min": 28000000,
  "salary_max": 45000000,
  "salary_currency": "KRW",
  "salary_period": "annual",
  "salary_text": "연봉 2,800~4,500만원",
  "region": "서울",
  "city": "금천구",
  "location_address": "서울 금천구 가산디지털2로 101 (가산동) 한라원앤원타워 B동 1808호",
  "job_category": "실내건축업 인테리어 디자이너",
  "headcount": 2,
  "position_level": "주임~대리급, 과장~차장급",
  "working_hours": "주5일(월~금) 09:00 ~ 18:00",
  "nearby_station": "가산디지털단지 (1호선) 600m (도보 9분)",
  "experience_required": "경력무관",
  "education_required": "학력무관",
  "core_competencies": ["성실성", "협동심"],
  "application_start_at": "2026-09-28T15:00:00Z",
  "apply_method": "잡코리아 즉시지원",
  "application_form": "잡코리아 이력서",
  "direct_apply": true,
  "contact_name": "양선호",
  "contact_department": "총괄기획팀",
  "company_size": "50명 이하",
  "company_type": "중소기업 (비상장)",
  "company_industry": "인테리어·자재",
  "company_address": "서울 금천구 가산디지털2로 101 (가산동)",
  "company_profile_url": "https://www.jobkorea.co.kr/Recruit/Co_Read/C/47207996",
  "company_founded_year": 2024,
  "benefits": ["연차제도", "국민연금", "상여금"],
  "tags": ["리모델링", "인테리어"],
  "closing_at": "2026-08-26T14:00:00Z",
  "view_count": 1520,
  "description": "서버 개발자를 모집합니다...",
  "description_snippet": "서버 개발자를 모집합니다...",
  "description_full": "서버 개발자를 모집합니다...\n\n주요 업무...",
  "description_html": "<div>...</div>",
  "description_md": "## 주요 업무\n- 서버 개발...",
  "skills": ["kotlin", "java", "서버구축"],
  "apply_url": "https://toss.im/career/job-detail?job_id=4071141003",
  "contact_emails": ["recruit@toss.im"],
  "contact_phones": ["070-4113-1021"],
  "contact_urls": [],
  "search_query": "개발자",
  "scraped_at": "2026-08-24T10:00:00Z"
}
```

### Pricing

Pay per event. You pay only for results delivered.

| Event | Price | When |
|---|---|---|
| Actor start | $0.001 | once per run |
| SERP result | $0.003 | every job returned |
| Detail result | $0.005 | every job when `includeJobDetails` is on, in addition to the SERP result |

Typical cost: **$3 per 1,000 jobs** in SERP mode, **$8 per 1,000 jobs** with `includeJobDetails` on ($0.003 + $0.005 per job), plus $0.001 per run start. Detail mode adds the full description, exact address, apply URL, contact email, and skills.

**New to Apify?** Every account gets a $5 free monthly platform credit, enough for roughly 1,600 SERP rows or 600 full-detail rows before you pay anything.

### Speed and scale

- SERP mode returns 20 jobs per page and finishes about 60 jobs in roughly 15 seconds.
- Detail mode fetches one extra page per job; 10 jobs take about 80 seconds at the default concurrency of 4. Raise `maxConcurrency` (up to 20) to speed it up.
- Up to 1,000 results per keyword (50 pages of 20).
- Runs on 128 MB of memory.

### Example input

```json
{
  "searchQueries": ["개발자", "마케팅"],
  "sortBy": "newest",
  "includeJobDetails": false,
  "maxResults": 40,
  "maxResultsPerQuery": 20
}
```

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `sortBy` | string enum | `newest` | Result order: `newest`: most recently posted first (등록일순); `relevance`: JobKorea relevance score (관련도순); `closingSoon`: application deadline soonest first (마감임박순); `mostViewed`: most-viewed listings first (조회수순). |
| `searchQueries` | array of strings | - | Korean or English keywords. Each runs as a separate search. Leave empty for startUrls mode. |
| `startUrls` | array of strings | - | Direct JobKorea search URLs. Wins over `searchQueries` when both are set. |
| `includeJobDetails` | boolean | false | Fetch each job's detail page for description, address, employment type, salary, apply URL, HR contact, recruitment and qualification blocks, company info, and skills. Each job then costs $0.008 in total ($0.003 + $0.005). |
| `includeCompanyDetails` | boolean | true | In detail mode, also open the employer's JobKorea company profile for the homepage and founding year. One cached request per employer, no extra charge. |
| `maxResults` | integer | 5 | Total cap across all keywords. |
| `maxResultsPerQuery` | integer | 5 | Cap per individual keyword. |
| `maxConcurrency` | integer | 4 | Parallel detail-page requests when `includeJobDetails` is on. |

### What you get

| Field | Type | Filled in | Notes |
|---|---|---|---|
| `id`, `title`, `job_url`, `source_url`, `source_platform` | string | always | Canonical JobKorea listing URL |
| `company_name`, `company_logo_url` | string or null | always | Logo is null when the employer has none |
| `company_website` | string or null | detail mode, about half of employers | Homepage from the JobKorea company profile; needs `includeCompanyDetails` |
| `location` | string or null | always | Korean region name such as "서울 강남구" in SERP mode; full street address in detail mode |
| `country` | string | always | Always `KR` |
| `posted_at_text`, `posted_at_datetime`, `posted_at` | string | always | Raw timestamp and ISO 8601 UTC (`posted_at` equals `posted_at_datetime`) |
| `closing_at` | string or null | always | Application deadline, ISO 8601 UTC; null for open-ended (rolling) hiring |
| `view_count` | integer | always | Views reported by JobKorea |
| `salary_min`, `salary_max`, `salary_currency`, `salary_period` | number or string | about 15% | KRW for the period in `salary_period` (`annual`, `monthly`, `hourly`, `daily`); often "per company policy", then null |
| `salary_text` | string or null | detail mode, when an amount is shown | 급여 row as printed, for example `연봉 2,800~4,500만원` |
| `employment_type` | string or null | detail mode | full-time, contract, part-time, internship, freelance |
| `skills` | array | detail mode | Hard skills (AutoCAD, Python); falls back to keyword tags |
| `tags` | array | detail mode | Related keyword tags |
| `core_competencies` | array | detail mode, some postings | 핵심역량 |
| `benefits` | array | detail mode, some postings | Benefit codes, highlighted perks, and free-text 기타 복리후생 |
| `apply_url` | string | always | Employer homepage apply link when given, otherwise the JobKorea listing URL |
| `contact_emails`, `contact_phones` | array | detail mode, about 10-20% | HR email and phones when the employer exposes them |
| `contact_name`, `contact_department` | string or null | detail mode, most postings | 인사담당자; many employers enter a generic title such as 채용담당자 |
| `contact_urls` | array | never | Always empty, JobKorea exposes none |
| `job_category`, `headcount`, `position_level`, `working_hours` | string / integer | detail mode | 모집분야, 모집인원 (null when shown as ○명), 직급/직책, 근무시간 |
| `region`, `city`, `location_address`, `nearby_station` | string or null | detail mode | Address parts and nearest subway with walking distance |
| `experience_required`, `education_required` | string | detail mode | 경력 and 학력 rows |
| `application_start_at`, `apply_method`, `application_form`, `direct_apply`, `identifier` | string / boolean | detail mode | 접수기간 and 접수방법 blocks plus JSON-LD `directApply` |
| `company_size`, `company_type`, `company_industry`, `company_address`, `company_profile_url`, `company_founded_year` | string / integer | detail mode | 기업 정보 block and company profile |
| `description`, `description_snippet`, `description_full`, `description_html`, `description_md` | string or null | detail mode | `description` is the first 500 characters (kept for compatibility); `description_snippet` is at most 300 characters cut at a word boundary |
| `search_query`, `scraped_at` | string | always | Keyword that produced the row and scrape time |

### Notes and limits

- Content is primarily in Korean. Job titles, company names, locations, and descriptions are returned as-is (Korean Unicode).
- Some listings use image-only descriptions (uploaded as PNG); in those cases `description_html` will contain an image tag rather than text, and `description_full` will be empty.
- JobKorea returns 20 results per page. Pagination is capped at 50 pages per keyword (1,000 results max per query).
- Salary is often listed as "회사 내규에 따름" (per company policy) or decided after interview; in those cases salary fields are null.
- `contact_emails` surfaces the HR manager email when the employer marks it as exposable. Many employers do not expose it, so the field is commonly empty.

### Use with AI agents (MCP)

Call this actor from Claude, Cursor, or any MCP client through the Apify MCP server:

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

For per-tool schemas and copy-paste snippets for MCP clients, see the [MCP tab](https://console.apify.com/actors/ZkagOuKwt869EwJTw/info/api/mcp?build=latest).

Example prompt: "Find the 20 newest 개발자 jobs on JobKorea and list company, region, and deadline."

For the API endpoints and client code, open the [API tab](https://console.apify.com/actors/ZkagOuKwt869EwJTw/info/api) of this actor.

### Related Actors

- [Seek Scraper](https://apify.com/santamaria-automations/seek-scraper): jobs from Seek, the leading board in Australia and New Zealand, for broader APAC coverage.
- [Naukri Scraper](https://apify.com/santamaria-automations/naukri-scraper): India's largest job board, a natural companion when building Asian market datasets.
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper): global generalist job board, useful for comparing Korean listings against the wider international market.
- [Glassdoor Scraper](https://apify.com/santamaria-automations/glassdoor-scraper): jobs with company ratings and salary estimates.
- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): scrape jobs directly from company career pages (Greenhouse, Lever, Workday, and more).
- [Website Email Scraper](https://apify.com/santamaria-automations/website-email-scraper): find emails on employer websites.
- [Website Contact Extractor](https://apify.com/santamaria-automations/website-contact-extractor): pull contact details from employer websites.

### Support

- **Questions or issues?** Email contact@nanoscrape.com, we typically reply within 6 hours. You can also open a ticket in the [Issues tab](https://console.apify.com/actors/ZkagOuKwt869EwJTw/info/issues) on the actor page.
- **Feature request for this actor?** Open a ticket in the [Issues tab](https://console.apify.com/actors/ZkagOuKwt869EwJTw/info/issues) or email contact@nanoscrape.com with the platform field you need and (if possible) a URL that shows the data live.
- **Need a scraper for a job board we don't cover yet?** Email contact@nanoscrape.com with the target site and your rough usage volume. We ship one-off boards regularly.

# Actor input Schema

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

Order in which results are returned. newest (default): jobs posted most recently first (등록일순). relevance: JobKorea relevance score (관련도순). closingSoon: application deadline soonest first (마감임박순). mostViewed: most-viewed listings first (조회수순).

## `searchQueries` (type: `array`):

One or more Korean or English job titles to search for on jobkorea.co.kr (for example '개발자', 'software engineer', '마케팅'). Each keyword runs as a separate search. Results are deduplicated by job ID. Leave blank if you supply startUrls instead.

## `startUrls` (type: `array`):

Direct JobKorea search URLs to crawl instead of building searches from keywords. Example: https://www.jobkorea.co.kr/Search/?stext=developer\&tabType=recruit. Mutually exclusive with searchQueries: provide one or the other.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page for the full description (from S3), exact address, employment type, salary, apply URL, contact email, and skills. Adds one extra HTTP request per job. Each job then costs $0.008 in total ($0.003 search result plus $0.005 detail result), against $0.003 without details.

## `includeCompanyDetails` (type: `boolean`):

In detail mode, also open the employer's JobKorea company profile to read the homepage (company\_website) and founding year. Adds one request per new employer (cached within a run). No extra charge.

## `maxResults` (type: `integer`):

Total result cap across all search keywords.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per individual search keyword.

## `maxConcurrency` (type: `integer`):

Number of detail pages to fetch in parallel when includeJobDetails is enabled.

## Actor input object example

```json
{
  "sortBy": "newest",
  "searchQueries": [
    "개발자"
  ],
  "includeJobDetails": false,
  "includeCompanyDetails": true,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped JobKorea job listings. Each row includes job ID, title, company name and logo, location, posted and closing dates, view count, salary, employment type, skills, apply URL, contact email, and the description quartet (description\_full, description\_snippet, description\_html, description\_md) when includeJobDetails is true. Detail mode also fills job\_category, headcount, position\_level, working\_hours, location\_address, nearby\_station, experience\_required, education\_required, core\_competencies, application\_start\_at, apply\_method, application\_form, direct\_apply, contact\_name, contact\_department, contact\_phones, company\_size, company\_type, company\_industry, company\_address, company\_profile\_url, company\_website, company\_founded\_year, benefits, tags, region and city.

# 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 = {
    "sortBy": "newest",
    "searchQueries": [
        "개발자"
    ],
    "includeJobDetails": false,
    "includeCompanyDetails": true,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/jobkorea-kr-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 = {
    "sortBy": "newest",
    "searchQueries": ["개발자"],
    "includeJobDetails": False,
    "includeCompanyDetails": True,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/jobkorea-kr-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 '{
  "sortBy": "newest",
  "searchQueries": [
    "개발자"
  ],
  "includeJobDetails": false,
  "includeCompanyDetails": true,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 4
}' |
apify call santamaria-automations/jobkorea-kr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/jobkorea-kr-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/ZkagOuKwt869EwJTw/builds/lwmcG5eniRrkYSqLR/openapi.json
