JSPM

@omnifolio/sec-toolkit

1.0.0
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 219
  • Score
    100M100P100Q115317F
  • License MIT

Production-grade SEC EDGAR toolkit — XBRL parser, filing text extractor, and financial analysis utilities

Package Exports

  • @omnifolio/sec-toolkit
  • @omnifolio/sec-toolkit/dist/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@omnifolio/sec-toolkit) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

@omnifolio/sec-toolkit

npm version License: MIT TypeScript

Production-grade SEC EDGAR toolkit for parsing XBRL financial data, extracting filing text, and analyzing SEC filings. Supports 10-K, 10-Q, 8-K, 20-F, and 6-K forms with both US-GAAP and IFRS tag mappings.

Built and maintained by the team at Omnifolio — a financial intelligence platform for portfolios, SEC filings, and economic data.


Features

  • 🏦 XBRL Parser — Extract structured income statements, balance sheets, and cash flows from SEC company facts
  • 📄 Text Extractor — Parse 10-K/10-Q/8-K/20-F filings into named sections (Risk Factors, MD&A, etc.)
  • 📊 Financial Metrics — Auto-calculate margins, ratios, ROE, ROA, current ratio, debt-to-equity, and more
  • 🔍 Sentiment Analysis — Built-in word-list sentiment scoring (no ML dependencies)
  • 🔎 Keyword Extraction — Categorize terms as risk, growth, financial, or legal
  • 📈 Filing Comparison — Jaccard similarity diff between filings, detect new/removed risk factors
  • 🌍 IFRS Support — Full tag mappings for foreign private issuers (20-F / 6-K)
  • 🔒 Rate Limiting — Built-in SEC Fair Access Policy compliance (configurable req/s)
  • 💵 Formatters$1.23B, +25.50%, full currency formatting
  • 🔌 Injectable Client — BYO HTTP client or use the built-in one

Installation

npm install @omnifolio/sec-toolkit

Quick Start

Parse Financial Statements

import { XBRLParser, createSECClient } from '@omnifolio/sec-toolkit';

// SEC requires a User-Agent with contact info
const client = createSECClient({
  userAgent: 'MyApp admin@myapp.com',
});

const parser = new XBRLParser(client);

// Parse Apple's financials
const statements = await parser.parseFilingFinancials({
  cik: '0000320193',
  form: '10-K',
  companyName: 'Apple Inc.',
  accessionNumber: '0000320193-23-000106',
  filingDate: '2023-11-03',
  primaryDocument: 'aapl-20230930.htm',
  primaryDocumentUrl: 'https://www.sec.gov/Archives/edgar/data/320193/...',
  filingDetailUrl: 'https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000320193',
  size: 0,
});

// Access structured data
const latest = statements[0];
console.log('Revenue:', latest.incomeStatement.revenue);
console.log('Net Income:', latest.incomeStatement.netIncome);
console.log('Gross Margin:', latest.metrics.grossMargin?.toFixed(1) + '%');
console.log('Current Ratio:', latest.metrics.currentRatio?.toFixed(2));
console.log('Debt/Equity:', latest.metrics.debtToEquity?.toFixed(2));

Extract Filing Text & Analyze

import { SECTextExtractor } from '@omnifolio/sec-toolkit';

const extractor = new SECTextExtractor({
  userAgent: 'MyApp admin@myapp.com',
});

const sections = await extractor.extractAllSections(filing);

for (const section of sections) {
  console.log(`📄 ${section.title}`);
  console.log(`   Words: ${section.wordCount}`);
  console.log(`   Sentiment: ${section.sentiment?.label} (${section.sentiment?.score.toFixed(2)})`);
  console.log(`   Top keywords:`, section.keywords.slice(0, 5).map(k => k.word).join(', '));
}

Compare Filings Year-over-Year

const comparison = await extractor.compareFilings(currentFiling, previousFiling);

console.log(`Overall similarity: ${(comparison.overallSimilarity * 100).toFixed(1)}%`);
console.log(`New risks: ${comparison.newRisks.length}`);
console.log(`Removed risks: ${comparison.removedRisks.length}`);

for (const risk of comparison.newRisks) {
  console.log(`  🆕 ${risk}`);
}

Format Financial Numbers

import { formatCurrency, formatLargeNumber, formatPercentage } from '@omnifolio/sec-toolkit';

formatCurrency(1234567);         // "$1,234,567"
formatLargeNumber(394328000000); // "$394.33B"
formatLargeNumber(-2500000);     // "-$2.50M"
formatPercentage(25.5);          // "+25.50%"
formatPercentage(-3.2);          // "-3.20%"

Get Metric History

const revenueHistory = await parser.getMetricHistory(
  '0000320193', // Apple CIK
  'Revenues',
  10 // last 10 periods
);

for (const point of revenueHistory) {
  console.log(`${point.period}: ${formatLargeNumber(point.value)}`);
}

Bring Your Own Client

import { XBRLParser } from '@omnifolio/sec-toolkit';
import type { SECClient } from '@omnifolio/sec-toolkit';

// Implement the minimal SECClient interface
const myClient: SECClient = {
  async getCompanyFacts(cik: string) {
    const res = await myCustomFetch(`https://data.sec.gov/api/xbrl/companyfacts/CIK${cik}.json`);
    return res.json();
  },
};

const parser = new XBRLParser(myClient);

API Reference

Classes

Class Description
XBRLParser Parses XBRL financial data from SEC company facts API
SECTextExtractor Extracts and analyzes text from SEC filing HTML documents

Factory Functions

Function Description
createSECClient(options) Creates a built-in SEC EDGAR client with rate limiting

Formatters

Function Description
formatCurrency(value, options?) Format as USD currency ($1,234,567)
formatLargeNumber(value) Abbreviated format ($1.23B)
formatPercentage(value, decimals?) Signed percentage (+25.50%)

Exported Constants

Export Description
TAG_MAPS All US-GAAP and IFRS tag → field mappings
KEYWORD_SETS Risk, growth, financial, legal, positive, negative word sets

Key Types

Type Description
SECFiling Filing metadata (CIK, form type, dates, URLs)
ParsedFinancialStatement Full parsed financial data with metrics
IncomeStatementData Revenue, expenses, net income, EPS
BalanceSheetData Assets, liabilities, equity breakdown
CashFlowData Operating, investing, financing cash flows
CalculatedMetrics Derived ratios (margins, liquidity, leverage)
ExtractedSection Parsed filing section with text analysis
FilingComparison Filing-to-filing diff result

Supported Form Types

Form Description Parser Text Extractor
10-K Annual report (US domestic)
10-Q Quarterly report
8-K Current report
20-F Annual report (foreign private issuer)
6-K Semi-annual/quarterly (foreign)

XBRL Tag Coverage

The parser maps 100+ US-GAAP tags and 30+ IFRS tags across:

  • Income statement (revenue, expenses, EPS, shares)
  • Balance sheet (assets, liabilities, equity)
  • Cash flow (operating, investing, financing)

See TAG_MAPS for the complete mapping.

SEC Fair Access Policy

This toolkit respects SEC's Fair Access Policy:

  • Built-in rate limiting (default: 4 req/s, configurable)
  • Requires User-Agent header with contact information
  • No authentication required — SEC EDGAR is public domain data

License

MIT — see LICENSE for details.

About Omnifolio

This package is extracted from Omnifolio, a financial intelligence platform that tracks portfolios, SEC filings, Congressional trading, and economic indicators.

We open-source the tools we build. If you find this useful, check out omnifolio.app.