# Incruit Job Scraper — Korea Jobs, Salaries & Hiring Companies (`youfuxu/incruit-korea-jobs-scraper`) Actor

Scrape job postings from Incruit (incruit.com), one of Korea's largest job boards. Titles, companies, locations, experience and education requirements, employment type, deadlines, salaries (KRW) and full descriptions as clean JSON.

- **URL**: https://apify.com/youfuxu/incruit-korea-jobs-scraper.md
- **Developed by:** [Youfu Xu](https://apify.com/youfuxu) (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 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?

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

## Incruit Job Scraper — Korea jobs, salaries & hiring companies

Get clean, structured job data from **[Incruit](https://www.incruit.com)** (인크루트) — one of South Korea's three largest job boards, running since 1998 and carrying tens of thousands of live postings from startups, SMEs, public institutions and staffing agencies. Search any keyword in Korean or English and download the results as JSON, CSV or Excel. No login, no browser, no proxy setup — and the EUC-KR encoding Incruit still serves is handled for you, so Korean text comes out clean.

### What you get

Run it with the default input and every job looks like this (detail mode on):

```json
{
  "title": "파이썬(Python) 개발자 모집",
  "companyName": "(주)오토패스",
  "location": "경기 파주시",
  "career": "경력무관",
  "education": "학력무관",
  "employmentType": "정규직",
  "jobCategories": ["응용개발자"],
  "salaryText": "연봉 3,000 ~ 3,600만원",
  "salaryMin": 30000000,
  "salaryMax": 36000000,
  "salaryCurrency": "KRW",
  "salaryPeriod": "year",
  "deadlineText": "채용시",
  "isRollingDeadline": true,
  "validThrough": "2026-10-19",
  "datePosted": "2026-08-20",
  "postedText": "19시간전 등록",
  "applyMethod": "",
  "employmentTypeCode": "FULL_TIME",
  "streetAddress": "경기도 파주시 경의로 1114 403호 (야당동)",
  "postalCode": "10908",
  "addressRegion": "경기도",
  "addressLocality": "파주시",
  "description": "주식회사 오토패스\n파이썬(Python) 개발자 모집\n직무내용\n[파이썬(Python) 개발자 모집]\n/모집직종 : 백엔드 개발자 / 2명\n/채용 필수사항\n1. 중기부 스타트업 AI 기술인력 사업(이어드림스쿨) 수료자…",
  "url": "https://job.incruit.com/jobdb_info/jobpost.asp?job=2608200003469",
  "jobId": "2608200003469",
  "scrapedAt": "2026-08-21T02:22:37.584Z"
}
```

**24 fields per job straight from the search results** — title, company (with Incruit company profile link and badges such as 우수기업), location, required experience, education, employment type, job categories, deadline (raw text plus an ISO date), how long ago it was posted, and whether one-click apply is available.

Turn on **Include detail page data** and each job grows to **41 fields**: the salary line and its parsed KRW `salaryMin` / `salaryMax` / `salaryPeriod`, the exact `datePosted` and `validThrough` dates, the full job description as plain text and cleaned HTML, benefits, the office street address and postcode, and company facts — industry, company size, founded date, website and logo.

### Who uses this

- **Recruiters & staffing agencies** — see which Korean companies are hiring for which roles, at what experience level, before the deadline passes
- **Salary benchmarking** — Korean salary strings like `연봉 3,000 ~ 3,600만원` or `월급 250만원` are converted to numeric KRW with a period, so you can chart them instead of parsing them
- **Lead generation** — every detail row carries the hiring company, its industry, headcount, founded date, website and address
- **Job boards & alert bots** — poll a keyword daily with `sortBy: "reg"` and diff against yesterday's dataset to catch new postings
- **Market research** — count how many Korean employers are hiring for AI, semiconductor, nursing, logistics or marketing roles right now, and where

### How to use

1. Enter a **keyword** — `python`, `데이터 엔지니어`, `마케팅`, `간호사`, `반도체` all work (Korean or English)
2. Pick a **sort order** — relevance (default), newest first, recently updated, deadline soonest, most viewed, most applicants
3. Set **Max jobs** (default 50; Incruit lists 30 per page)
4. Optionally enable **Include detail page data** for salaries, descriptions, addresses and company facts
5. Run, then download from the **Dataset** tab as JSON / CSV / Excel, or pull it through the Apify API

#### Example input

```json
{
  "keyword": "데이터 엔지니어",
  "sortBy": "reg",
  "maxItems": 200,
  "includeDetails": true
}
```

### Fields

| Field | Mode | Description |
| --- | --- | --- |
| `url` | list | Link to the job posting on Incruit |
| `jobId` | list | Incruit's posting number |
| `title` | list | Job title |
| `companyName` | list | Hiring company (or the staffing agency posting on its behalf) |
| `companyUrl` | list | Incruit company profile, when the company has one |
| `companyBadges` | list | Incruit badges such as `우수기업` (featured employer), `비영리단체` |
| `location` | list | Work location, e.g. `서울 강남구`, `경기 성남시 분당구` |
| `career` | list | Experience requirement, e.g. `신입`, `경력 3년↑`, `경력무관` |
| `education` | list | Education requirement, e.g. `대졸↑`, `학력무관` |
| `employmentType` | list | `정규직` (permanent), `계약직` (contract), `프리랜서`, `인턴`, `병역특례`… |
| `jobCategories` | list | Incruit job categories, e.g. `["웹개발자", "AI·빅데이터"]` |
| `deadlineText` | list | Deadline as shown, e.g. `~09.20 (일)`, `채용시` (until filled), `23시 마감` |
| `deadline` | list | ISO date derived from the deadline (replaced by `validThrough` in detail mode) |
| `isRollingDeadline` | list | `true` for 채용시 / 상시 postings that stay open until filled |
| `postedText` | list | `19시간전 등록`, `3일전 수정` |
| `postedAt` | list | Approximate timestamp from `postedText`; exact `datePosted` in detail mode |
| `applyMethod` | list | `바로지원` (one-click apply on Incruit), `홈페이지 지원` (apply on company site), or empty |
| `salaryText` | detail | Salary line as written, e.g. `연봉 3,000 ~ 3,600만원`, `회사내규`, `협의` |
| `salaryMin` / `salaryMax` | detail | Parsed KRW amounts (`null` when the employer does not disclose pay) |
| `salaryCurrency` / `salaryPeriod` | detail | `KRW` and `year` / `month` / `week` / `day` / `hour` |
| `description` | detail | Full posting text, line-broken |
| `descriptionHtml` | detail | Posting HTML with inline styles stripped |
| `datePosted` / `validThrough` | detail | Exact posting and expiry dates from Incruit's structured data |
| `employmentTypeDetail` | detail | Employment type with extras, e.g. `프리랜서 [근무기간: 2개월]` |
| `employmentTypeCode` | detail | schema.org code: `FULL_TIME`, `CONTRACTOR`, `OTHER`… |
| `benefits` | detail | Benefits list, e.g. `["주5일근무", "연차", "퇴직금", …]` |
| `streetAddress` / `postalCode` / `addressRegion` / `addressLocality` | detail | Workplace address |
| `companyWebsite` / `companyLogoUrl` | detail | Company site and logo, when published |
| `companySize` / `industry` / `foundedDate` / `companyType` | detail | e.g. `중소기업 (사원수 57명)`, `소프트웨어·솔루션·ASP`, `2019년 10월 25일`, `스타트업` |
| `scrapedAt` | list | When this row was collected |

### Notes on reliability

- Incruit is a classic ASP site served in **EUC-KR**. The Actor decodes every page with the charset the server declares, so Korean never comes back as mojibake
- Requests are paced (about one page per 1.2 s, two requests per job in detail mode) and retried with exponential back-off on HTTP 429 / 5xx, so long exports finish instead of failing halfway
- Results are de-duplicated by `jobId` across pages, and the run stops cleanly at the last page of results
- Jobs that do not disclose pay come back with the original text (`회사내규`, `협의`) and `null` amounts rather than a misleading `0`

### Limitations

- Salary, description, address and company facts live on the detail page, so they are only filled when **Include detail page data** is on
- Incruit does not print a total match count, so the log reports pages as they are read rather than a total up front
- Roughly a third of Incruit postings disclose a salary; the rest say 회사내규 (company policy) or 협의 (negotiable), which is returned verbatim
- `postedAt` in list mode is derived from relative text like `3일전` and is approximate to the day; use detail mode for the exact `datePosted`

### Legal

This Actor reads publicly listed job postings only, does not log in and does not bypass any access control. Respect Incruit's terms of service and applicable law when using the data.

# Actor input Schema

## `keyword` (type: `string`):

What to search for on Incruit, e.g. <code>python</code>, <code>데이터 엔지니어</code>, <code>마케팅</code>, <code>간호사</code>. Korean and English both work — Incruit matches job titles, company names and posting text.

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

How Incruit should order the results before we read them. <code>rank</code> = relevance (Incruit default), <code>reg</code> = newest postings first, <code>mod</code> = recently updated, <code>invite</code> = deadline soonest, <code>viewcnt</code> = most viewed, <code>applycnt</code> = most applicants.

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

Maximum number of jobs to return (Incruit lists 30 per page). Keep it small for a quick test, raise it for a full export.

## `includeDetails` (type: `boolean`):

Visit each job page to add the salary (text + parsed KRW min/max), exact posted date and deadline, full job description (text + HTML), benefits, office address, and company facts (industry, size, founded date, website, logo). Two extra requests per job, so it is noticeably slower — the search results already include title, company, location, experience, education, employment type, job category, deadline and apply method without it.

## Actor input object example

```json
{
  "keyword": "python",
  "sortBy": "rank",
  "maxItems": 50,
  "includeDetails": false
}
```

# Actor output Schema

## `datasetItemsJson` (type: `string`):

All scraped records as a JSON array.

## `datasetItemsCsv` (type: `string`):

All scraped records as a CSV file.

## `datasetItemsXlsx` (type: `string`):

All scraped records as an Excel workbook.

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

The default dataset of this run in Apify Console.

# 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 = {
    "keyword": "python",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("youfuxu/incruit-korea-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 = {
    "keyword": "python",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("youfuxu/incruit-korea-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 '{
  "keyword": "python",
  "maxItems": 50
}' |
apify call youfuxu/incruit-korea-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,youfuxu/incruit-korea-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/LOV6cFpUqzGevjbuJ/builds/fkFaLknIfTGKr5fKy/openapi.json
