Unified power-user entry point for edgarjure. Require as: (require '[edgar.api :as e])
Design principles:
Unified power-user entry point for edgarjure. Require as: (require '[edgar.api :as e]) Design principles: - Every function accepts ticker or CIK interchangeably - Keyword args throughout; no positional form/type args - Sensible defaults for taxonomy (us-gaap), unit (USD), form (10-K) - :concept accepts a string or a collection of strings - Functions that return datasets always return tech.ml.dataset, never seq-of-maps
Financial statement extraction with normalization and standardization.
Three output views for each statement (:view option): :as-reported - raw XBRL observations for the statement's concepts, exactly as filed; no deduplication, no label mapping :normalized - (default) fallback chains map variant tags to canonical labels; restatements deduplicated by most-recent-filed :standardized - :normalized plus derived line items imputed from arithmetic identities (e.g. Gross Profit = Revenue - Cost of Revenue). Derived rows carry :method :derived and :derived-from for auditability.
Concept fallback chains: each line item is a vector of concept names tried in order; the first one present in the facts data wins. Chains are loaded from EDN files under resources/edgar/concepts/ and exposed as public vars, so power users can inspect them or pass their own via :concepts.
Industry routing: banks (SIC 6000-6199, 6712) and insurers (SIC 6300-6399, 6411) use fundamentally different income statement line items. When no explicit :industry or :concepts is given, income-statement auto-routes on the company's SIC code. Pass :industry :standard to force generic chains.
Duration vs instant: Income statement + cash flow -> duration observations (row has :start date) Balance sheet -> instant observations (row has no :start date)
Point-in-time / look-ahead-safe mode: Pass :as-of "YYYY-MM-DD" to any public function to restrict to filings where :filed <= as-of-date. Without :as-of the latest restated value is returned (always-latest behaviour).
Quarterly and LTM derivation (10-Q only, flow variables only): :duration-months - 3/6/9/12 classification of the observation window :val-q - single-quarter value. Derived from actual period dates: a ~3-month row is used as-is; a YTD row minus the YTD row one quarter shorter (same fiscal-year start) yields the quarter ending at the longer row's end. The SEC :fy/:fp fields are deliberately NOT used — they describe the filing, not the observation, and collide across comparative periods. :val-ltm - last-twelve-months: sum of four consecutive derived quarters matched on period-end dates (±14 days tolerance for 52/53-week fiscal calendars). 10-K annual rows participate in the derivation so that Q4 = FY - 9M YTD.
Unmapped-concept logging: every statement call records us-gaap concepts in the company's facts that no active chain matched. See unmapped-concepts, clear-unmapped-concepts!, save-unmapped-concepts!.
Financial statement extraction with normalization and standardization.
Three output views for each statement (:view option):
:as-reported - raw XBRL observations for the statement's concepts,
exactly as filed; no deduplication, no label mapping
:normalized - (default) fallback chains map variant tags to canonical
labels; restatements deduplicated by most-recent-filed
:standardized - :normalized plus derived line items imputed from
arithmetic identities (e.g. Gross Profit = Revenue -
Cost of Revenue). Derived rows carry :method :derived
and :derived-from for auditability.
Concept fallback chains: each line item is a vector of concept names tried
in order; the first one present in the facts data wins. Chains are loaded
from EDN files under resources/edgar/concepts/ and exposed as public vars,
so power users can inspect them or pass their own via :concepts.
Industry routing: banks (SIC 6000-6199, 6712) and insurers (SIC 6300-6399,
6411) use fundamentally different income statement line items. When no
explicit :industry or :concepts is given, income-statement auto-routes on
the company's SIC code. Pass :industry :standard to force generic chains.
Duration vs instant:
Income statement + cash flow -> duration observations (row has :start date)
Balance sheet -> instant observations (row has no :start date)
Point-in-time / look-ahead-safe mode:
Pass :as-of "YYYY-MM-DD" to any public function to restrict to filings
where :filed <= as-of-date. Without :as-of the latest restated value is
returned (always-latest behaviour).
Quarterly and LTM derivation (10-Q only, flow variables only):
:duration-months - 3/6/9/12 classification of the observation window
:val-q - single-quarter value. Derived from actual period dates:
a ~3-month row is used as-is; a YTD row minus the YTD row one
quarter shorter (same fiscal-year start) yields the quarter
ending at the longer row's end. The SEC :fy/:fp fields are
deliberately NOT used — they describe the filing, not the
observation, and collide across comparative periods.
:val-ltm - last-twelve-months: sum of four consecutive derived quarters
matched on period-end dates (±14 days tolerance for 52/53-week
fiscal calendars). 10-K annual rows participate in the
derivation so that Q4 = FY - 9M YTD.
Unmapped-concept logging: every statement call records us-gaap concepts in
the company's facts that no active chain matched. See unmapped-concepts,
clear-unmapped-concepts!, save-unmapped-concepts!.Central loader for all built-in edgarjure form parsers.
Requiring this namespace registers filing-obj methods for all supported form types. Individual parsers can also be required directly.
Usage: (require '[edgar.forms]) ; loads all built-in parsers (edgar.filing/filing-obj filing) ; dispatches to the appropriate parser
Supported form types after loading: "4" — Form 4: insider trades (edgar.forms.form4) "13F-HR" — Form 13F-HR: institutional holdings (edgar.forms.form13f) "13F-HR/A" — Form 13F-HR/A: amended institutional holdings (edgar.forms.form13f)
Central loader for all built-in edgarjure form parsers. Requiring this namespace registers filing-obj methods for all supported form types. Individual parsers can also be required directly. Usage: (require '[edgar.forms]) ; loads all built-in parsers (edgar.filing/filing-obj filing) ; dispatches to the appropriate parser Supported form types after loading: "4" — Form 4: insider trades (edgar.forms.form4) "13F-HR" — Form 13F-HR: institutional holdings (edgar.forms.form13f) "13F-HR/A" — Form 13F-HR/A: amended institutional holdings (edgar.forms.form13f)
No vars found in this namespace.
Form 13F-HR parser — Institutional Investment Manager Holdings Report. Registers a filing-obj method for form type "13F-HR".
Only handles XML-era filings (post-2013 Q2). Earlier filings use heterogeneous plain-text infotables and are not supported.
Usage: (require '[edgar.forms.form13f]) ; side-effectful load registers the method (edgar.filing/filing-obj filing) ; => {:form "13F-HR" :holdings <dataset> ...}
Form 13F-HR parser — Institutional Investment Manager Holdings Report.
Registers a filing-obj method for form type "13F-HR".
Only handles XML-era filings (post-2013 Q2). Earlier filings use
heterogeneous plain-text infotables and are not supported.
Usage:
(require '[edgar.forms.form13f]) ; side-effectful load registers the method
(edgar.filing/filing-obj filing) ; => {:form "13F-HR" :holdings <dataset> ...}Form 4 parser — Statement of Changes in Beneficial Ownership. Registers a filing-obj method for form type "4".
Usage: (require '[edgar.forms.form4]) ; side-effectful load registers the method (edgar.filing/filing-obj filing) ; => {:form "4" :reporting-owner {...} :transactions [...]}
Form 4 parser — Statement of Changes in Beneficial Ownership.
Registers a filing-obj method for form type "4".
Usage:
(require '[edgar.forms.form4]) ; side-effectful load registers the method
(edgar.filing/filing-obj filing) ; => {:form "4" :reporting-owner {...} :transactions [...]}SEC Financial Statement Data Sets (DERA) access. https://www.sec.gov/dera/data/financial-statement-data-sets
Quarterly ZIPs containing four tab-delimited tables: sub — one row per submission: adsh, cik, name, sic, form, period, fy, fp, filed, and filer metadata num — one row per numeric fact: adsh, tag, version, ddate, qtrs, uom, segments, value pre — statement placement: adsh, stmt (BS/IS/CF/EQ/CI), report, line, tag — i.e. which statement each tag appeared on and in what order tag — tag metadata: version, custom flag, datatype, iord (instant/ duration), crdr (credit/debit), label, documentation
Why this matters for standardization: unlike the companyfacts API, these sets include company extension tags and statement placement — the two ingredients Compustat-style cross-company standardization needs most. One bulk download covers every filer for a quarter, instead of one HTTP call per company.
Usage: (require '[edgar.fsds :as fsds]) (def zip (fsds/download-quarter! 2024 1 "/data/fsds")) (def sub (fsds/load-table zip :sub)) (def num (fsds/load-table zip :num)) (def pre (fsds/load-table zip :pre))
;; e.g. income statement placement for one filing: ;; (-> pre ;; (ds/filter-column :adsh #(= % "0000320193-24-000006")) ;; (ds/filter-column :stmt #(= % "IS")))
SEC Financial Statement Data Sets (DERA) access.
https://www.sec.gov/dera/data/financial-statement-data-sets
Quarterly ZIPs containing four tab-delimited tables:
sub — one row per submission: adsh, cik, name, sic, form, period,
fy, fp, filed, and filer metadata
num — one row per numeric fact: adsh, tag, version, ddate, qtrs,
uom, segments, value
pre — statement placement: adsh, stmt (BS/IS/CF/EQ/CI), report, line,
tag — i.e. which statement each tag appeared on and in what order
tag — tag metadata: version, custom flag, datatype, iord (instant/
duration), crdr (credit/debit), label, documentation
Why this matters for standardization: unlike the companyfacts API, these
sets include company extension tags and statement placement — the two
ingredients Compustat-style cross-company standardization needs most.
One bulk download covers every filer for a quarter, instead of one HTTP
call per company.
Usage:
(require '[edgar.fsds :as fsds])
(def zip (fsds/download-quarter! 2024 1 "/data/fsds"))
(def sub (fsds/load-table zip :sub))
(def num (fsds/load-table zip :num))
(def pre (fsds/load-table zip :pre))
;; e.g. income statement placement for one filing:
;; (-> pre
;; (ds/filter-column :adsh #(= % "0000320193-24-000006"))
;; (ds/filter-column :stmt #(= % "IS")))Malli schemas and validation helpers for the edgarjure public API.
Usage (in edgar.api): (schema/validate! ::filings-args {:ticker-or-cik toc :form form ...})
All public validate! calls throw ex-info with :type ::invalid-args on failure. The error message includes the human-readable Malli explanation.
Malli schemas and validation helpers for the edgarjure public API.
Usage (in edgar.api):
(schema/validate! ::filings-args {:ticker-or-cik toc :form form ...})
All public validate! calls throw ex-info with :type ::invalid-args on failure.
The error message includes the human-readable Malli explanation.HTML table extraction from SEC filings.
Extracts <table> elements from filing HTML and converts them to tech.ml.dataset objects. Handles iXBRL inline-tagged content, colspan expansion, and mixed numeric/string columns.
Usage: (require '[edgar.tables :as tables]) (tables/extract-tables filing) ; => seq of datasets (tables/extract-tables filing :nth 0) ; => first table as dataset (tables/extract-tables filing :min-rows 5) ; => only tables with >=5 data rows
HTML table extraction from SEC filings. Extracts <table> elements from filing HTML and converts them to tech.ml.dataset objects. Handles iXBRL inline-tagged content, colspan expansion, and mixed numeric/string columns. Usage: (require '[edgar.tables :as tables]) (tables/extract-tables filing) ; => seq of datasets (tables/extract-tables filing :nth 0) ; => first table as dataset (tables/extract-tables filing :min-rows 5) ; => only tables with >=5 data rows
Validation harness — quantify how close edgarjure's statement output is to a benchmark (Compustat/Capital IQ extract, hand-collected figures, academic reconciliation datasets).
Usage: (require '[edgar.validation :as validation]) (validation/compare-to-benchmark "AAPL" [{:line-item "Revenue" :end "2023-09-30" :val 383285000000} {:line-item "Net Income" :end "2023-09-30" :val 96995000000}]) ;=> {:match-rate 1.0 :matched [...] :mismatched [] :missing []}
Track :match-rate over time as concept files and identities improve.
Validation harness — quantify how close edgarjure's statement output is to
a benchmark (Compustat/Capital IQ extract, hand-collected figures, academic
reconciliation datasets).
Usage:
(require '[edgar.validation :as validation])
(validation/compare-to-benchmark "AAPL"
[{:line-item "Revenue" :end "2023-09-30" :val 383285000000}
{:line-item "Net Income" :end "2023-09-30" :val 96995000000}])
;=> {:match-rate 1.0 :matched [...] :mismatched [] :missing []}
Track :match-rate over time as concept files and identities improve.cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |