TL;DR
- Polish companies are required to file annual financial statements with the KRS (National Court Register)
- These are publicly accessible at
ekrs.ms.gov.pl- but only through a manual web interface - The portal uses time-based AES encryption where the key rotates every hour based on Warsaw timezone
- I built an eKRS financial statements scraper on Apify that extracts structured financial data (assets, liabilities, revenue, net profit) for $0.03 per company
What Is eKRS and Why Financial Statement Access Matters
eKRS (Elektroniczny Krajowy Rejestr Sadowy) is the electronic portal of Poland's National Court Register, operated by the Ministry of Justice. Since 2018, all Polish companies with a KRS number are required to file their annual financial statements electronically through this portal. These filings include the balance sheet (bilans), profit and loss statement (rachunek zyskow i strat), and supplementary information notes.
This creates one of the largest publicly accessible corporate financial databases in Central Europe. Hundreds of thousands of companies file each year, and all filings are available for public inspection at no charge. The data covers everything from small sp. z o.o. companies with minimal revenue to the largest publicly traded corporations in Poland.
The problem is access. The portal at ekrs.ms.gov.pl was designed for manual, one-at-a-time lookups. There is no download button for structured data, no bulk export, and no public API. If you are building credit risk models, conducting competitive analysis across an industry, or screening hundreds of investment targets - you need this data in a machine-readable format, not buried in a government web application that serves XML and XHTML documents one at a time.
How eKRS Time-Based AES Encryption Works
The eKRS portal is an Angular application hosted on the Ministry of Justice's OpenShift infrastructure. It uses AES-CBC encryption on KRS numbers before sending API requests - but with an unusual twist.
The encryption key changes every hour.
The key is derived from the current date and hour in the Warsaw timezone, formatted as yyyy-MM-dd-HH and padded to 16 characters with null bytes. So at 2:00 PM on April 8, 2026 in Warsaw, the key would be:
2026-04-08-14\x00\x00\x00
At 3:00 PM, the key rotates to:
2026-04-08-15\x00\x00\x00
This means requests made with a key derived from the wrong hour will fail. The scraper handles timezone conversion using Intl.DateTimeFormat with Europe/Warsaw - this is critical for correct key derivation, especially during DST transitions (Poland switches between CET and CEST) and when running in Docker containers set to UTC.
The portal also implements request signing and session management that must be replicated. Each financial statement is stored as either XML (Polish Accounting Standards - PSR), XHTML/iXBRL (International Financial Reporting Standards - IFRS), or occasionally as a PDF scan. The scraper handles all three formats and normalizes them into a unified JSON structure.
eKRS Financial Data: What You Get
The eKRS financial statements scraper parses XML (Polish Accounting Standards) and XHTML/iXBRL (IFRS) financial statements into a unified JSON structure:
| Field | Description |
|---|---|
| krs | KRS number |
| companyName | Legal company name |
| year | Reporting year |
| fileFormat | xml, xhtml, or pdf |
| financials.totalAssets | Total assets (aktywa razem) |
| financials.fixedAssets | Fixed assets (aktywa trwale) |
| financials.currentAssets | Current assets (aktywa obrotowe) |
| financials.cashAndEquivalents | Cash position |
| financials.equity | Equity (kapital wlasny) |
| financials.longTermLiabilities | Long-term debt |
| financials.shortTermLiabilities | Short-term debt |
| financials.revenue | Total revenue (przychody) |
| financials.operatingProfit | Operating profit |
| financials.netProfit | Net profit (zysk netto) |
The actor also returns the raw XML/XHTML source for custom parsing if you need fields beyond the standard set - such as depreciation schedules, tax provisions, or segment-level reporting.
How to Use the eKRS Financial Statements Scraper
JavaScript (Node.js)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
// Search by NIP (tax ID) or KRS number
const run = await client.actor('minute_contest/poland-krs-financial-scraper').call({
nip: '5261040828' // or use krs: '0000019193'
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const statement of items) {
console.log(`${statement.companyName} - ${statement.year}`);
console.log(` Revenue: ${statement.financials?.revenue}`);
console.log(` Net profit: ${statement.financials?.netProfit}`);
console.log(` Total assets: ${statement.financials?.totalAssets}`);
}
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("minute_contest/poland-krs-financial-scraper").call(
run_input={"nip": "5261040828"}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
for stmt in items:
fin = stmt.get("financials", {})
print(f"{stmt['companyName']} - {stmt['year']}")
print(f" Revenue: {fin.get('revenue')}")
print(f" Net profit: {fin.get('netProfit')}")
print(f" Total assets: {fin.get('totalAssets')}")
Real-World Use Case: Supplier Financial Health Screening
Imagine you manage procurement for a manufacturing company with 200 Polish suppliers. Your CFO wants a quarterly report on supplier financial stability - are any of them at risk of insolvency?
Without this scraper, someone on your team would need to visit ekrs.ms.gov.pl 200 times, manually search for each company, download the XHTML or XML file, and then somehow extract the relevant financial figures into a spreadsheet. This takes days of manual work and is error-prone.
With the eKRS financial statements scraper, you pass 200 NIP numbers in a batch. Within minutes, you get structured JSON with total assets, equity, revenue, and net profit for each supplier. Run a simple filter: flag any supplier where equity is negative, where the debt-to-assets ratio exceeds 80%, or where revenue dropped more than 30% year-over-year. You now have an early warning system for supplier risk - built in an afternoon for about $6.
Who Needs eKRS Financial Statement Data
- Credit risk assessment - check company solvency before extending credit or signing contracts
- Competitive intelligence - monitor competitors' revenue and profitability trends across years
- Investment screening - bulk-analyze financial health of acquisition targets in a specific sector
- Supplier due diligence - verify that key suppliers are financially stable before signing long-term contracts
- Portfolio monitoring - track annual financials of companies in your investment portfolio
eKRS Scraper Pricing Comparison
| Method | Cost |
|---|---|
| Manual download from ekrs.ms.gov.pl | Free (one at a time, no structured data) |
| MGBI financial statements API | 200-500 EUR/month subscription |
| This actor | ~$3 per 100 companies |
Free $5 Apify credits on signup = ~190 financial statement extractions at no cost.
FAQ
What financial reporting standards does the scraper support?
The eKRS financial statements scraper handles both Polish Accounting Standards (PSR) filed as XML and International Financial Reporting Standards (IFRS) filed as XHTML/iXBRL. It also handles PDF scans, though structured data extraction from PDFs is limited. The actor normalizes all formats into a single unified JSON schema, so you get the same field names regardless of the source format.
How far back do financial statements go?
The eKRS portal contains financial statements filed since the electronic filing requirement began in 2018. Most companies have 5-7 years of data available. Some larger companies that filed voluntarily before the mandate may have older records. The scraper returns all available years for a given company.
Can I search by NIP instead of KRS number?
Yes. Unlike the KRS board members scraper, the eKRS financial statements scraper accepts both NIP (tax identification number) and KRS number as input. This is convenient because NIP is often easier to find - it appears on invoices, websites, and in most business directories.
Try it: apify.com/minute_contest/poland-krs-financial-scraper
This is part of the Polish Business Data APIs series covering programmatic access to Polish government registries.
Top comments (0)