[self-promotion] Korea’s Official Listed-company Financial Statements (DART, The Korean SEC’s EDGAR Equivalent): Line-item Balance Sheet + Income Statement, Free, Already In IFRS-taxonomy English Field Names

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.

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):

  1. 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 internal corp_code. Unlisted entities have an empty stock_code field; filter those out or you’ll query companies with no ticker.
  2. No single “give me financials” call reliably returns consolidated statements. You have to try fs_div=CFS first and fall back to OFS — a normal, expected branch, not an error path. A company with no subsidiaries simply has no CFS.
  3. Status 013 (“조회된 데이타가 없습니다” / no data found) is not an error, it’s an empty result — some report/year combos genuinely don’t exist. Status 020 (quota exceeded) is a real error. Conflating the two silently turns a rate-limit hit into “this company has no 2019 filings.”
  4. Amounts come as strings ("514531948000000"), not numbers — cast, don’t trust the JSON type.
  5. 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]

Leave a Reply

Your email address will not be published. Required fields are marked *