GUS / REGON API by NIP
REST/JSON, no API key
Company data from Poland's REGON register (GUS BIR) by tax ID (NIP), with a single GET that returns clean JSON. No API key, no sign-up, no daily request limit. It is a layer over the GUS BIR service (SOAP) that handles the login, sessions and XML for you.
One GET, one JSON
The endpoint is public, the method is GET, and the ?format=json parameter returns machine-readable data (without it you get an HTML page for humans):
curl "https://skanfirmy.pl/regon/5260250995?format=json"
You get the official name, REGON number, registered address and legal form (for natural persons and civil partnerships, since 27 Sep 2026, only the name, form, town and activity status — details below), straight from the REGON register kept by Statistics Poland (GUS):
{
"nip": "5260250995",
"source": "regon-gus",
"regon": "012100784",
"dane": {
"regon": "012100784",
"nip": "5260250995",
"nazwa": "ORANGE POLSKA SPÓŁKA AKCYJNA",
"wojewodztwo": "MAZOWIECKIE",
"powiat": "Warszawa",
"gmina": "Ochota",
"miejscowosc": "Warszawa",
"kodPocztowy": "02-326",
"ulica": "Aleje Jerozolimskie",
"nrNieruchomosci": "160",
"typ": "P",
"dataZakonczenia": ""
},
"privacy": null,
"checkedAt": "2026-08-23"
}
No API key, no sign-up, no daily limit
The endpoint works right away: no account to create, no API key to generate, no daily request limit to watch. The only restriction protects the service from abuse: at most 20 requests per 10 seconds from one IP address (above that, HTTP 429 for 10 seconds; since 25 Sep 2026). That is a deliberate difference from commercial GUS wrappers: the goal is an integration you can wire up in a minute, including from an AI agent. The service is free of charge and meant for single lookups triggered by users or their agents, not for bulk data harvesting.
Instead of GUS BIR SOAP
The official Statistics Poland service is BIR 1.1: SOAP with a Zaloguj → DaneSzukajPodmioty → Wyloguj sequence, a session id in a header, XML envelopes and MTOM responses. It works, but wiring it up can take an afternoon. Our endpoint runs that whole sequence server-side and returns ready JSON, so on your side it stays a single GET.
What /regon/{nip} returns:
| Field | Meaning |
|---|---|
regon | The entity's REGON number (except for natural persons and civil partnerships) |
nazwa | Official name from the REGON register |
wojewodztwo, powiat, gmina, miejscowosc, kodPocztowy, ulica, nrNieruchomosci, nrLokalu | Registered address (for legal persons). For natural persons (type F, LF) and civil partnerships, since 27 Sep 2026 only miejscowosc |
typ | GUS literal: P — legal person, F — natural person (incl. sole proprietors), LP/LF — local units |
dataZakonczenia | Date business ceased (empty if the entity is active) |
forma, status | Natural persons and civil partnerships only (since 27 Sep 2026, instead of REGON, address and dates): form (osoba fizyczna, jednostka lokalna osoby fizycznej, spółka cywilna) and activity status (active or ended) |
privacy | Since 26 Sep 2026, next to the dane field: for types F and LF and for civil partnerships, what was left out (hidden), why (reason) and where the full entry is (officialSource — the GUS REGON search); null for the others |
For sole proprietors (natural persons, types F and LF) and civil partnerships (GUS files them as type P, so we recognise them by name: "S.C." or "spółka cywilna" as the last legal-form marker), since 27 Sep 2026 dane contains only the tax ID, name, type, form (forma), town and activity status (status: active or ended) — no REGON number, address, municipality, county, voivodeship or dates (GDPR data minimisation; since 26 Sep 2026 no street, number or postal code). GUS publishes the REGON number and the full entry in the REGON search. Such responses carry the X-Robots-Tag: noindex and Cache-Control: private, max-age=3600 headers. The MCP tool sprawdz_regon works the same way, and /firma-po-regon/{regon} returns no data at all for a natural person's REGON (that would identify a person from the number alone) — only a referral to the GUS search.
In Python
With the requests library it is a few lines:
import requests
def regon_data(nip: str) -> dict:
r = requests.get(f"https://skanfirmy.pl/regon/{nip}?format=json", timeout=10)
r.raise_for_status()
return r.json()["dane"]
d = regon_data("5260250995")
print(d["nazwa"], "· REGON", d["regon"])
# ORANGE POLSKA SPÓŁKA AKCYJNA · REGON 012100784
An entity that is not in the register returns 404, and a NIP with an invalid checksum returns 400. It is worth handling both instead of assuming every NIP has an entry.
In JavaScript
const r = await fetch("https://skanfirmy.pl/regon/5260250995?format=json");
if (r.ok) {
const { dane } = await r.json();
console.log(dane.nazwa, dane.regon);
}
In PHP
$ch = curl_init("https://skanfirmy.pl/regon/5260250995?format=json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$dane = json_decode(curl_exec($ch), true)["dane"];
echo $dane["nazwa"] . " · REGON " . $dane["regon"];
More than REGON, from one NIP
If, besides GUS data, you need VAT status and a KRS entry, use /nip/{nip}?format=json: it combines the VAT register (White List, Ministry of Finance), KRS and the REGON number (except for natural persons) in one response. The other endpoints (all GET → JSON, no key):
/regon/{nip}— data from the REGON register (GUS)/nip/{nip}— VAT status + White List + KRS + REGON (except for natural persons)/nips/{list}— several NIPs at once (comma-separated)/vies/{country}/{number}— EU VAT number validation (VIES, European Commission)
For AI agents, at https://skanfirmy.pl/mcp there is a Model Context Protocol (MCP) server with a sprawdz_regon tool (and several others for NIP, KRS and VIES), also with no key. A model-readable map of the endpoints is in llms.txt, and the full machine spec is in OpenAPI 3.1. For a lookup in the UI, use the REGON (GUS) tool.
The public endpoint vs a typical paid GUS API
Most commercial REST wrappers over the GUS register run on a freemium model — an account, an API key and a daily request limit on the free tier. This endpoint is public and free. The differences in short:
| Typical paid GUS API | skanfirmy.pl /regon | |
|---|---|---|
| API key | required | not needed |
| Registration / account | yes | no |
| Free-tier limit | usually yes | 20 requests per 10 s per IP, no daily quota |
| Response format | REST/JSON | REST/JSON |
| MCP server for AI agents | usually none | yes |
| Scope | usually GUS/REGON data only | REGON + VAT White List, KRS, VIES (separate endpoints) |
| Model | freemium / subscription | free |
This is not the official GUS API — the data comes from the same source (the REGON register, BIR service), just exposed with a single GET request.
Where the data comes from, and what this is not
The data comes straight from the REGON register kept by Statistics Poland (GUS) (the BIR service). This is an independent tool; it is not the official GUS API and is not affiliated with it — it only exposes GUS data in a more convenient form. The scope and freshness of the data match the GUS register.
Frequently asked questions
Do I need an API key or to sign up?
No. The /regon/{nip} endpoint is public — it returns JSON once you add ?format=json, with no API key, no account and no daily request limit.
How is this different from the GUS BIR (SOAP) service?
The official GUS BIR 1.1 service is SOAP with login, a session, XML envelopes and MTOM responses. Our endpoint runs that sequence server-side and returns ready JSON, so on your side it stays a single GET request.
How do I get Polish company data from GUS by NIP in JSON?
Send a GET to https://skanfirmy.pl/regon/{NIP}?format=json. The response contains the name, REGON number, registered address and legal form of the entity from the REGON register; for natural persons and civil partnerships, since 27 Sep 2026, only the name, form, town and activity status (GDPR).
Does it work for sole proprietors?
Yes, in a limited scope. For natural persons running a business (types F and LF) and civil partnerships, since 27 Sep 2026 we return only the tax ID, name, form, town and activity status (active or ended) — no REGON number, address or dates (GDPR). The REGON number of such a business is in the GUS REGON search.
Is it free to use?
Yes. The endpoint is free and requires no registration. The data comes straight from the REGON register kept by Statistics Poland (GUS).