# DART Korea Corporate Filings Scraper (`signaldatatools/dart-filings-scraper`) Actor

Scrape public corporate-disclosure metadata from DART, Korea's official filing system: company, market, report name, submitter, receipt date, receipt number and the public permalink. Metadata only - filing documents are never downloaded.

- **URL**: https://apify.com/signaldatatools/dart-filings-scraper.md
- **Developed by:** [Signal Data Tools](https://apify.com/signaldatatools) (community)
- **Categories:** Business, News, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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

## DART Korea Corporate Filings Scraper

Pull a clean, filterable index of Korean corporate disclosures from **DART**
(dart.fss.or.kr), the Republic of Korea's official electronic disclosure system, operated
by the Financial Supervisory Service. Every row is a public regulatory filing: the receipt
number, the report name, the filing company and its DART corp code, the market it is
listed on, the submitter, the receipt date, the regulator's remark, and the canonical
permalink to the document.

Korean disclosure data is public but awkward to work with at scale. The search interface
is Korean-language and session-driven, corp codes are not exposed in any convenient list,
and there is no simple way to slice the archive by market and report type at once. This
Actor turns that search into a dataset you can filter by date range, market, report
category and sort order in one call.

Verified on a live run: **60 filings in 5 seconds**, and **150 filings in 2.2 seconds** with
a date range plus `corporationType` and `reportTypes` filters applied — all correctly
filtered. No blocking encountered.

### What you get

One dataset row per filing:

| Field | Type | Description |
|---|---|---|
| `rcpNo` | string | 14-digit DART receipt number, the filing's unique key |
| `reportName` | string | Official report title as filed |
| `companyName` | string | Filing company |
| `corpCode` | string | DART corporation code — the join key to other DART data |
| `market` | string | Listing market (`KOSPI`, `KOSDAQ`, `KONEX`, or other) |
| `submitter` | string | Party that submitted the filing |
| `receiptDate` | string | Date the filing was received, as displayed |
| `filingUrl` | string | Public permalink to the filing (a string only — never fetched) |
| `remark` | string | Regulator's remark on the filing, where present |
| `rank` | integer | Position within the result set |
| `scrapedAt` | string | ISO-8601 UTC timestamp |

**Scope, stated plainly:** this Actor returns filing **metadata and the public permalink
only**. It never downloads a filing document body, because `robots.txt` disallows
`/dsaf001/main.do`, `/report/viewer.do` and `/report/download.do`. That is the design, not
a limitation — you get a compliant, lightweight metadata index you can hold indefinitely,
plus a link you open yourself when you need the text.

### Input

```json
{
  "maxItems": 150,
  "maxPages": 5,
  "pageSize": 100,
  "startDate": "20260901",
  "endDate": "20260911",
  "sort": "date",
  "sortDirection": "desc",
  "corporationType": "P",
  "reportTypes": ["A001", "B001"],
  "requestDelaySeconds": 2,
  "respectRobotsTxt": true,
  "includeContactInfo": false,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyCountry": "KR" }
}
```

| Option | Default | Notes |
|---|---|---|
| `maxItems` | 100 | Required. Hard stop for the run (max 10000) |
| `maxPages` | 5 | Result pages to walk; the run also stops at the last page on its own |
| `pageSize` | 30 | Max 100 — the site silently drops to 15 above that, so the Actor caps it |
| `startDate` | – | Earliest receipt date, `YYYYMMDD` or `YYYY-MM-DD`. Empty = whole archive |
| `endDate` | – | Latest receipt date, inclusive. Empty = no upper bound |
| `sort` | `date` | `date` receipt date, `crp` company name, `rpt` report name |
| `sortDirection` | `desc` | `desc` newest first, `asc` oldest first |
| `corporationType` | `all` | `P` KOSPI, `A` KOSDAQ, `N` KONEX, `E` other corporations |
| `reportTypes` | `[]` (all) | 12 top-level codes, listed below; multi-value verified |
| `requestDelaySeconds` | 2 | Politeness pause between requests |
| `respectRobotsTxt` | `true` | Re-checks robots.txt at runtime, skips disallowed URLs |
| `includeContactInfo` | `false` | Off by default; keeps personal contact data out of your dataset |
| `proxyConfiguration` | Apify Proxy, KR | A Korean IP gives the most consistent results |

**Report type codes:** `A001` annual report, `A002` half-year report, `A003` quarterly
report, `B001` material-fact report, `C001` securities registration (equity),
`D001` large shareholding report, `E001` treasury-stock acquisition/disposal,
`F001` audit report, `G001` securities registration (fund, trust type),
`H001` asset-securitisation plan, `I001` periodic market disclosure,
`J001` large intra-group transaction. Codes outside this scheme return zero rows.

### Sample output

```json
{
  "rcpNo": "20260911800825",
  "reportName": "기타경영사항(자율공시)",
  "companyName": "SH에너지화학",
  "corpCode": "00136457",
  "market": "KOSPI",
  "submitter": "SH에너지화학",
  "receiptDate": "2026.09.11",
  "filingUrl": "https://dart.fss.or.kr/dsaf001/main.do?rcpNo=20260911800825",
  "remark": "본 공시사항은 한국거래소 유가증권시장본부 소관임",
  "rank": 1,
  "scrapedAt": "2026-09-13T08:59:03Z"
}
```

### Typical uses

- **Korean equity research pipelines** — feed a daily disclosure watchlist keyed on `corpCode`
- **M\&A and ownership-change monitoring** — pull `D001` large shareholding reports on a schedule
- **Compliance and audit trails** — keep a dated, immutable index of what a filer disclosed and when
- **ESG and governance datasets** — build filing-frequency and disclosure-behaviour metrics by market

### Responsible use

- Reads **the allowed search-results endpoint only** — `POST /dsab007/detailSearch.ax`.
  The Actor never requests `/dsaf001/main.do`, `/report/viewer.do`, `/report/download.do`,
  `/pdf/download/` or the corporate-profile popup `/dsae001/selectPopup.ax`, all of which
  `robots.txt` disallows. `filingUrl` is assembled as a string from the receipt number so
  you can open the document yourself.
- `respectRobotsTxt` is on by default and enforced before every single request.
- Requests are paced (default 2s) with retries on transient failures.
- **Personal data.** `submitter` can be an individual's name, because the official public
  disclosure record itself names one — a large-shareholding report is filed by the person
  or entity holding the stake. That name is part of the public regulatory record and is
  reproduced as filed. With `includeContactInfo: false` (the default), phone and e-mail
  fields are dropped and any phone/e-mail pattern inside a free-text field is replaced
  with `[removed]`.
- Filings are public regulatory disclosures published by the Financial Supervisory
  Service. This Actor is not affiliated with or endorsed by DART or the FSS. You are
  responsible for how you use the output, including compliance with securities and data
  protection law in your jurisdiction.

### Pricing

Pay per result. You are charged only for rows actually delivered to your dataset.

***

### 한국어 요약

**DART 전자공시 목록 크롤러.** 금융감독원 전자공시시스템(dart.fss.or.kr)의 공개 공시
목록을 표로 뽑아 줍니다. 접수번호·보고서명·회사명·고유번호(corp code)·시장구분·
제출인·접수일자·공시 바로가기 주소·비고가 한 줄씩 나옵니다.

- **기간**: `startDate`/`endDate` 로 접수일 구간 지정(YYYYMMDD, 끝날 포함)
- **시장**: 전체·유가증권(P)·코스닥(A)·코넥스(N)·기타법인(E)
- **보고서 종류**: 사업보고서 A001, 주요사항보고 B001, 대량보유보고 D001 등 12종,
  여러 개 동시 지정 실측 확인
- **정렬**: 접수일·회사명·보고서명 / 내림차순·오름차순
- **속도**: 60건 5초, 필터 적용 150건 2.2초 실측(차단 없음)
- **범위**: 공시 **목록 정보와 공개 링크만** 담습니다. robots.txt가 막아둔 본문 뷰어·
  다운로드 경로는 아예 요청하지 않으니, 본문은 링크를 눌러 직접 보시면 됩니다
- **개인정보**: 대량보유보고처럼 공시 원본에 개인 이름이 제출인으로 적힌 경우가 있어,
  공적 기록 그대로 옮겨 담습니다. 전화번호·이메일은 기본적으로 수집하지 않습니다

**요금**: 결과 1건당 과금(pay-per-result). 실제로 받은 줄 수만큼만 냅니다.

# Actor input Schema

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

Stop after this many filings.

## `maxPages` (type: `integer`):

Result pages to walk. The run also stops on its own once the last page of the result set is reached.

## `pageSize` (type: `integer`):

Filings requested per page. 100 is the highest value the search accepts; anything larger is silently reduced to 15 by the site, so the actor caps it at 100.

## `startDate` (type: `string`):

Earliest receipt date, as YYYYMMDD or YYYY-MM-DD. Leave empty to search the whole archive.

## `endDate` (type: `string`):

Latest receipt date, as YYYYMMDD or YYYY-MM-DD. Inclusive. Leave empty for no upper bound.

## `sort` (type: `string`):

Which column the result set is ordered on.

## `sortDirection` (type: `string`):

Ascending or descending within the chosen sort column.

## `corporationType` (type: `string`):

Restrict to filers listed on one market.

## `reportTypes` (type: `array`):

Optional filing-category codes; leave empty for every type. Verified codes: A001 annual report, A002 half-year report, A003 quarterly report, B001 material-fact report, C001 securities registration (equity), D001 large shareholding report, E001 treasury-stock acquisition/disposal, F001 audit report, G001 securities registration (fund, trust type), H001 asset-securitisation plan, I001 periodic market disclosure, J001 large intra-group transaction. Codes outside this scheme return zero rows.

## `requestDelaySeconds` (type: `integer`):

Politeness pause between HTTP requests.

## `respectRobotsTxt` (type: `boolean`):

Check the target's robots.txt before every request and skip disallowed URLs. This actor only calls the allowed search-results endpoint; filing document bodies and the corporate-profile popup are disallowed there and are never fetched.

## `includeContactInfo` (type: `boolean`):

Off by default. When off, phone numbers and e-mail addresses are stripped from any free-text field in the output.

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

Apify Proxy settings. A Korean residential or datacenter IP is recommended.

## Actor input object example

```json
{
  "maxItems": 100,
  "maxPages": 5,
  "pageSize": 30,
  "sort": "date",
  "sortDirection": "desc",
  "corporationType": "all",
  "requestDelaySeconds": 2,
  "respectRobotsTxt": true,
  "includeContactInfo": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "KR"
  }
}
```

# Actor output Schema

## `filings` (type: `string`):

Corporate filings scraped in this run, as a dataset (JSON/CSV/Excel via the Apify API).

## `datasetView` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("signaldatatools/dart-filings-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("signaldatatools/dart-filings-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 '{}' |
apify call signaldatatools/dart-filings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signaldatatools/dart-filings-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/XVmHOzn3NItcq7OX3/builds/WUeloYLzQDTi1rXBr/openapi.json
