For hedge funds

Primary-source filings and standardized KPIs —
pushed to your book, not polled for it.

62 regulator sources normalized to one cross-GAAP KPI taxonomy, with a signed webhook that fires the moment a filing lands on your watchlist — no scraper, no PDF parser, no nightly batch to maintain.

pip install openfilings and wire your first handler in an afternoon.

The problem

Cross-market fundamentals shouldn't require a data-eng team

Coverage is fragmented

Your book spans US, EU, Asia, and GCC issuers — each with its own regulator portal, filing format, and disclosure lag. Stitching that together in-house means a scraper per market and a parser per taxonomy.

PDFs don't compute

10-Ks, Yūho, DART, MOPS, and ESEF annual reports all say “revenue” differently. Without normalization, cross-market screens and factor models run on numbers that aren't actually comparable.

Restatements slip through

A KPI pulled once and cached goes stale the moment an issuer amends a filing. Point-in-time correctness matters for backtests and for anything that touches a live position.

What you get

One API, one taxonomy, one signed push

Primary source, not a scrape

Filings are pulled directly from the regulator feed — SEC EDGAR, EDINET, OpenDART, MOPS, ESEF, Companies House, and more across 62 markets — with a link back to the original document on every record.

Standardized, cross-GAAP KPIs

Revenue, margins, EPS, and YoY deltas normalized to one taxonomy across markets and accounting standards — query one line item code instead of parsing every disclosure format yourself.

Signed webhook push

Register a URL once; new filings, press releases, and insider transactions on your watchlist land as an HMAC-signed POST — no polling loop, verifiable with the standard library alone.

Pipeline

Resolve → backfill → subscribe → verify

01

Resolve the universe

search_ticker / entities.search resolves name, ticker, LEI, or ISIN to one canonical issuer — read entity.listings[] before assuming a single market.

02

Backfill the history

get_company_financials pulls a multi-year period series with fiscal_year_from/to and line_items filters in one call — no per-filing loop for a standard KPI backfill.

03

Subscribe to the delta

Create a webhook once (event_types=["filing.discovered"]); every new disclosure on your watchlist arrives signed, in seconds, instead of a nightly poll.

04

Verify and act

verify_webhook() checks the signature with hmac.compare_digest, then GET /api/v1/filings/{id}/kpis / get_filing_section hydrates whatever your signal needs from that one filing_id.

Integration

A signed webhook handler, start to finish

Deliveries are signed with HMAC-SHA256 over the raw request body — verify_webhook() needs nothing beyond the Python standard library.

handler.py · FastAPI

import os
from fastapi import Depends, FastAPI
from openfilings import Client
from openfilings.integrations.fastapi import openfilings_webhook_dependency
from openfilings.webhooks import WebhookEvent

app = FastAPI()
client = Client(api_key=os.environ["OPENFILINGS_API_KEY"])
verify = openfilings_webhook_dependency(os.environ["OPENFILINGS_WEBHOOK_SECRET"])

@app.post("/openfilings-webhook")
async def on_filing(event: WebhookEvent = Depends(verify)) -> dict:
    if event.event == "filing.discovered":
        kpis = client.filings.kpis(event.data["filing_id"])
        # ... run your signal against kpis.canonical ...
        print(event.data["ticker"], kpis.canonical.get("revenue"))
    return {"ok": True}

filing.discovered payload

{
  "event": "filing.discovered",
  "version": "1",
  "timestamp": "2026-08-08T09:14:02.331Z",
  "data": {
    "canonical_key": "sec:0000320193",
    "ticker": "AAPL",
    "market_id": "us",
    "form_type": "10-Q",
    "filing_id": "3f1b7e2a-...",
    "filing_date": "2026-08-08"
  }
}

Live coverage

Live
5,304
Published last 24h
67,251
Companies indexed
3,406,900
Filings indexed

Get access

Tell us about your universe

Paste the tickers or ISINs you cover and what you're building — a data-eng lead will follow up with API access, coverage detail for your markets, and Business plan terms for webhook delivery.

Or email [email protected] directly.

FAQ

Questions quants ask first

What's the difference between OpenFilings and a Bloomberg/FactSet feed?

OpenFilings is a primary-source filings and standardized-KPI layer, not a market-data terminal — no pricing, no consensus estimates. It's built to sit next to your existing data stack for the regulatory-event and fundamentals side: what got filed, when, and what the normalized numbers say.

How fast does a new filing reach the webhook?

Discovery-to-queryable is typically under 60 seconds for RSS/stream-native markets; the webhook fires immediately after persistence, so your handler sees the event before most headline aggregators publish a summary.

Which plan includes webhooks?

Signed webhook delivery is a Business-plan feature (see /pricing). The REST API and Python SDK work on every paid plan; webhooks add the push layer on top of polling.

Do I need the SDK, or can I call the REST API directly?

Either — pip install openfilings wraps the same REST API with typed models, automatic 429 backoff, and a stdlib-only verify_webhook() helper. Every SDK response also exposes .raw / .to_dict() for fields we haven't wrapped yet.

How do standardized KPIs handle different accounting standards?

Each filing's disclosed line items map to a shared taxonomy (GET /api/v1/kpi-taxonomy / client.companies.kpi_taxonomy()) at parse time, so revenue from a US 10-K, a Yūho, and an ESEF annual report are queryable as the same line_items code.

What happens if a filing gets restated or amended?

KPIs are re-derived against the amended filing and the API serves the latest values by default; get_company_financials accepts an as_of parameter when you need the point-in-time value instead.