Source (original): DART (Data Analysis, Retrieval and Transfer System), run by Korea’s Financial Supervisory Service — the mandatory disclosure filing system, same role as SEC EDGAR. Free OpenAPI, 20,000 calls/day on a free key, no commercial-use restriction.
- https://opendart.fss.or.kr/ (site is Korean; API docs have English param names)
What’s in it. Every KOSPI/KOSDAQ listed company’s financial statement line items from annual reports: balance sheet, income statement, cash flow, equity changes. Each row carries the current year amount plus the prior two years side by side, so you get a 3-year trend per line without extra calls. Consolidated (CFS) preferred, falls back to separate (OFS) for companies with no subsidiaries.
The part worth posting about: DART already tags every line with an IFRS taxonomy id — ifrs-full_Assets, ifrs-full_Revenue, ifrs-full_ProfitLoss, etc. — the same taxonomy US/EU filers use. That means no Korean-to-English account-name translation step, unlike most Korea data sources (my other actor, the real-estate one, needs a full translation layer). You get the Korean label (account_nm, e.g. 매출액) and the international taxonomy id side by side for free.
Gotchas (cost me actual debugging time):
- Company lookup isn’t by ticker — you first pull
corpCode.xml(a zip, ~forgot-to-check-Content-Type gotcha), which maps every DART-registered entity (listed and unlisted) to an internalcorp_code. Unlisted entities have an emptystock_codefield; filter those out or you’ll query companies with no ticker. - No single “give me financials” call reliably returns consolidated statements. You have to try
fs_div=CFSfirst and fall back toOFS— a normal, expected branch, not an error path. A company with no subsidiaries simply has no CFS. - Status
013(“조회된 데이타가 없습니다” / no data found) is not an error, it’s an empty result — some report/year combos genuinely don’t exist. Status020(quota exceeded) is a real error. Conflating the two silently turns a rate-limit hit into “this company has no 2019 filings.” - Amounts come as strings (
"514531948000000"), not numbers — cast, don’t trust the JSON type. rcept_no(the filing receipt number) encodes the filing date in its first 8 digits — that’s the only place you get an as-of date; there’s no separate date field on the row.
Real example — Samsung Electronics (005930), FY2022–2024, annual consolidated:
| FY2022 (제54기) | FY2023 (제55기) | FY2024 (제56기) |
|---|---|---|
| Total assets | 448.4T KRW | 455.9T KRW |
| Revenue | 302.2T KRW | 258.9T KRW |
That FY2023 revenue dip and FY2024 recovery is the memory-chip downturn/rebound showing up directly in the raw filing data, three years in one API response, no crawling three separate annual reports.
Disclosure — I built a free wrapper. Raw DART responses are one financial-statement/report/year combo per call, Korean-first field names (thstrm_amount, sj_div), and require the corp_code lookup above. I published an Apify actor that does the corp_code mapping, CFS→OFS fallback, and reshapes rows into English field names (currentAmountKrw, statementType, accountId) — free, no API key of your own needed:
The source of truth is DART, not me — if you’d rather hit opendart.fss.or.kr yourself, the gotcha list above should save you the debugging session it cost me.
submitted by /u/porche911_kr
[link] [comments]