How to Query the Polish KRS Company Register via API (2026 Guide)
You can query Poland's KRS company register with one REST call: send a company name, a 10-digit KRS number, a NIP or a REGON and get back the legal entity's name, NIP (tax ID), REGON, legal form, PKD activity code, registered address, share capital and registration date as JSON. No court-portal scraping, no captcha. Below is a runnable request, the exact response shape as returned today, and an honest rundown of what is and is not in the data.
By Matías Maquieira, Founder of Prometiam.
What is the KRS?
The KRS (Krajowy Rejestr Sądowy, National Court Register) is Poland's official register of legal entities: limited companies (sp. z o.o.), joint-stock companies (S.A.), partnerships, foundations and associations. It is maintained by the Ministry of Justice and is the authoritative answer to "does this Polish company legally exist, and what are its statutory details". Sole traders are not in the KRS; they live in a separate register, CEIDG.
Query it in one call
You need a key. The free plan is a 14-day trial with 1,000 calls and no card, and a key takes about a minute at prometiam.com/signup. Then search by name:
curl "https://api.prometiam.com/functions/v1/risk-api/companies/search?country=PL&name=ORLEN" \
-H "Authorization: Bearer $PROMETIAM_API_KEY"
Or look a company up directly by its KRS number (10 digits, zero-padded):
curl "https://api.prometiam.com/functions/v1/risk-api/companies/search?country=PL&company_number=0000028860" \
-H "Authorization: Bearer $PROMETIAM_API_KEY"
This is the response, as returned on 9 September 2026:
{
"data": [
{
"id": 28860,
"company_number": "0000028860",
"nip": "7740001454",
"regon": "61018820100000",
"company_name": "ORLEN SPÓŁKA AKCYJNA",
"legal_form": "SPÓŁKA AKCYJNA",
"province": "MAZOWIECKIE",
"city": "PŁOCK",
"address": "CHEMIKÓW 7, 09-411 PŁOCK",
"postal_code": "09-411",
"status": "active",
"capital_amount": 1451177561.25,
"capital_currency": "PLN",
"founding_date": "2001-07-19",
"country": "PL"
}
],
"pagination": { "count": 1, "has_more": false, "next_cursor": null },
"meta": {
"attribution": "Source: Krajowy Rejestr Sądowy (KRS), Ministry of Justice, Poland.",
"coverage_note": "Poland is company-level (KRS active legal entities). Directors, insolvency (KRZ) and beneficial ownership (CRBR) are not yet included; sole traders (CEIDG) are separate."
}
}
Note that the meta block states the scope on every call. The same thing in Python, standard library only:
import os, urllib.parse, urllib.request, json
BASE = "https://api.prometiam.com/functions/v1/risk-api"
HEAD = {"Authorization": f"Bearer {os.environ['PROMETIAM_API_KEY']}"}
def search_krs(name):
qs = urllib.parse.urlencode({"country": "PL", "name": name})
req = urllib.request.Request(f"{BASE}/companies/search?{qs}", headers=HEAD)
with urllib.request.urlopen(req) as r:
return json.load(r)["data"]
for c in search_krs("ORLEN"):
print(c["company_number"], c["nip"], c["company_name"], c["status"])
To pull the full record for one entity, follow up with the detail endpoint using the numeric id:
curl "https://api.prometiam.com/functions/v1/risk-api/companies/28860?country=PL" \
-H "Authorization: Bearer $PROMETIAM_API_KEY"
The detail adds voivodeship, the PKD code in activity_code (19.20.Z for ORLEN), the registered address split into parts, and the dates the record was first and last seen in the register.
What you get back
For every KRS entity the API returns the company-level fields:
- Name, the full registered legal name
-
KRS number (
company_number), the 10-digit court register id - NIP, the tax identification number most KYB checks key on
- REGON, the national statistics number
- Legal form, for example spółka akcyjna or spółka z ograniczoną odpowiedzialnością
- PKD code, Poland's activity classification (the NACE equivalent), on the detail record
- Registered address, city, postal code and voivodeship
- Share capital in PLN
- Registration date and status
The honest caveat, and the API says it on every response: this is company-level data only. Board members, KRZ insolvency proceedings and CRBR beneficial ownership are not exposed yet. If your KYB flow needs the management board or a UBO chain, you still need a supplementary source for that field. Better to know that before you integrate than to discover a null in production.
Monitoring Polish counterparties
Poland is one of the three countries with monitoring. POST /monitor with the company's id subscribes it, and you receive a signed webhook when its status changes, so a dissolution or a name change reaches you without a daily poll.
Why this matters now
The EU's Anti-Money Laundering Regulation applies from 10 July 2027 and harmonises customer due diligence across the Union, including verification of legal entities against official registers. Teams onboarding Polish counterparties today are building the checks they will be audited on then. A programmatic way to confirm that a counterparty exists, is active and matches the NIP on the invoice is the first of those checks, and the one most often still done by hand against the court portal.
How this compares to the alternatives
Scraping the KRS portal. The official portal is built for one-off human lookups. Scraping it means brittle HTML parsing, session handling and rate-limit roulette, and it breaks whenever the markup changes. A typed JSON API removes that maintenance surface.
Free per-entity lookup tools. Fine for a one-off check. They fall down when you need to verify hundreds of counterparties on a schedule, want a stable JSON contract, or need EU data residency for an audit trail. If you only ever check one company a week, a free lookup is the right call; an API earns its keep at volume.
FAQ
Is KRS data free to reuse?
The register is public official data, so the facts themselves are not proprietary. What you pay an API for is delivery: normalised JSON, search, uptime and EU-hosted infrastructure, not a licence on the raw facts.
How do I look up a company by NIP?
Pass it directly: GET /companies/search?country=PL&nip=7740001454 is an exact match, and regon= works the same way (9 or 14 digits). Every response carries the KRS number, the NIP and the REGON, so you can store all three. There is also a free KRS, NIP and REGON lookup on the site that runs the same call without a key.
Does it include directors or beneficial owners?
Not yet. Poland is company-level: name, KRS, NIP, REGON, legal form, PKD, address, capital, dates, status. Board members, KRZ insolvency and CRBR data are planned, not live, so do not build a UBO check on this endpoint today.
How much does it cost?
A free 14-day trial with 1,000 calls and no card. Paid plans are Starter at €9.99 for 10,000 calls, Professional at €29.99 for 100,000 (adds full sanctions screening), Scale at €99.99 for 1,000,000, and Enterprise. Data is EU-resident.
The same country= pattern works across the other registries on the API, Spain, France, the UK, Ireland and Norway, so one integration covers six jurisdictions with one response shape. The deeper walkthrough is the Poland KYB API guide; a free trial key is at prometiam.com/signup.
Top comments (0)