# Saramin Jobs Scraper (사람인 채용공고) (`kasidesk/saramin-jobs-scraper`) Actor

Scrapes job listings from Saramin (사람인), the largest Korean job board. Returns titles, companies, locations, experience level, salary, deadlines and skills as structured JSON.

- **URL**: https://apify.com/kasidesk/saramin-jobs-scraper.md
- **Developed by:** [Kasidesk Studio](https://apify.com/kasidesk) (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 job 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/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

## Saramin Jobs Scraper (사람인 채용공고)

Scrapes job listings from [Saramin](https://www.saramin.co.kr), the largest job board in Korea. You give it search keywords (Korean or English works), it gives you structured JSON: title, company, location, experience level, salary, deadline, skill tags, posting date.

No login, no API key, no headless browser. Saramin renders everything 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 Saramin has no public API. If you need to know who's hiring in Korea and for what, this is the gap it fills.

This is one half of a pair - my [Albamon Part-time Jobs Scraper](https://apify.com/kasidesk/albamon-jobs-scraper) covers Korea's part-time and hourly job market (numeric wages, shift times, store-level addresses), while this one covers full-time hiring. Together they span the Korean job market.

### What people use it for

Labor market analytics is the obvious one, e.g. tracking how many Python or AI openings are live this week, by region or company. HR tech products feed the listings into aggregators and matching engines. A less obvious one: lead generation. A company hiring three n8n developers is a company spending money on automation, which makes hiring data a decent buying-intent signal.

It also works as a tool for AI agents through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), so an agent can run live Korean job searches mid-conversation ("find the newest AI engineer roles in Seoul and tell me who's hiring").

### Input

```json
{
    "keywords": ["python", "데이터 분석"],
    "sortBy": "latest",
    "maxItems": 200
}
```

- `keywords` - each one runs as a separate search
- `searchUrls` - alternatively, paste full Saramin search URLs from your browser. Any filters you set on the site (region, job category, career level) carry over
- `sortBy` - `latest` (default) or `accuracy` (Saramin's relevance ranking)
- `maxItems` - total cap across all searches
- `scrapeJobDetails` - visits each job's detail page for salary, working hours, address and requirements. Roughly doubles the request count, so it's off by default
- `proxyConfiguration` - leave the default (residential, KR). Saramin blocks datacenter IPs

### Output

One item per listing:

```json
{
    "id": "54672562",
    "title": "Python 백엔드 개발자 모집 공고",
    "company": "(주)인텔리코드",
    "url": "https://www.saramin.co.kr/zf_user/jobs/relay/view?rec_idx=54672562",
    "location": "경기 수원시 영통구",
    "experience": "신입·경력",
    "education": "대졸↑",
    "employmentType": "정규직",
    "skills": ["Python", "AI(인공지능)", "백엔드/서버개발", "Linux", "머신러닝"],
    "deadline": "~ 10/05(월)",
    "deadlineDate": "2026-10-05",
    "postedAt": "2026-08-06",
    "searchKeyword": "python"
}
```

Korean labels from the site (경력, 학력, 급여 and so on) are parsed into English field names, and dates are normalized to ISO. You don't need to read Korean to use the output.

With `scrapeJobDetails` on, items get an extra `details` object with salary, working hours, work location and a requirements summary where the posting provides them.

### Notes

Only public data. 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) or 오늘마감 (closes today) 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, Saramin 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 part-time and hourly jobs, use the [Albamon scraper](https://apify.com/kasidesk/albamon-jobs-scraper). A JobKorea (잡코리아) scraper is planned next if there's demand.

***

#### 한국어 안내

사람인 채용공고를 로그인 없이 구조화된 JSON으로 수집합니다. 키워드 또는 사람인 검색 URL을 입력하면 공고 제목, 회사명, 지역, 경력·학력 조건, 급여, 마감일, 기술 키워드, 등록일을 정리해서 반환합니다. `scrapeJobDetails` 옵션을 켜면 상세 페이지의 급여·근무일시·근무지역·자격요건까지 가져옵니다. 공개 데이터만 다루며 개인정보는 수집하지 않습니다. 문의는 Issues 탭으로 남겨주세요.

# Actor input Schema

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

Keywords to search for on Saramin, Korean or English. Each keyword runs as its own search. Examples: python, 데이터 분석, 마케팅

## `searchUrls` (type: `array`):

Optional. Paste full Saramin search result URLs copied from your browser instead of (or on top of) keywords. Filters you set on the site (region, job category, career level) are kept. Must start with https://www.saramin.co.kr/zf\_user/search

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

latest returns newest postings first, which is what you want for monitoring. accuracy uses Saramin's own relevance ranking.

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

Total number of listings to collect across all keywords and URLs.

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

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

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

Saramin blocks datacenter IPs, keep the residential default.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "searchUrls": [],
  "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 = {
    "keywords": [
        "python"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "KR"
    }
};

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

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

```

## MCP server setup

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