Somoon provides hiring data for Korean listed companies: posting-level records for the full KOSPI and KOSDAQ universe, mapped to exchange identifiers, with point-in-time observation dates. Alongside postings, it offers company fundamentals from DART filings and monthly workforce flows from National Pension Service records.
There are three ways to work with the data: the Explorer and company profiles in the portal, the REST API, and bulk files of the full history.
Snapshot: 2026-10-21.
curl -s "https://data.somoon.ai/api/v1/metrics/postings?stock_code=005380&freq=month" \ -H "Authorization: Bearer $SOMOON_API_KEY"
Or load the full history into pandas:
import pandas as pd
panel = pd.read_parquet("somoon_panel_weekly_2026-10-21.parquet") # from Bulk downloads
universe = pd.read_parquet("somoon_universe_2026-10-21.parquet")
df = panel.merge(universe[["stock_code", "isin", "live_since"]], on="stock_code")
df = df[df.week_start >= df.live_since] # live history only| Measure | Value |
|---|---|
| Active KOSPI / KOSDAQ companies | 2,648 (829 / 1,819) |
| Delisted companies retained | 58 |
| Companies with postings | 2,243 |
| Unique postings held | 132,889 |
| of which observed live | 116,024 |
| Earliest posting date | 2022-05-24 |
| Postings carrying a published start date | 32.5% |
| Companies with DART fundamentals | 666 |
| Companies with NPS workforce flows | 630 |
| Year | Unique postings | Live | Backfilled | Companies |
|---|---|---|---|---|
| 2022 | 1,335 | 1,335 | 0 | 2 |
| 2023 | 4,279 | 4,243 | 36 | 69 |
| 2024 | 13,073 | 13,019 | 54 | 98 |
| 2025 | 29,688 | 21,807 | 7,881 | 896 |
| 2026 | 84,583 | 75,689 | 8,894 | 2,193 |
Number of companies by the age of their earliest posting — counting all postings, and counting live postings only.
| History | Companies — all postings | Companies — live postings only |
|---|---|---|
| 3+ years | 57 | 55 |
| 2–3 years | 48 | 41 |
| 1–2 years | 472 | 35 |
| under 1 year | 1,666 | 2,058 |
universe dataset (first_posting_date, live_since).All datasets share stock_code and corp_code as join keys.
postingsPosting-level hiring data for KOSPI and KOSDAQ companies — one row per company and posting. Titles are in the original Korean. Posting body text and source URLs are not included.
| Field | Type | Description |
|---|---|---|
posting_id | string(16) | Stable identifier of the posting. The same posting_id appears under each company it was published for. |
stock_code | string(6) | KRX stock code |
corp_code | string(8) | DART unique corporate code |
isin | string(12) | ISIN of the common share (derived) |
company_name_en | string | Company name in English, as registered with DART |
company_name_ko | string | Company name in Korean, as registered with DART |
market | enum | KOSPI / KOSDAQ |
listing_status | enum | active / delisted — delisted companies are retained with their history |
title | string | Posting title (Korean original) |
category | string | Job category as published, where available |
position | string | Position / role as published, where available |
posting_date | date | Date the posting was published (from the posting; the date we first observed it where the posting states none) |
posted_end_date | date | Application deadline as published, where available |
collection_type | enum | live = observed within 30 days of publication; backfilled = published earlier and gathered when collection of the company began |
first_seen_date | date | Date Somoon first observed the posting. Never revised. |
companies_sharing_posting | int | Number of listed companies this posting is attached to (group-wide postings > 1) |
universeEvery KOSPI and KOSDAQ company, including delisted ones, with ISIN, industry and per-company history depth. Join to the other datasets on stock_code.
| Field | Type | Description |
|---|---|---|
stock_code | string(6) | KRX stock code |
corp_code | string(8) | DART unique corporate code |
isin | string(12) | ISIN of the common share, derived from the stock code (KR7 + code + 00 + check digit). Preferred shares have different ISINs. |
company_name_ko | string | Company name in Korean (DART) |
company_name_en | string | Company name in English (DART) |
market | enum | KOSPI / KOSDAQ |
listing_status | enum | active / delisted |
ksic_group_code | string(3) | Korean Standard Industrial Classification, 3-digit group, where available |
ksic_group_name_ko | string | Industry group name in Korean |
postings | int | Unique postings held for the company |
first_posting_date | date | Earliest posting date held (includes postings published before collection began) |
live_since | date | Earliest live posting — start of the company's live (point-in-time) history |
posting_history_years | float | Years from first_posting_date to the snapshot date |
panel_weeklyCompany × week counts of postings by posting date, split into live and backfilled — ready for backtests. Weeks start on Monday. Weeks with no postings have no row. Use postings_live for point-in-time work.
| Field | Type | Description |
|---|---|---|
stock_code | string(6) | KRX stock code |
corp_code | string(8) | DART unique corporate code |
isin | string(12) | ISIN of the common share (derived) |
company_name_en | string | Company name in English |
week_start | date | Monday of the posting week |
postings | int | Unique postings published during the week |
postings_live | int | Of which observed live |
postings_backfilled | int | Of which backfilled |
fundamentalsHeadcount, average salary by gender, average tenure and key financials from annual DART filings — latest available year per company. Monetary values in KRW. Data year is given per company because filing cycles differ.
| Field | Type | Description |
|---|---|---|
isin | string(12) | ISIN of the common share (derived) |
stock_code | string(6) | KRX stock code |
corp_code | string(8) | DART unique corporate code |
company_name_en | string | Company name in English |
male_employees | int | Male employees (annual business report) |
female_employees | int | Female employees (annual business report) |
avg_salary_male_krw | int | Average annual salary per male employee, KRW |
avg_salary_female_krw | int | Average annual salary per female employee, KRW |
avg_tenure_years | float | Average tenure in years |
employee_data_year | string(4) | Fiscal year of the employee figures |
revenue_krw | int | Revenue, KRW |
operating_profit_krw | int | Operating profit, KRW |
net_income_krw | int | Net income, KRW |
financial_data_year | string(4) | Fiscal year of the financial figures |
workforceMonthly hires, leavers and insured headcount per company, derived from National Pension Service workplace records. Based on the company's registered NPS workplace(s); companies with workplaces registered under other entities may be partially covered.
| Field | Type | Description |
|---|---|---|
isin | string(12) | ISIN of the common share (derived) |
stock_code | string(6) | KRX stock code |
corp_code | string(8) | DART unique corporate code |
company_name_en | string | Company name in English |
month | string(7) | Reference month, YYYY-MM |
new_hires | int | Employees newly enrolled during the month |
leavers | int | Employees who lost enrollment during the month |
insured_employees | int | Insured employees at the reference month |
pension_billed_krw | int | Pension contribution billed for the month, KRW (a payroll proxy) |
All companies listed on KOSPI and KOSDAQ, synchronized weekly with DART. Companies that delist are kept with their history.
Publicly available job postings are collected every week for the full universe from company career sites and major Korean job platforms, then normalized and mapped to the listed company.
Many platforms keep closed postings online. When a company is first collected, postings still available are
included and dated by the date published in the posting. Such postings have a first_seen_date later than their
posted_start_date.
A posting re-observed on later collections is kept once per company. Group-wide postings that list several affiliates
appear under each affiliate with the same posting_id; companies_sharing_posting gives the count. Count distinct
posting_id for unique postings.
KRX stock code and DART corporate code come from DART. ISIN is derived for the common share from the stock code
(KR7 + code + 00 + ISO 6166 check digit); preferred shares and other share classes have different ISINs.
posting_date is the published start date where the posting states one, otherwise the date
we first observed it. Every posting carries a collection_type: live when we observed it within 30 days of
publication, backfilled when it was published earlier and gathered when we began collecting the company. first_seen_date
records when we actually observed each posting and is never revised.
Fundamentals are the latest annual figures filed with DART; the data year is given per company. Workforce flows come from National Pension Service workplace records and depend on how a company registers its workplaces.
Backfilled postings extend history, but they were gathered after the fact. For a signal that only uses information available at the time, use live postings.
postings_live from the panel_weekly dataset and start each
company's series at its live_since date from the universe dataset. Use postings (live + backfilled) for
descriptive analysis of hiring activity.For live postings that carry a published start date (28,247 postings), the gap between publication and our first observation was: median 4 days, 90th percentile 18 days; 70.2% were observed within 7 days.
The trial is designed for evaluation: every aggregate and the full weekly panel, with posting-level detail available in samples.
| Free trial | Subscription | |
|---|---|---|
| Coverage, charts and aggregated counts | All companies, full history | All companies, full history |
| Posting-level rows in Explorer / API | 10 rows per query, no paging; detail for up to 25 companies per day | Unlimited, with paging and CSV export |
| API keys | Sandbox — synthetic data with the production schema, for integration testing | Live data |
| Bulk files | universe (full), panel_weekly (full), postings (sample), fundamentals (sample), workforce (sample) | universe (full), panel_weekly (full), postings (full), fundamentals (full), workforce (full) |
| Rate limit | 60 requests / minute | 300 requests / minute |
Limits are applied by the service to the portal and the API alike. To extend your trial or discuss a subscription, use the chat button or email bkpark@seeso.kr.
Base URL https://data.somoon.ai. Authenticate with Authorization: Bearer <API key>; keys are created in the portal.
Responses are JSON. List endpoints return total and a data array and accept limit / offset.
Errors return a non-2xx status with {"error": ..., "message": ...}; plan limits return 403 with "error": "plan_limit".
Each response carries X-Somoon-Environment: live or sandbox.
/api/v1/coverage — Coverage summaryUniverse size, posting totals and history depth by year for the current snapshot. Try it →
/api/v1/companies — Search companiesFind companies in the KOSPI/KOSDAQ universe by stock code or name (English or Korean). Try it →
| Parameter | Description | Example |
|---|---|---|
q | Stock code or part of the company name | naver |
market | KOSPI or KOSDAQ | |
limit | Max results (1–3000) | 20 |
/api/v1/companies/{stock_code} — Company profileIdentifiers, industry, hiring summary and latest DART fundamentals for one company. Try it →
| Parameter | Description | Example |
|---|---|---|
stock_code * | KRX stock code | 035420 |
/api/v1/postings — Query postingsPosting-level records with filters. Subscriptions can export the full filtered result via /api/v1/postings.csv. Try it →
| Parameter | Description | Example |
|---|---|---|
stock_code | One or more stock codes, comma-separated | 035420 |
q | Keyword in title, category or position (Korean or English) | |
from | Posting date from, YYYY-MM-DD (inclusive) | 2026-01-01 |
to | Posting date to, YYYY-MM-DD (inclusive) | |
collection_type | live = observed around publication; backfilled = published before collection began and gathered later | |
market | KOSPI or KOSDAQ | |
sort | posting_date or stock_code; prefix - for descending | -posting_date |
limit | Page size | 10 |
offset | Rows to skip | 0 |
/api/v1/metrics/postings — Posting counts over timeUnique postings (split live / backfilled) and number of hiring companies per week, month or year — same filters as /postings. Try it →
| Parameter | Description | Example |
|---|---|---|
stock_code | One or more stock codes, comma-separated | 005380 |
q | Keyword filter | |
from | Posting date from, YYYY-MM-DD | |
to | Posting date to, YYYY-MM-DD | |
collection_type | live = observed around publication; backfilled = published before collection began and gathered later | |
market | KOSPI or KOSDAQ | |
freq | week, month or year | month |
/api/v1/workforce — Monthly workforce flowsMonthly new hires, leavers and insured headcount from National Pension Service records. Try it →
| Parameter | Description | Example |
|---|---|---|
stock_code * | One or more stock codes, comma-separated | 005380 |
from | Start month, YYYY-MM | |
to | End month, YYYY-MM |
/api/v1/fundamentals — Company fundamentalsHeadcount, average salary by gender, tenure and financials from annual DART filings. Try it →
| Parameter | Description | Example |
|---|---|---|
stock_code | One or more stock codes, comma-separated | 035420 |
limit | Page size (1–1000) | 100 |
offset | Rows to skip | 0 |
During the trial, every dataset is available as a full-history file in CSV (UTF-8 with BOM) and Parquet (zstd) under Bulk downloads. After the trial, weekly full refreshes are delivered by file download or to your S3 bucket / SFTP.
Answers to the questions in a standard data-sourcing questionnaire.
| Question | Answer |
|---|---|
| Product | Job-posting level data for all KOSPI and KOSDAQ companies, mapped to KRX stock code, ISIN and DART corporate code; with company fundamentals from DART filings and monthly workforce flows from National Pension Service records. |
| History | Postings from 2022-05-24 onward. Depth varies by company — see Coverage for the per-company distribution. Full-universe weekly collection since April 2026. |
| Frequency | Weekly, full universe. More frequent collection for selected companies can be discussed. |
| Delivery time and lag | Snapshots are published after each weekly collection. See Point-in-time for the observed lag between publication and first observation. |
| Mapped to tickers | Yes — every company carries a stock code and ISIN (2,243 companies with postings). |
| Raw vs aggregated | Both: posting-level records and a company × week panel. Posting body text is available under a subscription. |
| Regional coverage / asset class | Korea (KOSPI, KOSDAQ) · equities. |
| Source and collection | Publicly available online job postings, collected from company career sites and major Korean job platforms, then normalized and mapped to exchange identifiers. Fundamentals: DART. Workforce flows: National Pension Service public data. |
| Point-in-time | Yes — first_seen_date on every posting, never revised, and a collection_type (live / backfilled) flag. Delisted companies retained. |
| Documentation | This page: data dictionary, methodology, API reference and changelog. |
| Delivery method | REST API and bulk files (CSV, Parquet). S3 / SFTP delivery after the trial. |
| File format | CSV (UTF-8) and Parquet (zstd); JSON over the API. |
| Personal data | None. Posting-level and company-level information only. |
| Pricing | Provided on request, by scope. |
Questions from compliance or legal teams are welcome — contact bkpark@seeso.kr.
| Date | Change |
|---|---|
| 2026-10-21 | Data portal launched: Explorer, company profiles, REST API v1 with sandbox keys, bulk downloads, weekly panel with live / backfilled split, ISIN mapping. |