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.
For hedge funds
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
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.
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.
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
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.
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.
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
01
search_ticker / entities.search resolves name, ticker, LEI, or ISIN to one canonical issuer — read entity.listings[] before assuming a single market.
02
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
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_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
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
Get access
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.
FAQ
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.
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.
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.
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.
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.
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.