본문으로 건너뛰기금융감독원 전자공시(Open DART)의 정기공시에서 재무제표를 받아 쌓은 것이다. 이 문서는 그 데이터를 쓰려는 사람을 위한 명세다. 운영 절차와 고장 대응은 docs/data/dart.md 에 있다.
이 문서에 측정값을 적지 않는다. 행 수와 기간과 기업 수는 화면이 1절에 그때 읽어 채우고, 그 밖의 수를 직접 세는 질의는 8절에 있다. 왜 적지 않는지는 docs/structure.md 의 부패할 것을 만들지 않는다 에 있다.
1. 한눈에
1. 한눈에 (1번째 표)| 원천 | Open DART (https://opendart.fss.or.kr/api), 금융감독원 |
|---|
| 대상 | 코스피(Y)와 코스닥(K) 상장사의 정기공시 재무제표 |
|---|
| 보고서 종류 | 사업보고서, 반기보고서, 1분기보고서, 3분기보고서 |
|---|
| 재무제표 종류 | 재무상태표, 손익계산서, 포괄손익계산서, 현금흐름표, 자본변동표 |
|---|
| 연결/개별 | 둘 다 |
|---|
| 사업연도 | 2015 부터. 분기와 반기는 2016 부터 (7절) |
|---|
| 갱신 | 매일 09:00 KST. 마감 09:30 |
|---|
| 보관처 | PC2 PostgreSQL, 데이터베이스 a42_dart (A42_DART_DSN) |
|---|
| 주요 테이블 | financial_statement (재무제표 계정 행) |
|---|
| 재고 항목 이름 | dart_financial_statement |
|---|
| 화면 | /dart, /dart/<corp_code> |
|---|
재고 화면에서 이 데이터셋의 기간이 비어 있다. source_rcept_dt 에 인덱스가 없어 min/max 가 전수 스캔이기 때문이다 (7절).
테이블 일곱이다.
1. 한눈에 (테이블, 무엇 칸이 있는 표)| 테이블 | 무엇 |
|---|
financial_statement | 재무제표 계정 행. 이것이 데이터 본체다 |
statement_task | 보고서 하나를 받았는지의 기록 겸 큐 |
company | DART 에 등록된 법인 전체 (비상장 포함) |
filing | 발견한 정기공시 |
api_usage | 날짜별 호출 수 |
collect_log | 수집 실행 한 건 |
collector_state | 이어받기 cursor |
행 수를 세는 질의는 8절에 있다.
데이터셋 목록을 가져오지 못했습니다
데이터 서버에 닿지 못했습니다.
데이터 서버가 꺼져 있을 수 있습니다. 터미널에서 uv run a42-data-view up 으로 켠 뒤 새로고침하세요.
2. 무엇이 들어 있나
기업 목록은 두 층이다
기업 목록은 두 층이다| 층 | 어디서 오나 |
|---|
| DART 등록 법인 전체 | corpCode.xml (zip) 을 그대로 적재 |
| 그 가운데 상장 구분이 붙은 것 | 공시 검색 응답의 corp_cls 로만 채워진다 |
corpCode.xml 에는 상장 구분이 없다. 그래서 company.corp_cls 는 대부분 널이고, 재무제표가 있는 기업은 corp_cls 가 Y 또는 K 인 기업과 정확히 같다.
종목코드가 있는 법인 가운데 일부만 재무제표를 받는다. 층별 개수를 세는 질의는 8절에 있다.
보고서 종류 코드
보고서 종류 코드 (reprt_code, 뜻 칸이 있는 표)reprt_code | 뜻 |
|---|
11011 | 사업보고서 (연간) |
11012 | 반기보고서 |
11013 | 1분기보고서 |
11014 | 3분기보고서 |
이 코드는 원천이 주지 않는다. 수집기가 공시 제목에서 알아낸다 (packages/a42_dart/src/a42_dart/parsing.py 의 infer_reprt_code
).
보고서 종류 코드 (제목에 이것이 있으면, 코드 칸이 있는 표)| 제목에 이것이 있으면 | 코드 |
|---|
사업보고서 | 11011 |
반기보고서 | 11012 |
분기보고서 이고 (YYYY.03) | 11013 |
분기보고서 이고 (YYYY.09) | 11014 |
| 그 밖 | 널. 재무제표를 받지 않는다 |
연결/개별과 재무제표 종류
연결/개별과 재무제표 종류 (fs_div, 뜻 칸이 있는 표)fs_div | 뜻 |
|---|
CFS | 연결재무제표 |
OFS | 개별(별도)재무제표 |
연결/개별과 재무제표 종류 (sj_div, sj_nm 칸이 있는 표)sj_div | sj_nm |
|---|
BS | 재무상태표 |
CF | 현금흐름표 |
CIS | 포괄손익계산서 |
SCE | 자본변동표 |
IS | 손익계산서 |
sj_nm 은 sj_div 하나에 값 하나로 고정이다. 다른 표기가 섞여 있지 않다.
IS(손익계산서) 행이 유난히 적다. 이상이 아니다. 대부분의 회사가 손익계산서와 포괄손익계산서를 하나로 묶어 CIS 로 낸다. 종류별 행 수를 세는 질의는 8절에 있다.
연도별 보고서 수록 기업 수
축은 사업연도 x 보고서 종류이고, 세는 것은 is_current 인 행이 있는 기업 수다. 세는 질의는 8절에 있다.
두 자리가 특별하다. 사업연도 2015 에는 사업보고서만 있고, 가장 최근 사업연도는 아직 채워지는 중이다. 왜 그런지는 7절에 있다.
기업 수가 해마다 단조 증가하는 것도 그 표에서 보인다. 그것이 정상이 아니라는 것이 7절의 첫 항목이다.
3. 어떻게 받아오나
3. 어떻게 받아오나| 단계 | Open DART 호출 | 채우는 것 |
|---|
| 1. 기업 목록 동기화 | GET /corpCode.xml 1회 | company |
| 2. 발견 | GET /list.json 여러 회 | filing, statement_task |
| 3. 처리 | GET /fnlttSinglAcntAll.json 큐 하나에 1회 | financial_statement |
1. 기업 목록
1. 기업 목록 (1번째 표)| 응답 | zip 하나. 안에 XML 하나 |
|---|
| 뽑는 칸 | corp_code, corp_name, stock_code, modify_date |
|---|
| 빈도 | 매 실행 1회 |
|---|
| 같은 것을 다시 넣으면 | upsert 라 결과가 같다 |
|---|
2026-08-29 09:00 실행이 이 호출 하나 때문에 통째로 죽었다. 그날 발견과 적재가 전부 빠졌다. 앞뒤 날은 성공했으므로 일시적인 원천 응답이다.
1. 기업 목록 (관측한 것, 값 칸이 있는 표)| 관측한 것 | 값 |
|---|
collect_log | id 21, status='failed', stop_reason='error' |
| 남은 오류 | File is not a zip file 뿐 |
| 소요 | 0.24초. 몇 MB 짜리 zip 이 내려온 시간이 아니다 |
api_usage | 그날 calls_used=1. 호출은 나갔다 |
Open DART 는 오류일 때도 HTTP 200 에 짧은 본문을 준다. 그것을 zip 으로 열다 터진 것이라 DART 가 무엇이라고 했는지가 아무데도 남지 않았다.
지금은 셋이 막고 있다 (dart_client.py 의 ensure_corp_code_zip).
1. 기업 목록 (막는 것, 어떻게 칸이 있는 표)| 막는 것 | 어떻게 |
|---|
| 원인이 안 남는 것 | 본문 앞 두 바이트가 PK 가 아니면 DART 오류 응답으로 읽어 status 별 예외로 갈라 던진다. 읽을 수 없으면 본문 앞 200자를 메시지에 남긴다 |
| 일시적 오류에 즉시 포기하는 것 | 재시도 대상 오류(800, 900)와 네트워크 오류는 2초, 4초 간격으로 3회까지 다시 부른다 |
| 하루치가 통째로 빠지는 것 | 목록 동기화가 실패해도 company 에 이미 기업이 있으면 companies_synced=0 으로 그날 수집을 이어가고 사유를 collect_log.error 에 남긴다 |
한도 소진과 인증 실패는 삼키지 않는다. 뒤따르는 호출도 전부 같은 이유로 죽으니 이어갈 것이 없다.
2. 발견
2. 발견 | 값 |
|---|
| 검색 조건 | pblntf_ty=A (정기공시), sort=date, sort_mth=asc, last_reprt_at=N |
| 상장 구분 | corp_cls=Y 와 corp_cls=K 를 따로 부른다 |
| 날짜 창 | 30일 (discovery_window_days) |
| 페이지 | 한 번에 100건. total_page 까지 이어 부른다 |
| 창당 최소 호출 | 2회 (Y 한 번, K 한 번) |
찾은 공시를 filing 에 넣고, 회사 + 사업연도 + 보고서코드 조합마다 그 조합의 최신 비철회 공시를 가리키는 statement_task 를 연결/개별 두 개 만든다.
이어받기 기준
이어받기 기준| 정본 | collector_state 의 cursor 와 statement_task 큐. 둘 다 DB 에 있다 |
|---|
| cursor 키 | discovery_cursor_date:all. --corp-code 를 주면 discovery_cursor_date:corp:<code> |
|---|
| cursor 가 없을 때 | 2015-01-01 부터 (INITIAL_CURSOR_DATE) |
|---|
| 전진 시점 | 창 하나를 끝까지 훑은 뒤에만. 중간에 멈추면 그 창을 다시 훑는다 |
|---|
| 경계 날짜 | 다음 실행이 cursor 날짜부터 다시 시작한다. 마지막 날은 늘 한 번 더 훑는다 |
|---|
같은 것을 두 번 넣어도 결과가 같다. filing 과 financial_statement 둘 다 upsert 다.
재시도
재시도| 무엇 | 얼마나 |
|---|
| HTTP 오류, DART status 800/900 | 3회. 사이에 2초, 4초 |
| 재무제표 한 건이 재시도 대상 오류 | statement_task 를 retry 로 내리고 next_attempt_at 을 미룬다. 대기는 2^attempts 분, 최대 24시간 |
| 인증 오류나 알 수 없는 오류 | 그 task 를 failed 로 내린다. 실행은 계속한다 |
| 실행 전체 | Prefect 재시도 없음 (retries=0). 재시도하면 같은 날 호출 예산을 두 번 쓴다 |
한 회사의 문제가 그날 전체를 막지 않는 구조다.
호출 예산
호출 예산 | 값 |
|---|
| 일일 예산 | 38,000회 (A42_DART_DAILY_CALL_BUDGET). Open DART 한도 40,000 에서 2,000 을 여유로 남긴 값 |
| 분당 | 900회 |
| HTTP timeout | 20초 |
| 예산을 어디서 세나 | DB 의 api_usage 를 원자적으로 소비한다. 손으로 돌린 실행과 스케쥴 실행이 같은 예산을 나눠 쓴다 |
예산이 떨어지면 status='stopped' 로 멈추고 종료 코드는 0 이다. 실패가 아니다. 남은 분량은 다음 실행이 이어받는다.
4. 어떻게 저장하나
정의는 packages/a42_dart/src/a42_dart/sql/schema.sql 이다. 테이블은 전부 CREATE TABLE IF NOT EXISTS 라 매 실행의 첫 단계가 그대로 다시 적용한다. 그 문장은 이미 있는 테이블의 제약과 칸을 바꾸지 않으므로, 제약을 바꿀 때는 이름 있는 제약으로 만들고 옛 것을 거두는 절차를 그 파일에 함께 둔다. 그 절차도 멱등이다.
시각 칸은 모두 timestamptz 이고 DB 세션 시간대(KST)로 보인다. 날짜 칸은 date 이고 시간대가 없다. 한국 거래일 기준이다.
아래 표의 널 은 스키마가 허용하는지다. 실제로 비어 있는 행이 있는지는 적지 않는다. 그것은 오늘 센 값이다.
financial_statement - 재무제표 계정 행
키: (source_rcept_no, fs_div, sj_div, account_id, account_nm, account_detail, ord) 가 유일 (financial_statement_row_key). id 는 대리키다.
account_detail 이 키에 있는 이유는 자본변동표다. 그 재무제표는 이 칸이 자본 구성요소의 열 축이라, 같은 (account_id, account_nm, ord) 이 열마다 한 번씩 온다. 키에서 빼면 뒤에 온 열이 앞의 열을 덮어 한 행만 남는다. 2026-09-03 까지 그랬고, 그때 받아 둔 행은 지금도 그 상태다 (7절).
financial_statement - 재무제표 계정 행| 칸 | 타입 | 널 | 뜻과 단위 |
|---|
id | bigserial | 아니오 | 대리키. 순서에 뜻이 없다 |
source_rcept_no | text | 아니오 | 이 행이 나온 공시의 접수번호. 14자리. filing.rcept_no 를 참조한다. 앞 8자리가 접수일이다 |
source_rcept_dt | date | 아니오 | 그 공시의 접수일. 값이 세상에 알려진 날이다. 사업연도 종료일이 아니다 |
corp_code | text | 아니오 | DART 기업 코드. 8자리. 종목코드가 아니다 |
bsns_year | integer | 아니오 | 사업연도 |
reprt_code | text | 아니오 | 보고서 종류. 2절 표 |
fs_div | text | 아니오 | CFS 연결 / OFS 개별 |
is_current | boolean | 아니오 | 그 칸의 현재 판인가. 정정 공시가 오면 옛 판이 false 가 된다 |
sj_div | text | 아니오 | 재무제표 종류. 2절 표 |
sj_nm | text | 예 | 재무제표 이름. sj_div 하나에 값 하나 |
account_id | text | 아니오 | DART 가 붙인 표준계정코드. 기본값 빈 문자열. -표준계정코드 미사용- 이 자리표시자다 |
account_nm | text | 아니오 | 회사가 자기 보고서에 적은 계정과목 이름 |
account_detail | text | 아니오 | 자본변동표에서 자본 구성요소의 열 축이다. 다른 종류는 전부 - 다. 유일 키에 들어 있어 널을 허용하지 않는다. 기본값 빈 문자열 |
thstrm_nm | text | 예 | 당기 이름. 제 57 기 꼴. 날짜가 아니다 |
thstrm_amount | text | 예 | 당기 금액 원문 문자열 |
thstrm_amount_numeric | numeric | 예 | 당기 금액. 단위는 원. 분석은 이 칸을 쓴다 |
thstrm_add_amount | text | 예 | 당기 누적 금액 원문 |
thstrm_add_amount_numeric | numeric | 예 | 당기 누적 금액. 원. 반기와 분기보고서에만 있다 |
frmtrm_nm | text | 예 | 전기 이름 |
frmtrm_amount | text | 예 | 전기 금액 원문 |
frmtrm_amount_numeric | numeric | 예 | 전기 금액. 원 |
frmtrm_q_nm | text | 예 | 전기 동분기 이름 |
frmtrm_q_amount | text | 예 | 전기 동분기 금액 원문 |
frmtrm_q_amount_numeric | numeric | 예 | 전기 동분기 금액. 원. 반기와 분기보고서에만 있다 |
frmtrm_add_amount | text | 예 | 전기 누적 금액 원문 |
frmtrm_add_amount_numeric | numeric | 예 | 전기 누적 금액. 원. 반기와 분기보고서에만 있다 |
bfefrmtrm_nm | text | 예 | 전전기 이름 |
bfefrmtrm_amount | text | 예 | 전전기 금액 원문 |
bfefrmtrm_amount_numeric | numeric | 예 | 전전기 금액. 원. 대부분 사업보고서에 있다 |
ord | integer | 아니오 | 보고서 안에서의 표시 순서. 원천이 준 값이고 중간에 빈 번호가 있다 |
currency | text | 예 | 통화 코드 |
collected_at | timestamptz | 아니오 | 이 행을 적재한 시각 |
칸마다 채워진 비율이 크게 다르다. 당기 이름은 전부 차 있고, 전전기와 누적 칸은 일부에만 있다. 세는 질의는 8절에 있다.
thstrm_add_amount, frmtrm_q_amount, frmtrm_add_amount 는 사업보고서 (11011)에 없다. 누적과 전기 동분기는 중간 보고서에만 있는 개념이다.
account_id 와 account_nm 의 차이
account_id 와 account_nm 의 차이 (account_nm, account_id 칸이 있는 표) | account_nm | account_id |
|---|
| 누가 정하나 | 회사. 자기 보고서에 적은 이름 | DART. 나중에 붙인 표준계정코드 |
| 예 | 무형자산 | ifrs-full_IntangibleAssetsAndGoodwill |
| 해마다 흔들리나 | 덜 흔들린다 | 더 흔들린다 |
| 없을 수 있나 | 없다 (널 아님) | -표준계정코드 미사용- 로 온다 |
흔들리는 쪽은 번호다. 삼성전자 연결 재무상태표 사업보고서의 무형자산 은 사업연도 2015 부터 이름이 한 번도 바뀌지 않았고 해마다 한 줄뿐인데, 번호는 넷을 거쳤다.
account_id 와 account_nm 의 차이 (사업연도, account_id 칸이 있는 표)| 사업연도 | account_id |
|---|
| 2025 ~ 2023 | ifrs-full_IntangibleAssetsAndGoodwill |
| 2022 ~ 2019 | ifrs-full_IntangibleAssetsOtherThanGoodwill |
| 2018 ~ 2017 | ifrs_InvestmentProperty |
| 2016 ~ 2015 | -표준계정코드 미사용- |
2017-2018년의 ifrs_InvestmentProperty 는 투자부동산 번호다. 원천이 잘못 붙인 것이다.
account_id 에는 IFRS 분류체계 접두사 두 판이 섞여 있다. 2018년까지 ifrs_, 2019년부터 ifrs-full_ 이다. 뒷부분은 같다.
금액의 단위와 부호
금액의 단위와 부호| 단위 | 원. 배수가 아니라 원 단위 그대로다 (삼성전자 2025 자산총계가 566942110000000) |
|---|
| 통화 | currency 칸이 말한다 |
|---|
| 부호 | 원천이 준 그대로. 괄호 표기 (1,234) 는 음수로 바꿔 넣는다 |
|---|
| 음수 | 있다. 원천이 그렇게 준 것이다 |
|---|
| 정확히 0 과 널 | 다른 뜻이다. 6절을 본다 |
|---|
_numeric 이 널일 때 원문 문자열도 반드시 널이다. 파싱이 조용히 실패해 값을 잃은 행이 없다는 뜻이다. 확인하는 질의는 8절에 있다.
currency 에 오는 값은 KRW, USD, CNY, JPY, HKD, GBP 다. 대부분이 KRW 이고, 원이 아닌 통화로 보고하는 기업이 있다 (7절).
한 보고서에 두 통화가 섞이지 않는다. 다만 해에 따라 통화를 바꾼 회사가 있어서 통화별 기업 수의 합이 전체 기업 수보다 크다. 세는 질의는 8절에 있다.
source_rcept_dt 와 source_rcept_no
source_rcept_dt 와 source_rcept_no | 뜻 | 왜 중요한가 |
|---|
source_rcept_no | 이 행이 나온 공시의 접수번호 (14자리) | 한 판은 접수번호 하나에 묶인다. 어느 공시에서 온 값인지 여기서만 알 수 있다 |
source_rcept_dt | 그 공시의 접수일 | 값이 세상에 알려진 날. 사업연도 종료일보다 두세 달 늦다. 과거 시점 재현(point-in-time)은 이 칸으로 자른다 |
bsns_year 로만 자르면 그해 결산을 그해 안에 알고 있었던 것처럼 된다.
company - 법인 목록
company - 법인 목록| 칸 | 타입 | 널 | 뜻 |
|---|
corp_code | text | 아니오 | DART 기업 코드. 8자리 |
corp_name | text | 아니오 | 법인명 |
stock_code | text | 예 | 종목코드 6자리. 빈 문자열은 널로 바꿔 넣는다 |
modify_date | date | 예 | DART 가 이 법인 정보를 마지막으로 고친 날 |
corp_cls | text | 예 | Y 코스피 / K 코스닥. corpCode.xml 에 없어서 공시 검색 응답으로만 채워진다 |
updated_at | timestamptz | 아니오 | 이 행을 마지막으로 쓴 시각 |
corp_cls 는 한 번 채워지면 널로 되돌지 않는다 (upsert 가 COALESCE 를 쓴다).
filing - 발견한 정기공시
filing - 발견한 정기공시| 칸 | 타입 | 널 | 뜻 |
|---|
rcept_no | text | 아니오 | 접수번호 14자리 |
corp_code | text | 아니오 | 기업 코드 |
corp_cls | text | 예 | 상장 구분 |
stock_code | text | 예 | 종목코드 |
report_nm | text | 아니오 | 공시 제목. 반기보고서 (2026.06) 꼴 |
bsns_year | integer | 예 | 제목에서 알아낸 사업연도 |
reprt_code | text | 예 | 제목에서 알아낸 보고서 종류. 알아내지 못하면 널이고 재무제표를 받지 않는다 |
rcept_dt | date | 아니오 | 접수일 |
is_correction | boolean | 아니오 | 제목에 정정 표시가 있는가. [기재정정] [첨부정정] [첨부추가] [변경등록] [연장결정] 다섯을 본다 |
is_withdrawn | boolean | 아니오 | 원천의 rm 에 철회 표시가 있는가. 실제로 걸린 것이 아직 없다 |
raw | jsonb | 아니오 | 공시 검색 응답 원문 |
discovered_at | timestamptz | 아니오 | 발견 시각 |
updated_at | timestamptz | 아니오 | 마지막으로 쓴 시각 |
statement_task - 보고서 하나를 받았는지
키: (corp_code, bsns_year, reprt_code, fs_div).
statement_task - 보고서 하나를 받았는지 (칸, 타입, 뜻 칸이 있는 표)| 칸 | 타입 | 뜻 |
|---|
target_rcept_no | text | 이 칸의 최신 비철회 공시. 발견 단계가 갱신한다 |
collected_rcept_no | text | 실제로 받아낸 공시 |
status | text | pending / retry / completed / no_data / failed |
attempts | integer | 시도 횟수 |
next_attempt_at | timestamptz | 다음 시도 시각 |
last_error | text | 마지막 오류 |
statement_task - 보고서 하나를 받았는지 (status, 뜻 칸이 있는 표)status | 뜻 |
|---|
completed | 받아서 적재했다 |
no_data | 원천이 그 조합에 재무제표가 없다고 답했다 (DART status 013). 실패가 아니다 |
pending | 아직 받지 않았다 |
retry | 재시도 대기 |
failed | 포기했다 |
밀린 것과 포기한 것이 없는 것이 정상이다. 상태별 건수를 세는 질의는 8절에 있다.
target_rcept_no 가 바뀌면(정정 공시) status 가 pending 으로 되돌고 attempts 가 0 이 된다. 그것이 정정을 다시 받아오는 방법이다.
중복과 정정을 어떻게 다루나
중복과 정정을 어떻게 다루나| 상황 | 어떻게 |
|---|
| 같은 공시를 두 번 받는다 | 유일 키에 걸려 upsert 로 덮는다. 결과가 같다 |
| 정정 공시가 온다 | 그 칸의 기존 행 전부를 is_current=false 로 내리고 새 판을 is_current=true 로 넣는다. 옛 판을 지우지 않는다 |
| 같은 공시를 다시 받는다 | 같은 source_rcept_no 라 유일 키가 같고, is_current 가 다시 true 가 된다 |
기본 조회는 is_current 로 걸러야 한다. 걸지 않으면 판이 둘 이상인 칸에서 같은 계정이 두 번 나온다. 옛 판이 몇 칸에 몇 행인지 세는 질의는 8절에 있다.
5. 언제 갱신되나
5. 언제 갱신되나 | 값 |
|---|
| 스케쥴 | 매일 09:00 KST (cron "0 9 * * *", Asia/Seoul) |
| 마감 확인 | 09:30. collect-dart-DLC flow 가 그날 성공한 실행이 있는지 본다. 없으면 일부러 실패해서 Discord 로 알린다 |
| flow 이름 | collect-dart. task 는 dart-init-db -> dart-collect |
| flow timeout | 43,200초 (12시간). 24시간 주기와 겹치지 않는다 |
| 실행 재시도 | 없다 (retries=0) |
소요와 호출 수
호출 수는 계산으로 나온다. 새 공시가 없는 날은 3회다. 기업 목록 1회 + 공시 검색 2회(Y, K)다. 호출 하나가 재무제표 하나에 대응하므로, 새 보고서가 n개면 3 + n 회다. 일상 실행은 그래서 새 보고서 수에 붙고, 대개 짧다.
최초 backfill 은 그 반대쪽이다. 예산(38,000회)을 매일 다 쓰며 나흘에 걸쳐 따라잡았고 그것이 정상 동작이다. collect_log 에 남은 그때 기록이다.
소요와 호출 수| 날 | 소요 | 호출 | 적재 행 | 멈춘 이유 |
|---|
| 2026-05-06 | 1시간 13분 41초 | 37,608 | 3,096,837 | dart_daily_limit |
| 2026-05-07 | 1시간 12분 56초 | 37,172 | 4,760,570 | dart_daily_limit |
| 2026-05-08 | 1시간 16분 53초 | 38,000 | 4,817,401 | dart_daily_limit |
| 2026-05-09 | 1시간 13분 32초 | 38,000 | 4,924,170 | budget_exhausted |
예산에 걸려 멈춘 실행의 종료 코드는 0 이다. 최근 실행의 소요와 호출 수를 보는 질의는 8절에 있다.
실패했을 때 무엇이 남나
실패했을 때 무엇이 남나| 상태 | 어디에 | 무엇이 남나 |
|---|
| 정상 종료 | collect_log | status='success', stop_reason='complete', 단계별 건수 |
| 예산 소진 | collect_log | status='stopped', stop_reason='budget_exhausted' 또는 'dart_daily_limit'. 실패가 아니다 |
| 실패 | collect_log | status='failed', stop_reason='error', error 에 원인 |
| 프로세스가 죽었다 | collect_log | status='running' 인 채로 남는다. finished_at 이 널이다 |
| 재무제표 한 건이 실패 | statement_task | status='retry' 또는 'failed', last_error, attempts |
| 호출은 나갔다 | api_usage | 실패해도 소비된 호출이 남는다 |
cursor 는 실패해도 전진하지 않는다. 그래서 다음 실행이 그 창을 다시 훑는다. 2026-08-29 의 실패분은 손으로 메우지 않았고 이후 실행이 이어받았다.
6. 값을 믿을 수 있는 근거
이 원천에서 가장 어려운 문제는 어느 행들이 같은 계정인가다. 연도별 추이를 읽으려면 이 판단이 반드시 필요하고, 원천이 그것을 주지 않는다.
같은 이름이 같은 계정을 뜻하지 않는다
한 보고서 안에서 같은 이름이 서로 다른 두 개 이상의 번호로 갈리는 경우가 많다. 세는 질의는 8절에 있다.
같은 보고서에 함께 나왔으면 서로 다른 줄이다. 삼성전자 연결 포괄손익계산서의 관계기업 및 공동기업의 기타포괄손익에 대한 지분 이 그 예다. 재분류되는 것과 안 되는 것 둘이 해마다 나란히 있다.
ifrs-full_ShareOfOtherComprehensiveIncomeOf...ThatWillBeReclassifiedToProfitOrLossNetOfTax
ifrs-full_ShareOfOtherComprehensiveIncomeOf...ThatWillNotBeReclassifiedToProfitOrLossNetOfTax
그래서 이렇게 잇는다
판단은 packages/a42_dart/src/a42_dart/views.py 의 group_accounts() 한 곳에서만 한다. 표와 추이 차트가 그 결과를 함께 쓴다. 두 곳에서 따로 판단하면 표와 차트가 어긋난다.
한 칸(회사 + 보고서 종류 + 연결/개별 + 재무제표 종류) 안에서,
그래서 이렇게 잇는다| 순서 | 규칙 | 무엇을 잡나 |
|---|
| 1 | 번호가 같으면 같은 줄. IFRS 접두사 ifrs_ 와 ifrs-full_ 은 같은 것으로 본다 | 이름이 해마다 흔들리는 것 |
| 2 | 이름이 같으면 같은 줄 | 번호가 해마다 옮겨 가는 것 |
| 3 | 잇지 않는 잣대: 한 묶음에 든 두 줄이 한 보고서에 함께 나온 적이 있으면 그 묶음은 잇지 않는다. 번호별로 갈라 둔다 | 이름만 같은 서로 다른 계정 |
3번이 핵심이다. 함께 나왔다는 것이 서로 다른 줄이라는 증거다.
판단에 쓰는 것은 그 칸의 모든 해다. 화면에 보이는 5년만 보면 창 밖에서 두 줄이 한 해에 함께 나오는 것을 놓쳐 서로 다른 계정을 이어 버린다.
번호가 없던 해(-표준계정코드 미사용-)는 이름으로만 찾을 수 있다. 그래서 묶음마다 그 해의 이름을 따로 들고 있다. 없으면 표에는 다섯 해가 있는데 차트에는 세 점만 찍힌다.
잇지 말아야 할 것을 잇지 않았다는 근거
이 규칙이 계정을 잘못 합쳤다면 한 묶음에 한 해 값이 둘 들어가는 자리가 반드시 늘어난다. 그 수치를 옛 규칙(번호만으로 모으기)과 견줬고 결과가 셋이다.
- 격자에 같은 글자가 두 번 나오는 행이 크게 줄었다
- 한 묶음에 한 해 값이 둘인 자리는 하나도 늘지 않았다. 이것이 안전 증명이다
- 지금 규칙이 더 나빠진 칸은 없다
그때 센 수치는 dev/backlog/docs-5_dart-data-spec.done 에 날짜와 함께 있다. 이 문서에 옮겨 적지 않는다. 견주는 계산은 그때 한 번 돌린 것이고 다시 돌리는 명령이 없다.
남은 자리는 같은 번호가 한 보고서에 두 번 나오는 것이다. 규칙과 무관하게 전부터 있었고 재무상태표에 가장 많다.
이은 것이 실제로 같은 계정이라는 근거
무형자산 이 가장 좋은 예다. 4절의 표대로 번호가 넷인데 이름은 한 번도 바뀌지 않았고 값이 이어진다. 추이 조회가 네 번호를 하나로 이어 사업연도 2015 부터의 점을 한 줄로 준다 (/api/v1/dart/companies/00126380/account).
번호를 믿고 가르면 한 줄이 네 조각이 되고, 그 가운데 하나 (ifrs_InvestmentProperty)는 이름과 뜻이 어긋난다.
번호가 해마다 바뀐다
삼성전자 연결 재무상태표에서 확인한 것들이다.
번호가 해마다 바뀐다| 계정과목 | 번호가 옮겨 간 경로 |
|---|
매출채권 | dart_ShortTermTradeReceivable -> ifrs-full_CurrentTradeReceivables |
미수금 | -표준계정코드 미사용- -> dart_ShortTermOtherReceivables -> dart_ShortTermOtherReceivablesNet |
선급비용 | -표준계정코드 미사용- -> dart_ShortTermPrepaidExpenses -> ifrs-full_CurrentPrepaidExpenses |
무형자산 | -표준계정코드 미사용- -> ifrs_InvestmentProperty -> ifrs-full_IntangibleAssetsOtherThanGoodwill -> ifrs-full_IntangibleAssetsAndGoodwill |
dart_ShortTermX -> ifrs-full_CurrentX 로 옮겨 가는 꼴이 되풀이된다. 접두사만 다른 것이 아니라 낱말이 다르다 (ShortTerm 대 Current).
그래서 규칙 하나로 적을 수 없다. 손으로 짝을 적어 두면 새 보고서가 들어올 때마다 썩는다.
빈 칸과 0 은 다르다
빈 칸과 0 은 다르다| 화면에 보이는 것 | 무슨 뜻인가 |
|---|
| 빈 칸 | 그 해 보고서에 그 계정과목이 없었다. 값을 모른다 |
0 | 그 해 보고서에 0원으로 적혀 있었다 |
financial_statement 에도 두 가지가 따로 있다. thstrm_amount_numeric = 0 인 행과 IS NULL 인 행이 각각 있고, 세는 질의는 8절에 있다.
없는 자리를 0 으로 채우지 않는다. 채우면 "그 해에 0원" 으로 읽히는데 실제로는 "보고서에 그 항목이 없었다" 다. 여러 해 격자에서 없는 해의 계정과목은 행이 아예 오지 않고, 받는 쪽이 그 자리를 빈 칸으로 둔다.
검색이 잘렸는지를 정확히 판정한다
기업 검색은 상한보다 하나 더 읽어서 잘렸는지 본다. count == limit 로 보면 마침 딱 상한만큼 맞는 검색어에서 잘렸다고 거짓말을 한다.
확인하는 방법은 반례를 만드는 것이다. 맞는 것이 정확히 n개인 검색어에 상한을 n 으로 주면 truncated 가 거짓이어야 하고, n-1 로 주면 참이어야 한다. 그 둘을 실제로 확인했다. 부르는 예는 8절에 있다.
7. 알려진 한계
상장폐지된 기업이 아예 없다
공시 검색이 상장 구분(corp_cls=Y, corp_cls=K)으로 거르고, 그 구분은 회사의 현재 상태다. 상장폐지된 회사는 지금 Y 도 K 도 아니므로, 그 회사의 과거 공시까지 검색 결과에 나오지 않는다.
- 마지막 공시가 몇 해 전인 기업이 사실상 없다. 십 년 넘는 기간에 상장폐지가 한 건도 없을 수는 없다
- 연도별 공시 기업 수가 단조 증가한다. 실제 상장사 모집단이라면 들어오고 나가는 것이 섞여 이렇게 되지 않는다
백테스트에 그대로 쓰면 생존 편향이 들어간다. 망한 회사가 표본에 없다.
2026-09-03 이전에 받은 자본변동표는 열이 하나만 남아 있다
자본변동표(SCE)에서 account_detail 은 자본 구성요소를 가리키는 열 축이다 (자본금, 주식발행초과금, 이익잉여금, 비지배지분 등). 같은 (account_id, account_nm, ord) 이 열마다 한 번씩 온다.
옛 유일 키에 그 칸이 빠져 있었다. 그래서 뒤에 온 열이 앞의 열을 덮고, 열 개수만큼의 행이 한 행으로 뭉개졌다. 남은 행은 응답에서 마지막에 나온 것이고, 어느 열의 값인지 행마다 다르다 (연결재무제표 [member], ...주식발행초과금 [구성요소], ...이익잉여금 [구성요소] 같은 것이 한 보고서 안에 섞인다).
키는 2026-09-03 에 고쳤다 (account_detail 이 들어갔다. 4절). 그 뒤에 받은 보고서는 열마다 한 행이 남는다. 그 전에 받아 둔 보고서는 그대로 뭉개진 채 남아 있다. 잃은 행은 저장된 적이 없어서 키를 고쳐도 되살아나지 않고, 원천에서 다시 받아야 채워진다. 재수집은 하지 않았다 (a42_dart-4).
2026-09-03 이전에 받은 자본변동표는 열이 하나만 남아 있다| 언제 받은 보고서 | 자본변동표 |
|---|
| 2026-09-03 이후 | 열마다 한 행. 온전하다 |
| 그 전 | 계정과목당 한 행. 그 값이 어느 열인지 일정하지 않다 |
뭉개진 보고서의 자본변동표를 다른 재무제표와 견주면 조용히 어긋난다. 계정 이름이 자본총계 인데 값은 특정 자본 구성요소 열의 값일 수 있다. 오류도 경고도 나지 않는다. 재무상태표의 같은 계정과 견주는 질의가 8절에 있다.
받은 때는 collected_at 으로 가른다. 뭉개졌는지 아닌지를 그 칸으로 판단한다.
다른 네 종류는 영향이 없다. account_detail 이 전부 - 다. 세는 질의는 8절에 있다.
원천이 번호를 잘못 붙인 사례
삼성전자 연결 재무상태표 2017년과 2018년의 무형자산 에 ifrs_InvestmentProperty (투자부동산)가 붙어 있다. 이름과 값은 무형자산 줄로 이어지는데 번호만 다른 계정을 가리킨다.
번호를 정체로 삼으면 이런 행이 잘못 묶인다. 그래서 이 저장소는 회사가 적은 이름을 줄의 정체로 삼는다.
같은 이름 중복을 다 가르지 못한다
이을 수 없다고 판정한 묶음은 이름이 같은 채로 남는다. 번호만으로 모을 때보다 크게 줄었지만 0 은 아니다 (6절).
화면은 그 줄에 계정 번호를 붙여 글자를 다르게 만든다. 온전한 번호는 백 자를 넘기도 해서 한 칸에 안 들어가므로 자른 딱지를 쓴다. 어느 쪽이 어느 계정인지는 사람이 번호를 보고 판단해야 한다.
검색이 잘리고, 전체 개수를 주지 않는다
검색이 잘리고, 전체 개수를 주지 않는다 | 값 |
|---|
| 기본 상한 | 50개 |
| 상한의 상한 | 200개 |
| 넘으면 | 앞의 것만 오고 truncated 가 true 다 |
| 전체 개수 | 주지 않는다 |
상한 둘은 packages/a42_dart/src/a42_dart/views.py 의 clamp(limit, 50, 200) 이 정본이다. 전역 검색 상자의 상한은 이것과 다르다 (search_routes.py).
전체 개수를 안 주는 이유는 값이 싸지 않기 때문이다. 검색이 corp_name ILIKE '%<검색어>%' 라 앞이 열린 와일드카드고 company 가 십만 행 단위라, COUNT(*) 는 검색마다 전수 스캔이 된다.
잘렸다는 사실만 알면 화면이 할 말은 다 한다.
아직 안 나온 보고서와 처음부터 없는 보고서
아직 안 나온 보고서와 처음부터 없는 보고서| 무엇 | 왜 |
|---|
| 진행 중인 사업연도의 사업보고서 | 사업연도가 안 끝났다. 12월 결산이 아닌 회사만 있다 |
| 진행 중인 사업연도의 3분기보고서 | 아직 제출 시기가 아니다 (보통 11월) |
| 2015년 반기/1분기/3분기 | 원천이 재무제표를 주지 않는다. 그 조합의 statement_task 가 전부 no_data 다 |
| 2014년 이전 | 2015-01-01 부터 훑는다 (INITIAL_CURSOR_DATE). 사업연도 2014 task 도 전부 no_data 다 |
분기와 반기 재무제표는 사업연도 2016부터다. 사업보고서는 2015부터다.
statement_task 의 no_data 는 사업연도 2015 이하에 몰려 있고, 2016년 이후에도 해마다 꾸준히 있다. 그것은 정기공시를 냈지만 이 API 에 재무제표가 없는 보고서다.
통화가 원이 아닌 기업이 있다
원이 아닌 통화로 보고하는 기업이 있다 (USD, CNY, JPY, HKD, GBP). 금액 칸에 환산이 들어 있지 않다. 여러 회사를 나란히 놓고 더하기 전에 currency 를 봐야 한다.
그 밖에
그 밖에| 한계 | 내용 |
|---|
| 보고서 종류를 못 알아낸 공시 | 제목에서 사업연도나 보고서 코드를 읽지 못한 것이고 재무제표를 받지 않는다 |
ord 에 빈 번호가 있다 | 삼성전자 2025 연결 재무상태표가 52행인데 ord 는 7~60 이다. 원천이 준 값이라 연속을 가정할 수 없다 |
| 사업보고서에 누적과 전기동기 칸이 없다 | thstrm_add_amount, frmtrm_q_amount, frmtrm_add_amount 가 11011 에 없다 |
source_rcept_dt 에 인덱스가 없다 | 기간(min/max)이 전수 스캔이다. 그래서 재고 화면에서 이 데이터셋의 기간이 비어 있다 |
| 주석과 부속명세는 없다 | 이 API 는 재무제표 본문 계정만 준다 |
| 계정과목 계층이 없다 | 총계와 세부가 평평한 한 표에 있다. ord 순서만 있고 부모와 자식 관계가 없다 |
8. 직접 확인하는 법
이 문서에서 뺀 수를 여기서 센다. 무거운 조회는 표시했다. 가르는 것은 인덱스를 쓰는지와 전수 스캔인지다.
접속
# DSN 은 apps/a42_collector/.env 의 A42_DART_DSN
psql "$A42_DART_DSN"
1절의 재고
-- 가볍다
SELECT 'financial_statement' AS t, count(*) FROM financial_statement
UNION ALL SELECT 'statement_task', count(*) FROM statement_task
UNION ALL SELECT 'company', count(*) FROM company
UNION ALL SELECT 'filing', count(*) FROM filing
UNION ALL SELECT 'api_usage', count(*) FROM api_usage
UNION ALL SELECT 'collect_log', count(*) FROM collect_log
UNION ALL SELECT 'collector_state', count(*) FROM collector_state;
SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;
financial_statement 의 행수는 위 count(*) 가 전수 스캔이 아니다. 기간과 기업 수는 무겁다 (7절).
-- 무겁다. 1,800만행 전수 스캔이다
SELECT count(DISTINCT corp_code) AS corps,
min(source_rcept_dt), max(source_rcept_dt)
FROM financial_statement;
2절의 층과 축
-- 가볍다
SELECT count(*) AS company,
count(*) FILTER (WHERE corp_cls IN ('Y','K')) AS listed,
count(*) FILTER (WHERE corp_cls = 'Y') AS y,
count(*) FILTER (WHERE corp_cls = 'K') AS k,
count(*) FILTER (WHERE stock_code IS NOT NULL) AS with_stock_code
FROM company;
SELECT count(*) AS filing, min(rcept_dt), max(rcept_dt) FROM filing;
SELECT status, count(*) FROM statement_task GROUP BY status;
SELECT key, value, updated_at FROM collector_state ORDER BY key;
-- 조금 무겁다. 병렬 스캔이 붙는다
SELECT reprt_code, count(*) FROM financial_statement GROUP BY 1 ORDER BY 1;
SELECT sj_div, min(sj_nm) AS sj_nm, count(*) FROM financial_statement GROUP BY 1;
SELECT fs_div, count(*) FROM financial_statement GROUP BY 1;
SELECT is_current, count(*) FROM financial_statement GROUP BY 1;
연도별 보고서 수록 기업 수다 (2절). 2015년 행과 가장 최근 해를 7절과 함께 읽는다.
-- 무겁다
SELECT bsns_year,
count(DISTINCT corp_code) FILTER (WHERE reprt_code='11011') AS annual,
count(DISTINCT corp_code) FILTER (WHERE reprt_code='11012') AS half,
count(DISTINCT corp_code) FILTER (WHERE reprt_code='11013') AS q1,
count(DISTINCT corp_code) FILTER (WHERE reprt_code='11014') AS q3
FROM financial_statement WHERE is_current
GROUP BY 1 ORDER BY 1 DESC;
4절의 칸과 통화
-- 무겁다
SELECT count(*) AS rows,
count(thstrm_amount_numeric) AS thstrm,
count(frmtrm_amount_numeric) AS frmtrm,
count(frmtrm_q_amount_numeric) AS frmtrm_q,
count(bfefrmtrm_amount_numeric) AS bfefrmtrm,
count(thstrm_add_amount_numeric) AS thstrm_add,
count(frmtrm_add_amount_numeric) AS frmtrm_add
FROM financial_statement;
파싱이 조용히 실패한 행이 없는지다. 0 이 나와야 한다.
-- 무겁다
SELECT count(*) AS mismatched
FROM financial_statement
WHERE thstrm_amount_numeric IS NULL AND thstrm_amount IS NOT NULL;
-- 무겁다
SELECT count(*) FILTER (WHERE thstrm_amount_numeric = 0) AS zero,
count(*) FILTER (WHERE thstrm_amount_numeric IS NULL) AS nulls,
count(*) FILTER (WHERE thstrm_amount_numeric < 0) AS negative
FROM financial_statement;
-- 무겁다. count(DISTINCT) 가 정렬을 부른다
SELECT currency, count(*), count(DISTINCT corp_code) AS corps
FROM financial_statement GROUP BY 1 ORDER BY 2 DESC;
-- 무겁다
SELECT count(*) FILTER (WHERE NOT is_current) AS old_rows,
count(DISTINCT (source_rcept_no, fs_div))
FILTER (WHERE NOT is_current) AS old_filings
FROM financial_statement;
번호가 흔들리는 것을 본다
-- 가볍다. 인덱스를 쓴다
SELECT bsns_year, account_id, thstrm_amount_numeric
FROM financial_statement
WHERE corp_code = '00126380' AND reprt_code = '11011'
AND fs_div = 'CFS' AND sj_div = 'BS'
AND is_current AND account_nm = '무형자산'
ORDER BY bsns_year DESC;
4절의 표대로 account_id 가 넷 나온다.
같은 이름이 두 번호로 갈리는 수를 센다
-- 무겁다. 전수 스캔에 그룹 정렬이 붙는다
SELECT count(*) AS split_names
FROM (
SELECT source_rcept_no, fs_div, sj_div, account_nm
FROM financial_statement
WHERE is_current AND account_id <> '-표준계정코드 미사용-'
GROUP BY 1,2,3,4
HAVING count(DISTINCT account_id) > 1
) t;
상장폐지 기업이 없는 것을 본다
-- 가볍다
SELECT extract(year FROM last_dt)::int AS last_filing_year, count(*) AS corps
FROM (SELECT corp_code, max(rcept_dt) AS last_dt FROM filing GROUP BY 1) t
GROUP BY 1 ORDER BY 1;
해가 둘셋뿐이고 그 가운데 거의 전부가 올해다. 십 년 넘는 기간에 그럴 수 없다 (7절).
연도별 공시 기업 수가 단조 증가하는 것도 본다.
-- 가볍다
SELECT extract(year FROM rcept_dt)::int AS yr, count(DISTINCT corp_code) AS corps
FROM filing GROUP BY 1 ORDER BY 1;
자본변동표가 몇 행 남는지 본다
-- 가볍다
SELECT account_id, account_nm, account_detail, ord
FROM financial_statement
WHERE source_rcept_no = '20260310002820'
AND fs_div = 'CFS' AND sj_div = 'SCE'
ORDER BY ord;
원천 응답의 SCE 행 수와 견주려면 그 공시를 한 번 직접 부른다. 호출 예산을 쓰므로 표본 하나로만 한다.
보고서 하나에 몇 행씩 남았는지를 재무상태표와 견준다. 7절이 말하는 뭉개짐이 보고서 단위로 드러난다.
-- 무겁다. 전수 스캔이다
SELECT sj_div, count(*) AS pairs, round(avg(n), 1) AS mean, min(n), max(n)
FROM (SELECT sj_div, source_rcept_no, fs_div, count(*) AS n
FROM financial_statement
WHERE sj_div IN ('BS', 'SCE') AND is_current
GROUP BY 1, 2, 3) t
GROUP BY 1;
키를 고친 뒤에 받은 보고서만 따로 본다 (7절의 표).
-- 무겁다. collected_at 에 인덱스가 없다
SELECT count(*) AS pairs, round(avg(n), 1) AS mean, min(n), max(n)
FROM (SELECT source_rcept_no, fs_div, count(*) AS n
FROM financial_statement
WHERE sj_div = 'SCE' AND is_current
AND collected_at >= '2026-09-04'::date
GROUP BY 1, 2) t;
자본변동표가 다른 재무제표와 어긋나는지 본다
같은 계정을 재무상태표와 자본변동표에서 꺼내 견준다. 뭉개진 보고서에서는 자본변동표 쪽이 특정 열의 값 하나로 남아 크게 어긋난다 (7절).
-- 가볍다
SELECT sj_div, account_detail, thstrm_amount_numeric, collected_at
FROM financial_statement
WHERE corp_code = '00126380' AND bsns_year = 2025 AND reprt_code = '11011'
AND fs_div = 'CFS' AND account_id = 'ifrs-full_Equity' AND is_current
AND sj_div IN ('BS', 'SCE')
ORDER BY sj_div, account_detail;
account_detail 을 열 축으로 쓰는 재무제표가 무엇인지 본다
-- 무겁다. 전수 스캔이다
SELECT sj_div, count(*) AS rows,
count(*) FILTER (WHERE account_detail IS DISTINCT FROM '-') AS detail_rows,
count(DISTINCT account_detail) AS kinds
FROM financial_statement WHERE is_current GROUP BY 1 ORDER BY 2 DESC;
실행 기록
-- 가볍다
SELECT id, started_at, finished_at - started_at AS elapsed, status, stop_reason,
calls_used, filings_discovered, tasks_processed, statements_upserted, error
FROM collect_log ORDER BY id DESC LIMIT 10;
SELECT usage_date, calls_used, call_limit FROM api_usage ORDER BY 1 DESC LIMIT 5;
호출 없이 이어받기 지점만 본다
uv run a42-collector dart collect --dry-run
cursor 가 없으면 cursor 없음. 전체 backfill 이 된다 를 찍는다. 그때는 실제 수집을 돌리지 않는다.
API
127.0.0.1:8000 (상시로 떠 있는 조회 API).
API| 경로 | 무엇 |
|---|
GET /api/v1/datasets | 재고. 1절이 이것을 읽는다 |
GET /api/v1/dart/companies?q=<검색어>&limit=<1~200> | 기업 검색. truncated 와 limit 을 함께 준다 |
GET /api/v1/dart/companies/{corp_code} | 기업 메타데이터와 있는 보고서 조합 |
GET /api/v1/dart/companies/{corp_code}/statement?bsns_year=&reprt_code=&fs_div=&sj_div=&include_old= | 한 해. 당기와 전기 두 칸 |
GET /api/v1/dart/companies/{corp_code}/statements?bsns_year=&bsns_year=&reprt_code=&fs_div=&sj_div= | 여러 해. 연도가 열. 줄마다 group 과 kept_apart 가 붙는다 |
GET /api/v1/dart/companies/{corp_code}/account?account_id=&fs_div=&sj_div=&reprt_code= | 계정과목 하나의 연도별 추이 |
검색이 잘렸는지 판정하는 방법을 확인하는 부름이다 (6절). 맞는 것이 정확히 n개인 검색어를 골라 limit 을 n 과 n-1 로 주고 truncated 를 견준다.
curl -s 'http://127.0.0.1:8000/api/v1/dart/companies?q=삼성전자'
curl -s 'http://127.0.0.1:8000/api/v1/dart/companies?q=삼'
curl -s 'http://127.0.0.1:8000/api/v1/dart/companies?q=삼성전자&limit=5'
curl -s 'http://127.0.0.1:8000/api/v1/dart/companies?q=삼성전자&limit=4'
curl -s 'http://127.0.0.1:8000/api/v1/dart/companies/00126380/account?account_id=ifrs-full_IntangibleAssetsAndGoodwill&fs_div=CFS&sj_div=BS&reprt_code=11011'
화면
127.0.0.1:3000 (상시로 떠 있는 조회 화면).
화면| 주소 | 무엇 |
|---|
/ | 재고 |
/spec/dart | 이 문서. 1절에 재고가 라이브로 붙는다 |
/dart | 기업 검색 |
/dart/00126380 | 삼성전자. 처음 열면 사업보고서가 있는 가장 최근 해로 열린다 |
/dart/00126380?year=2025&reprt=11011&fs=CFS&sj=BS&unit=eok&span=10 | 연결 재무상태표 10년, 억원 단위 |
/datasets/dart_financial_statement | 재고 항목. 행 수와 기간 |